2、通用定时器是在基本定时器的基础上扩展而来,增加了输入捕获与输出比较等功能通用定时器主要由计数部分、触发控制器、捕获/比较模块组成。
计数部分的核心是计数器,受预分频器输出的信号(CK_CNT)驱动,实现向上、向下、对齐模式的自动装载计数。
预分频器输入由触发控制器控制,可选内部时钟、外部触发输入、内部触发接口、外部输入,这是实现各种从模式的关键部分。
捕获/比较模块是实现通用定时器各种输入输出的功能部分,主要分为输入部分、输出部分和模式控制部分。
通用定时器的时钟源有四种:
内部时钟(CK_INT):挂在APB1总线上(36M),为最常用的时钟,一般经2分频后为72M;
外部触发输入(ETR),可对外部引脚ETR的上升/下降沿数进行计数。(外部时钟模式2)
内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器,如可以配置一个定时器Timer1而作为另一个定时器Timer2的预分频器。
计数模式
向上模式:计数器(CNT)从0计到ARR,产生溢出事件;
向下模式:计数器(CNT)从ARR计到0,产生下溢事件;
对齐模式:计数器(CNT)从0计到ARR-1,产生溢出事件;再从ARR计到1,产生下溢事件。
4、通用定时器的功能
(1)使能定时器时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//使能TIM4时钟
voidTIM_TimeBaseInit(TIM_TypeDef*TIMx,TIM_TimeBaseInitTypeDef*TIM_TimeBaseInitStruct);
typedef struct
{
uint16_tTIM_Prescaler; //定时器预分频器(0至65535;16位)
uint16_t TIM_CounterMode; //计数模式(向上、向下、对齐)
uint32_t TIM_Period; //定时器周期
uint16_t TIM_ClockDivision; //时钟分频
uint8_t TIM_RepetitionCounter; //重复计数器(只针对高级定时器)
(4)设置定时器中断优先级,使能定时器中断通道
NVIC初始化库函数是NVIC_Init();
(5)开启定时器
void TIM_Cmd(TIM_TypeDef* TIMx,FunctionalState NewState);
(6)编写定时器中断服务函数
TIM4_IRQHandler //通过启动文件查找
ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx,uint16_t TIM_IT);
if(TIM_GetITStatus(TIMx,TIM_IT_Update))
{
...//执行TIMx更新中断内控制
}
其中TIM_GetFlagStatus和TIM_ClearFlag这两个函数是用来读取状态标志位以及清除中断标志位,可以通过固件库查找。