一、文章目的
记录自己从学习了定时器理论->代码实现使用定时->查询数据手册,加深了对定时器的理解以及该过程遇到了的一些不清楚的知识。
-
上图为参考手册里通用定时器框图,关于定时器各种情况的工作都在上面了,在理论学习和实际应用后再来看这张图会觉得豁然开朗。
-
定时器基本的单元为16位自动装载寄存器ARR,16位预分频器PSC,计数器CNT,另外有4个独立通道,在我看来只有两种大功能:
–输入捕获
(如测输入信号频率、占空比、编码器)
–输出比较
(如输出PWM波控制电机、舵机)
根据这两种功能可以将定时器配置为不同模式
,比如输出pwm的PWM模式、读取编码器的Encoder模式。
二、定时器时钟来源选择(极为重要)
● 内部时钟(CK_INT)
● 内部触发输入(ITRx)
:使用一个定时器作为另一个定时器的预分频器
● 外部时钟模式1
:外部输入脚(TIx) ,4个独立通道的输入
● 外部时钟模式2
:外部触发输入(ETR) ,模式1和模式2看上去非常相似
清楚定时器的时钟来源,后续才能理解定时器的各种模式
三、 理解最基本的定时
在时钟的驱动下,计数器CNT
递增+1(默认向上计数),当到达自动重装载寄存器ARR
中的目标值时,溢出清零,产生中断,循环这个过程。
HAL库实现基本定时
- 1、打开并设置基本定时器
-
- 选择为内部时钟,即内部时钟模式
-
- 设置以下参数:定时器的时钟频率
fc=f /(PSC+1)/(ARR+1)
,f为单片机时钟来源。
- 设置以下参数:定时器的时钟频率
-
预分频器Prescaler PSC
-
自动重装寄存器CouterPeriod ARR
-
输入滤波器的频率分频InternalClockDivision(一般不需要)
-
- 2、打开中断
- 3、main函数中初始化TIM2
HAL_TIM_Base_Start_IT(&htim2);
4、驱动函数中找回调函数然后在main.c中重写
__weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim); //原型
//重写
uint16_t hhRetCount=0;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
if(htim==&htim2){
hhRetCount+=1;
}
}