Select CLK_M_OSC as source for DMTimer (instead of 32 kHz clock)

Hi,

I’m trying to set up a fast timer interrupt using CLK_M_OSC as clock source for DMTimer2. For initialising this I’m calling DMTimer2ModuleClkConfig() from Starterware code which itself seems to select CLK_M_OSC as source for the timer clock using following code:

/* Select the clock source for the Timer2 instance. */
HWREG(SOC_CM_DPLL_REGS + CM_DPLL_CLKSEL_TIMER2_CLK) &=
~(CM_DPLL_CLKSEL_TIMER2_CLK_CLKSEL);

HWREG(SOC_CM_DPLL_REGS + CM_DPLL_CLKSEL_TIMER2_CLK) |=
CM_DPLL_CLKSEL_TIMER2_CLK_CLKSEL_CLK_M_OSC;

while((HWREG(SOC_CM_DPLL_REGS + CM_DPLL_CLKSEL_TIMER2_CLK) &
CM_DPLL_CLKSEL_TIMER2_CLK_CLKSEL) !=
CM_DPLL_CLKSEL_TIMER2_CLK_CLKSEL_CLK_M_OSC);

As fas as I understand there CLK_M_OSC is choosen.

Nevertheless the frequency/calling speed of my ISR tells me I’m still at 32 kHz clock, so CLK_M_OSC does not seem to be used. My whole initialisation code looks like this (and mainly comes from the Starterware examples):

DMTimerModeConfigure(SOC_DMTIMER_2_REGS, DMTIMER_AUTORLD_NOCMP_ENABLE);
DMTimerCounterSet(SOC_DMTIMER_2_REGS, 0xFFFFFFF9u);
DMTimerReloadSet(SOC_DMTIMER_2_REGS, 0xFFFFFFF9u);

DMTimer2ModuleClkConfig(); → here CLK_M_OSC should be chosen…

IntAINTCInit();

IntRegister(SYS_INT_TINT2, isr_xy2_100);
IntPrioritySet(SYS_INT_TINT2, 0, AINTC_HOSTINT_ROUTE_IRQ);
IntSystemEnable(SYS_INT_TINT2);
IntMasterIRQEnable();

So…what could be wrong? Why isn’t the fast clock source used?

Thanks!

Did you Read the TRM and manually check the relavent register values including any mux register values

The Starterware initialisation function already reads back the flag
for CLK_M_OSC, so that should fit. Multiplexing is not necessary for
DMTimer 2 and 3, so I don't know what to set/check here.

What is TRM?

OK, it seems my counter/prescaler settings for initial and reload
count value are ignored or used for first shot only, so it seems
something is wrong in my initialisation code:

DMTimer2ModuleClkConfig();
IntMasterIRQEnable();
IntAINTCInit();
IntRegister(SYS_INT_TINT2, isr_func);
IntPrioritySet(SYS_INT_TINT2, 0, AINTC_HOSTINT_ROUTE_IRQ);
IntSystemEnable(SYS_INT_TINT2);

/* Load the counter with the initial count value */
DMTimerCounterSet(SOC_DMTIMER_2_REGS,0xFFFFFFF9);
/* Load the load register with the reload count value */
DMTimerReloadSet(SOC_DMTIMER_2_REGS, 0xFFFFFFF9);
/* Configure the DMTimer for Auto-reload and overflow mode */
DMTimerModeConfigure(SOC_DMTIMER_2_REGS, DMTIMER_AUTORLD_NOCMP_ENABLE);

DMTimerIntEnable(SOC_DMTIMER_2_REGS, DMTIMER_INT_OVF_EN_FLAG);
DMTimerEnable(SOC_DMTIMER_2_REGS);

And the ISR:

static void isr_func()
{
   static int clockCtr=0;
   static int ledCtr=0;

   // DMTimerIntDisable(SOC_DMTIMER_2_REGS, DMTIMER_INT_OVF_EN_FLAG);
   // DMTimerIntStatusClear(SOC_DMTIMER_2_REGS, DMTIMER_INT_OVF_IT_FLAG);

   ledCtr++;
   clockCtr++;

   // some code here...

   /* Re-enable the DMTimer interrupt */
   // DMTimerIntEnable(SOC_DMTIMER_2_REGS, DMTIMER_INT_OVF_EN_FLAG);
}

clock divisor settings do you know how the oscillators work that feed the timer? its in TRM

If that was you who posted asking what the address of RAM was this is all in the TRM the technical reference manual

Dont know your background but if you do embedded software on complex SOC you will need to reed the Sitara tech reference manual (TRM)and look at the bit defs of each register for everything affected like clock dividers ete etc it sound like you took the refence code and are now asking why it doesnt work. Did it ever occurr that one bit in one register is nor correct or you found a limitation to the function you called. Are you thinking we have time to check all this for you?

Keep in mind the more data you have to prove the code REALLY DOES NOT work. the more likely the E2E forum will verify it does not work they support starterware. One mistake I made on here was not understanding open source people dont like proprietary things like Code Composer did you notice this group focus is linux debugging by printfs and inspection or more application that run under a stable enviroment ie linux

You can find help here for more linux related issues but expecting someone to debug this starterware code on here… try posting in the E2E forum as well and expect to have evidence the register values are correct if you show you have not read the data sheet and dont know whats involved NO ONE will help

Good luck

A mailing list is for asking questions. When you are not willing to
help simply don't answer such questions. And when you are in a bad
mood please go outside and run around your house until you feel better
- but don't blame people for asking things!

And...please never again answer to any of my questions, I really don't
need this kind of "help".