STM32定时器
种类
有高级定时器TIM1和TIM8,通用定时器TIM2~5,基本定时器TIM6、7
对于F1系列,都是16位。高级和通用有4个捕获通道,基本定时器没有捕获通道。高级定时器可以互补输出
通用定时器
位于APB1总线上
通用定时器使用方法
定时器时钟使能
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//定时器时钟使能
定时器初始化
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_Period=arr;//16位的预装载值
TIM_TimeBaseInitStructure.TIM_Prescaler=psc;//16位的预分频系数
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up//向上计数模式;
//TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; //时钟分割,可以不用
TIM_TimeBaseInit(TIM3,&Tim_TimeBaseInitStructure);
使能中断
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//哪个定时器,哪种中断(定时器3,更新中断)
关于中断类型参考
中断优先级设置,记得要在执行下面这些代码前先设置主优先级分组NVIC_PriorityGroupConfig()
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
使能定时器
TIM_Cmd(TIM3,ENABLE);
通用定时器中断服务函数
void TIM3_IRQHandler(void){
if (TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET){//判断是不是定时器3更新中断来了
LED=!LED;//操作
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);//手动清除定时器3的更新中断标志位
}
}
溢出时间Tout=(ARR+1)(PSC+1)/Tclk 其中ARR和PSC都是16位的
Tout:TIM3 溢出时间(单位为 us)
Tclk:TIM3 的输入时钟频率(单位为 Mhz)
Tclk/(psc+1):计数器的时钟频率