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