软件定时原理
使用纯软件(CPU死等)的方式实现定时(延时)功能。
- 不精准:函数调用压栈进栈需要耗费额外的时间;流水线使得程序执行时间不确定。
- CPU死等。
定时器定时原理
使用精准的时基,通过硬件的方式,实现定时功能。
定时器核心就是计数器。
STM32定时器分类
计数器位数16位,可以记0~65535个数。
STM32基本、通用、高级定时器功能整体的区别
基本定时器
基本定时器:TIM6/TIM7
16位递增计数器:计数值(0~65535)
16位预分频器:分频系数(1~65536)
可用于触发DAC(数模转换)
在更新事件(计数器溢出)时,可产生中断/DMA请求。
- 基本定时器时钟源只能来自于内部时钟。
- 影子寄存器是实际起作用的寄存器,不可直接访问。
- 自动重载寄存器(ARR)起到缓冲作用,写入到ARR的值不能直接起作用,而是要转入到影子寄存器才能起作用。
- 向PSC预分频器写入分频系数时,不直接起作用,而是等值转移到影子寄存器后才起作用。
- 当计数器溢出时,更新事件默认产生,而中断和DMA并不是默认产生,而是通过配置来产生。
- UG位可产生软件更新事件。
- 更新事件产生后,会让预装载寄存器的值加载到对应的影子寄存器。
- ARPE位决定ARR是否具有缓冲。如果有缓冲,将值装载到自动重载寄存器ARR中,并不立即起作用,而是等待更新事件发生后,值装载到对应的影子寄存器,才会起作用。如果无缓冲作用,则值会直接转移到影子寄存器,立刻生效。
- 定时器1~8都是72MHz。
STM32定时器计数模式及溢出条件
递增计数模式实例说明
PSC=1,实际分频系数=PSC+1,所以这是二分频。
ARR=36
递减计数模式实例说明
PSC=1,实际分频系数=PSC+1,所以这是二分频。
ARR=36
中心对齐模式
PSC=0,也就是1分频。
ARR=6。
CNT=ARR-1或1时产生溢出。
定时器中断实验相关寄存器
TIM6 和TM7 控I制寄存器 1(TIMx_CR1)
用于设置ARR寄存器是否具有缓冲,使能/关闭计数器。
- 默认情况下,ARPE(Auto-reload preload enable)为0,TIMx_ARR寄存器没有缓冲,操作ARR寄存器,其值会直接转移到ARR影子寄存器直接生效。
ARR寄存器具有缓冲时,会减少操作这个寄存器带来的时间误差。
TIM6 和TIM7 DMA/中断使能寄存器(TIMx_DIER)
用于使能更新中断
TIM6 和TIM7 状态寄存器(TIMx_SR)
用于判断是否发生了更新中断,由硬件置1,软件清零。
TIM6 和TIM7 计数器(TIMx_CNT)
计数器实时数值,可用于设置计时器初始值,范围:0~65535
TIM6 和TIM7 预分频器(TIMx_PSC)
用于设置预分频系数,范围:0~65535,实际预分频系数等于PSC+1
TIM6 和TIM7 自动重装载寄存器(TIMx_ARR)
用于设置自动重装载值,范围:0~65535
定时器溢出时间计算方法
- Tout是定时器溢出时间
- Ft是定时器的时钟源频率(没有分频)
- ARR是自动重装载寄存器的值
- PSC是预分频器寄存器的值
定时器中断实验配置步骤
- 配置定时器基础工作参数:HAL_TIM_Base_Init()
- 定时器基础MSP初始化:HAL_TIM_Base_MspInit() 配置NVIC,CLOCK等
- 使能更新中断且启动计数器:HAL_TIM_Base_Start_IT()
- 设置优先级,使能中断:HAL_NVIC_SetPriority()、HAL_NVIC_EnableIRQ()
- 编写中断服务函数:TIMx_IRQHandler() ->HAL_TIM_IRQHandler()
- 编写定时器更新中断回调函数:HAL_TIM_PeriodSlapsedCallback()
关键结构体介绍
typedef struct
{
TIM_TypeDef *Instance; //外设寄存器基地址
TIM_BASE_InitTypeDef Init;//定时器初始化结构体
}TIM_HandleTypeDef;//定时器句柄
typedef struct
{
uint32_t Prescaler;//预分频系数
uint32_t CounterMode;//计数模式
uint32_t Period; //自动重装载值ARR
uint32_t ClockDivision; //时钟分频因子
uint32_t RepetitionCounter; //重复计数器寄存器的值
uint32_t AutoReloadPreload; //自动重装载预装载使能
}TIM_BASE_InitTypeDef;//定时器基础初始化结构体
使用基本定时器6,实现500ms定时器更新中断,在中断里翻转LED0
PSC=7199,ARR=4999为例