2006-08-22 05:05 AM
2011-05-17 12:31 AM
hi all !
i would like to know how to implement a 16bit counter with the st libraries. in fact, in functions, there's no timer mode as counter possible (just compare, pwm, etc, see 91x_tim.h ) ?? Have you any example ? thx Regards2011-05-17 12:31 AM
hi,
I made the timer counter in this way: I omit the SCU init for thi peripheral... ... TIM_StructInit(&TIM_InitStructure); TIM_InitStructure.TIM_Mode = TIM_PWM; TIM_InitStructure.TIM_OC1_Modes = TIM_TIMING; TIM_InitStructure.TIM_Clock_Source = TIM_CLK_APB; TIM_InitStructure.TIM_Prescaler = 0x00; TIM_InitStructure.TIM_Pulse_Length_1 = 0x0030; TIM_InitStructure.TIM_Full_Period = 0x8000; /* Initialize the Timer 2 */ TIM_Init(TIM3, &TIM_InitStructure); /* Enable the Timer Overflow interrupt */ TIM_ITConfig(TIM3, TIM_IT_OC2, ENABLE); /* Enable and configure the priority of the USB_LP IRQ Channel*/ VIC_Config(TIM3_ITLine, VIC_IRQ, 0); VIC_ITCmd(TIM3_ITLine, ENABLE); .... // irq handler void Timer3_irq() { .. your code .. /*Clear the TIM OC1 flag */ TIM_ClearFlag(TIM3, TIM_FLAG_OC2); } #define TIMER_TICKS(nsec) ( ((PERIPHERAL_CLOCK / 1000000) * nsec) / 1000 ) // to set the timer period in ticks inline void SetTimerPeriod(u32 per) { static unsigned int old_per=0; if (old_per == per) { return; } old_per = per; s_u32 *p = (s_u32*)&per; if (p->h) { TIM_PrescalerConfig(TIM3, p->h & 0x00FF); per /= p->h + 1; } else { TIM_PrescalerConfig(TIM3, p->h & 0x00FF); } TIM_SetPulse(TIM3, TIM_OC2_Channel, per); }2011-05-17 12:31 AM
that's works well !! Thanx stevejamal :D
I have a little problem :when I want to change TIM_CLK_APB in order to increase my frequecy of timer, the timer is blocked (no interruptions) ? (with oscillator of 25mhz). Can't go over 32khz ! ! So,What Is the a limitation in frequency for timers?2011-05-17 12:31 AM
I don't understand exactly what are you doing, sorry :)
For what I read in the ref. manual you can chose from an external clock or a Peripheral clock divided by prescaler.. Check the setting of APBDIV in the SCU_CLKCTRL. I'm working with a Peripheral clock of 96MHz... theoretically you can work with a tick of 1usec or less. Unfortunately the irq routine require a certain time to be served ;)