Hello
I have problem to set up the DMTimer1_1ms on a AM3359.
I would like to have every 1ms an Interrupt.
The Registers a set like:
TISTAT 0x00000001
TIER 0x00000007
TCLR 0x00000003
TLDR 0xFFFFFFE0
TSICR 0x00000004
At the emulator I could see that the Register TCRR change its value.
My code is:
void init_timer1_1ms(void) { unsigned int regVal; // init clock HWREG(SOC_CM_DPLL_REGS + CM_DPLL_CLKSEL_TIMER1MS_CLK) &= ~(CM_DPLL_CLKSEL_TIMER1MS_CLK_CLKSEL); while((HWREG(SOC_CM_DPLL_REGS + CM_DPLL_CLKSEL_TIMER1MS_CLK) & CM_DPLL_CLKSEL_TIMER1MS_CLK_CLKSEL) != 0x0); 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) & CM_DPLL_CLKSEL_TIMER1MS_CLK_CLKSEL) != CM_DPLL_CLKSEL_TIMER1MS_CLK_CLKSEL_SEL5); HWREG(SOC_CM_WKUP_REGS + CM_WKUP_TIMER1_CLKCTRL) |= CM_WKUP_TIMER1_CLKCTRL_MODULEMODE_ENABLE; while((HWREG(SOC_CM_WKUP_REGS + CM_WKUP_TIMER1_CLKCTRL) & CM_WKUP_TIMER1_CLKCTRL_MODULEMODE) != CM_WKUP_TIMER1_CLKCTRL_MODULEMODE_ENABLE); while((HWREG(SOC_CM_WKUP_REGS + CM_WKUP_TIMER1_CLKCTRL) & CM_WKUP_TIMER1_CLKCTRL_IDLEST) != CM_WKUP_TIMER1_CLKCTRL_IDLEST_FUNC); // 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) = 232000; HWREG(SOC_DMTIMER_1_REGS + DMTIMER_1MS_TNIR) = -768000; HWREG(SOC_DMTIMER_1_REGS + DMTIMER_1MS_TLDR) = 0xFFFFFFE0; // Enable interrupt HWREG(SOC_DMTIMER_1_REGS + DMTIMER_1MS_TIER) |= (DMTIMER_1MS_TIER_TCAR_IT_ENA & (DMTIMER_1MS_TIER_TCAR_IT_ENA_ENB_CAPT << DMTIMER_1MS_TIER_TCAR_IT_ENA_SHIFT)) |(DMTIMER_1MS_TIER_MAT_IT_ENA & (DMTIMER_1MS_TIER_MAT_IT_ENA_ENB_MATCH << DMTIMER_1MS_TIER_MAT_IT_ENA_SHIFT)) |(DMTIMER_1MS_TIER_OVF_IT_ENA & (DMTIMER_1MS_TIER_OVF_IT_ENA_ENB_OVF << DMTIMER_1MS_TIER_OVF_IT_ENA_SHIFT)); // Enable interrupt // 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); ms_time_tick = 0; 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); // 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; } static void ISR_timer1_1ms(void) { ms_time_tick++; } at main init IntAINTCInit(); IntMasterIRQEnable();
Were is my problem?
I would be helpful to have the Register values of an working example off a 1ms timer.
regards Tobias