Hello
I have used the DMTimer1 as 1ms timer.
At the emulator it work, but if I compile a release version and try to boot at the Beaglebone Black it don't start.
My code is:
void init_timer1_1ms(void) { unsigned int regVal HWREG(SOC_CM_DPLL_REGS + CM_DPLL_CLKSEL_TIMER1MS_CLK) &= ~(CM_DPLL_CLKSEL_TIMER1MS_CLK_CLKSEL); // reset the clock while((HWREG(SOC_CM_DPLL_REGS + CM_DPLL_CLKSEL_TIMER1MS_CLK) & CM_DPLL_CLKSEL_TIMER1MS_CLK_CLKSEL) != 0x0); // wait for clock reset HWREG(SOC_CM_DPLL_REGS + CM_DPLL_CLKSEL_TIMER1MS_CLK) = CM_DPLL_CLKSEL_TIMER1MS_CLK_CLKSEL_SEL5; // set to external 32KHz clock while((HWREG(SOC_CM_DPLL_REGS + CM_DPLL_CLKSEL_TIMER1MS_CLK) HWREG(SOC_CM_WKUP_REGS + CM_WKUP_TIMER1_CLKCTRL) |= CM_WKUP_TIMER1_CLKCTRL_MODULEMODE_ENABLE; // enable Timer1 module while((HWREG(SOC_CM_WKUP_REGS + CM_WKUP_TIMER1_CLKCTRL) & CM_WKUP_TIMER1_CLKCTRL_MODULEMODE) != CM_WKUP_TIMER1_CLKCTRL_MODULEMODE_ENABLE); // wait for enabling ConsoleUtilsPrintf("**** step 7 *****\n"); ConsoleUtilsPrintf("SOC_CM_WKUP_REGS + CM_WKUP_TIMER1_CLKCTRL: %d\n", (HWREG(SOC_CM_WKUP_REGS + CM_WKUP_TIMER1_CLKCTRL))); count = 0xFFFFFFFF; while((HWREG(SOC_CM_WKUP_REGS + CM_WKUP_TIMER1_CLKCTRL) & CM_WKUP_TIMER1_CLKCTRL_IDLEST) != CM_WKUP_TIMER1_CLKCTRL_IDLEST_FUNC); // wait for timer coming to its fully functionality // init interrupt IntSystemEnable(SYS_INT_TINT1_1MS); IntPrioritySet(SYS_INT_TINT1_1MS, 0, AINTC_HOSTINT_ROUTE_IRQ); IntRegister(SYS_INT_TINT1_1MS, ISR_timer1_1ms); //int tick variable ms_time_tick = 0; // init timer mode and registers // from spruh73i.pdf Datasheet page 4129 // for 1 ms tick with a 32768-Hz clock: // TPIR = 232000 // TNIR = -768000 // TLDR = 0xFFFFFFE0 HWREG(SOC_DMTIMER_1_REGS + DMTIMER_1MS_TPIR) = 0x00038A40; //232000; HWREG(SOC_DMTIMER_1_REGS + DMTIMER_1MS_TNIR) = 0xFFF44800; //-768000; HWREG(SOC_DMTIMER_1_REGS + DMTIMER_1MS_TLDR) = 0xFFFFFFE0; HWREG(SOC_DMTIMER_1_REGS + DMTIMER_1MS_TIER) |= (DMTIMER_1MS_TIER_OVF_IT_ENA & (DMTIMER_1MS_TIER_OVF_IT_ENA_ENB_OVF << DMTIMER_1MS_TIER_OVF_IT_ENA_SHIFT)); // Enable interrupt at timer level HWREG(SOC_DMTIMER_1_REGS + DMTIMER_1MS_TCRR) = 0xFFFFFFE0; //set start value of timer regVal = HWREG(SOC_DMTIMER_1_REGS + DMTIMER_1MS_TCLR); regVal |= DMTIMER_1MS_TCLR_AR & (DMTIMER_1MS_TCLR_AR_AUTO_REL << DMTIMER_1MS_TCLR_AR_SHIFT); //set auto reload regVal |= DMTIMER_1MS_TCLR_ST & (DMTIMER_1MS_TCLR_ST_CNT_START << DMTIMER_1MS_TCLR_ST_SHIFT); // start timer HWREG(SOC_DMTIMER_1_REGS + DMTIMER_1MS_TCLR) = regVal; // start timer }
My code stops at ConsoleUtilsPrintf
I get 0x30002 for the value of the CM_WKUP_TIMER1_CLKCTRL register.
Why do that work at the emulator and not at a real app.
regards Tobias