1.通用定时器工作过程:
2.时钟选择
计数器时钟可以由下列时钟源提供:
(1)内部时钟(CK_INT);
(2)外部时钟模式1:外部输入脚(TIx);
(3)外部时钟模式2:外部触发输入(ETR)(仅适用TIM2,3,4)
(4)内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器。
内部时钟选择:
计数器模式:通用计数器可以向上计数、向下计数、向上向下双向计数模式。
定时器配置步骤如下:
(1)TIM3时钟使能;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
(2)初始化定时器参数,设置自动重装值,分频系数,计数方式等;
void TIM_TimeBaseInit(TIM_TypeDef *TIMx,TIM_TimeBaseInitTypeDef *TIM_TimeBaseInitStruct);
(3)设置TIM3_DIER允许更新中断;
void TIM_ITConfig(TIM_TypeDef *TIMx,uint16_t TIM_IT,FunctionalState NewState);
(4)中断优先级设置;
void NVIC_Init(NVIC_InitTypeDef *NVIC_InitStruct);
(5)允许TIM3工作,也就是使能TIM3;
void TIM_Cmd(TIM_TypeDef *TIMx,FunctionalState NewState);
(6)编写中断服务函数;
溢出时间计算:
Tclk:TIM3的输入时钟频率(单位为Mhz);
Tout:TIM3的溢出时间(单位为us);
time.c
//通用定时器3中断初始化
//arr:自动重装值;psc:时钟预分频系数
void TIM3_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); //使能TIM3时钟;
TIM_TimeInitStructure.TIM_Period=arr; //自动重装载值;
TIM_TimeInitStructure.TIM_Prescaler=psc; //定时器分频;
TIM_TimeInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数模式;
TIM_TimeInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM3,&TIM_TimeInitStructure); //初始化定时器3;
TIM_ITConfig(TIM3,TIM_IT_Update,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); //初始化NVIC;
TIM_Cmd(TIM3,ENABLE); //使能定时器3;
}
编写中断服务函数
TIMx_IRQHandler(); //中断函数要看中断标志位,和手动清楚中断标志位;
ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx,uint16_t TIM_IT);
void TIM_ClearITPendingBit(TIM_TypeDef* TIMx,uint16_t TIM_IT);