TIM定时器
·基本定时器
预分频器、自动重装载寄存器、计数器构成了最基本的计数计时电路——时基单元
预分频器为0,则输出频率等于输入频率;预分频器为1,则输出频率等于输入频率/2;预分频器为2,则输出频率等于输入频率/3....即实际分频系数 = 预分频器的值 + 1,预分频器为16位的(65535),所以最大分频为65536分频(主频72MHz)。
预分频器作用就是对输入的基准频率提前进行一个分频操作。
计数器是对预分频后的技术时钟进行计数(上升沿计数)。计时器也是16位计数范围0~65535,超过范围后返回到0重新开始。计数器在计数的同时不断的与自动重装载寄存器
自动重装在寄存器存储的是目标值,当计数值等于目标值后触发中断,并且清零计数器。之后计数器开始下一次的计数
计数值等于目标值后产生的中断信号(UI)一般叫做“更新中断”,更新中断产生后会通往NVIC,在配置好NVIC的定时器通道后,定时器的更新通道就能够得到CPU的相应
在产生中断信号的同时也会产生一个中断事件(U)叫做“更新事件”,更新事件不会触发中断,但可以触发内部其他电路的工作。
流程:
预分频器对输入频率分频➡计数器计数(预分频器输出频率上升沿计数),同时与自动重载寄存器中的目标值比较➡计数值等于目标值➡产生更新事件和更新事件➡CPU响应更新中断
·通用定时器
向上计数模式:计数器从零开始计数,向上自增,等于重装值后清零,并申请中断,然后开始下一轮,依次循环;
向下计数模式:从重装值开始,向下自减计数,等于零后重新返回重装值,并申请中断,然后开始下一轮,依次循环;
中央对齐模式:计数器从零开始计数,先向上自增,等于重装值后申请中断,然后向下自减计数,等于零后再申请中断,然后开始下一轮,依次循环。
基本定时器支持向上计数模,通用和高级定时器支持向上计数、向下计数、中央对齐模式。
·高级定时器
定时中断基本结构
预分频器时序
时基单元
计数器计数频率:CK_CNT = CK_PSC / (PSC + 1)
CK_PSC预分频器的输入时钟(未分频前的频率)
CNT_EN计数器使能,高电平计数器正常运行,低电平计数器停止操作。
CK_CNT计数器时钟,(既是预分频器的输出也是计数器的输入)
上图是预分频器的一种缓冲机制,预分频器寄存器实际上有两个。一个是供读写用的 预分频控制寄存器(并不是直接决定分频系数),另一个是预分频缓冲寄存器(真正起分频作用)。
当在一个计数周期内,改变分频值(及改变预分频控制寄存器的值),频率不会立刻发生改变,而是等到本次计数周期结束时产生了更新事件,预分频寄存器的值才会被传递到缓冲寄存器中,才会生效
计数器时序
CK_CNT--定时器时钟
ARR自动重载值
CK_PSC--定时器时钟源(这里是72MHz)
PSC--预分频值
计数器溢出频率:CK_CNT_OV = CK_CNT / (ARR + 1)
= CK_PSC / (PSC + 1) / (ARR + 1)
计数器有预装时序(有缓冲机制)
RCC时钟树
RCC时钟树是STM32中用来产生和配置时钟,并且把配置好的时钟发送到各个外设的系统,时钟是所有外设运行的基础,所以时钟也是最先需要配置的东西。
程序中主函数之前还会执行一个Systeminit函数就是用来配置时钟树的。
在时钟产生电路中有四个震荡源,分别是:1.内部的8MHz高速RC振荡器;2.外部的4~16MHz高速石英晶体振荡器,也就是晶振,一般都是8MHz;3.外部的32.768MHz低速晶振,这个一般是给RTC提供的时钟;4.内部的40KHz低速RC振荡器,这个可以给看门狗提供时钟。
外部石英晶体振荡器比内部RC振荡器稳定,一般都用外部的。
Systeminit函数里首先启动内部时钟1,启动内部8MHz为系统时钟,暂时一内部8MHz时钟运行,然后在启动外部时钟,进入PLL锁相环进行倍频,8MHz倍频9倍,得到72MHz,等到锁相环输出稳定后,选择锁相环输出为系统时钟。如果外部晶振出问题,系统时钟无法切换至72MHz,x系统就会以内部8MHz运行,大概慢了10倍。
CSS(Clock Security System)时钟安全系统,也是负责切换时钟的,可以检测外部时钟的运行状态,一旦外部时钟失效,就会自动把外部时钟切换回内部时钟。
时钟分配电路,首先系统时钟72MHz进入AHB总线,AHB总线有预分频器,在SystemInit里配置的分配系数为1,则AHB的时钟就是72MHz,然后进入APB1总线,如果分频系数为2,APB1总线的时钟就为72MHz/2=36MHz,APB2总线,如果分频系数为1,时钟为72MHz