这次来记录下定时器的应用
定时器有可以有好几个应用的场景
1.作为基本定时器计时
2.作为PWM输出或者比较输出
3.作为捕获功能
4.计算外部脉冲数
5.用定时器更新来触发其它的事件
6用定时器来级联,就是可以用定时器的更新来作为另一个定时器的时钟
7在HAL库中还可以用作us级延时函数
主要说几个少见的场景
1.用定时器的更新来触发GPIO的DMA
2.用定时器的更新来触发SPI的写DMA和读DMA
3.用定时器的更新来触发ADC的采集
首先我们看定时器的框图
可以看到有好几个时钟来源 ,内部时钟,ETR,ITR都可以作为时钟源来驱动
同时,也有DMA事件
例如更新事件,当发生更新事件后就会触发DMA请求。
H7的定时器也类似,功能更强大点
基本定时器计时
目前最基础的就是使用定时器计时。
一般会配置Prescaler和Period
例如定时器的时钟是72MHz,则意味着每1个时钟的时间是1/72000000S。
定时器的配置Prescaler可以配置成7200-1,则分频后的频率为72000000/7200=10000,意味着每1个时钟的时间是时间为0.1毫秒。
当CNT达到10000时,便是1S时间了。
在void TIM_Base_SetConfig(TIM_TypeDef *TIMx, const TIM_Base_InitTypeDef *Structure)中可以看到,配置的
Period最后会赋值给ARR寄存器,也就是自动装载寄存器
/* Set the Autoreload value */
TIMx->ARR = (uint32_t)Structure->Period ;
因此,我们把Period设置为5000.并且开启定时器更新中断。等到计数器数值为5000时,则时间为0.5S,产生了中断。
手册上写在递增计数模式下,计数器从 0 计数到自动重载值( TIMx_ARR 寄存器的内容),然后重新
从 0 开始计数并生成计数器上溢事件。