STM32定时器计时
最近用STM32标准库做了个定时器计时的方法,挺简单的,分享给大家,若有不足之处请多多指教。
MCU:STM32F407VG
IDE: Keil5
1.配置定时器初始化,我使用的是TIM3,配置中断
note:①TIM_TimeBaseInitStructure.TIM_Period = arr; 此处参数若为1000-1就是0.1秒进入一次中断,10000-1就是1秒
②`TIM_TimeBaseInitStructure.TIM_Prescaler=8400-1; ``定时器分频根据芯片来定,可以搜索一下,你能懂的。
```void TIM3_Int_Init(u16 arr)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); //使能TIM3时钟
TIM_TimeBaseInitStructure.TIM_Period = arr; //自动重装载值
TIM_TimeBaseInitStructure.TIM_Prescaler=8400-1; //定时器分频
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
//TIM_TimeBaseInitStructure.TIM_RepetitionCounter=5;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);//初始化TIM3
TIM_ClearFlag(TIM3,TIM_FLAG_Update);
TIM_ITConfig(TIM3,TIM_IT_Update|TIM_IT_Trigger,ENABLE); //允许定时器3更新中断
TIM_Cmd(TIM3,ENABLE); //使能定时器3
NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn; //定时器3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01; //抢占优先级1
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
2.编写定时器中断处理函数
int count=0; //中断计数
int timer_count=0;//定时器计时
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET) //溢出中断
{
count++; //每中断一次计数+1
if(count==10)
{
timer_count++;//当计数=10给另一个变量+1
count=0; //将中断计数变量清零
} //若是0.1秒中断一次,那此时timer_count为1秒了
}
TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //清除中断标志位
}
3.写一个函数封装定时的功能
void Timer_Count(u8 second) //参数为你要定时的时间
{
if(timer_count==second)
{
LED_TOGGLE_PD;//在其他文件宏定义了一个LED灯翻转功能
timer_count=0;//计时清零
}
}
然后在主函数调用void Timer_Count(u8 second) ;就可以实现定时了。