stm32 - 中断/定时器
- 概念
- 时钟树
- 定时器类型
- 基准时钟(系统时钟)
- 预分频器 - 时基单元
- CNT计数器 - 时基单元
- 自动重装寄存器 - 时基单元
- 基本定时器结构
- 通用定时器
- 计数器模式
- 内外时钟源选择
- 定时中断基本结构
- 时序
- 预分频器时序
- 计数器时序
概念
时钟树
https://www.bilibili.com/video/BV1th411z7sn?p=13&vd_source=7155082256127a432d5ed516a6423e20
执行main函数之前,程序中主函数还会执行一个systeminit函数,这个函数就是用来配置时钟树的
SYSCLK是系统时钟72MHZ
震荡源:内部震荡源RC振荡器8MHZ,外部震荡源:4~16MHZ(石英晶振),…
图中与门就是RCC_xxx函数打开时钟
定时器类型
- 高级定时器:TIM1,TIM8 -> APB2总线,
- 通用定时器:TIM2,TIM3,TIM4,TIM5 -> APB1总线,
- 基本定时器:TIM6,TIM7 -> APB1总线,
针对STM32C8T6:TIM1,TIM2,TIM3,TIM4
基准时钟(系统时钟)
stm32主频72MHZ
RCC_TIMxCLK(主频)-> 内部时钟CK_INT(基本计数时钟) ->控制器 -> CK_PSC ->时基单元
因此,通向时基单元的计数基准频率是72MHZ
预分频器 - 时基单元
对输入的基准频率提前进行一个分频的操作
对72MHZ的计数时钟进行预分频
预分频器=0,不分频:输出频率=输入频率=72MHZ
预分频器=1,2分频:输出频率=输入频率/2=36MHZ
预分频器=11 ,12分频:输出频率=输入频率/12=6MHZ
预分频器是16位,最大可以写65535个数,最大是65535+1=65536分频;输出频率=输入频率/65536=1.0986328125KHZ
CNT计数器 - 时基单元
对预分频后的计数时钟进行计数,计数时钟每来一个上升沿,计数器值+1
CNT计数器是16位的,最多计0~65535的数值,再+1就从0开始计数
实际定时中断,应该是计数器达到目标值时,产生中断
自动重装寄存器 - 时基单元
存储计数目标的寄存器
自动重装寄存器是16位的, 是写入的固定值,当计数器的计数值达到自动重装寄存器的值的时候,表明定时时间到,产生中断信号,并清零计数器开始下一次从0开始计数
计数器值=自动重装寄存器的值(也叫更新中断),产生中断,产生中断后通往NVIC,再配置号NVIC定时器的通道, 执行中断服务
基本定时器结构
通用定时器
计数器模式
向上计数模式:基本定时器只有这一个功能
向下计数模式:通用计时器
中央对齐模式:通用计时器
- 向下计数模式
从自定义的自动重装值开始,向下自减,减到0后重新回到自动重装值开始计数
- 中央对齐模式
0-> 自增 -> 自动重装值 -> 自减 -> 0
内外时钟源选择
对于基本定时器,只能选择内部时钟进行定时,即系统频72MHZ
对于通用定时器,即能选择内部时钟72MHZ,也能选择外部时钟
外部时钟
TIMx_ETR引脚上的外部时钟(查看引脚定义图)
在引脚上接一个外部的方波时钟,然后配置内部的电路
定时中断基本结构
时序
预分频器时序
计数器时序