Other Parts Discussed in Thread: AM3359, CLOCKTREETOOL, OMAP3530
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