STM32 定时器(一)——定时器时间的计算
2010-08-20 11:35
STM32的定时器是灰常 NB 的,也是灰常让人头晕的(当然是对于白菜来说的)。
STM32中的定时器有很多用法:
(一)系统时钟(SysTick)
设置非常简单,以下是产生1ms 中断的设置,和产生10ms 延时的函数:
void RCC_Configuration(void)
{
RCC_ClocksTypeDef RCC_ClockFreq;
SystemInit();//源自 system_stm32f10x.c 文件,只需要调用此函数,则可完成 RCC 的配置.
RCC_GetClocksFreq(&RCC_ClockFreq);
//SYSTICK 分频--1ms 的系统时钟中断
if (SysTick_Config(SystemFrequency / 1000))
{
while (1); // Capture error
}
}
void SysTick_Handler(void)//在中断处理函数中的程序
{
while(tim)
{
tim--;
}
}
//调用程序:
Delay_Ms(10);
当然,前提是要设置好,变量 tim 要设置成 volatile 类型的。
(二)第二种涉及到定时器计数时间(TIMx)
/*TIM3时钟配置*/
TIM_TimeBaseStructure.TIM_Prescaler = 2; //预分频(时钟分频)72M/(2+1)=24M
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
TIM_TimeBaseStructure.TIM_Period = 65535; //装载值18k/144=125hz
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
定时时间计算:
TIM_TimeBaseStructure.TIM_Prescaler = 2;
//分频2 72M/(2+1)/2=24MHz
TIM_TimeBaseStructure.TIM_Period = 65535; //计数值65535
((1+TIM_Prescaler )/72M)*(1+TIM_Period )=((1+2)/72M)*(1+65535)=0.00273秒=366.2Hz */
注意两点(来自大虾网,未经检验)
(1)TIMx(1-8),在库设置默认的情况下,都是72M 的时钟;
(2)TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
是重复计数,就是重复溢出多少次才给你来一个溢出中断,