STM32系统时钟简介

系统定时器

SysTick系统定时器属于CM3的内核外设,而不是片上外设,即只要是使用CM3核的芯片都有这个功能。有关寄存器的定义和部分库函数都在core_CM3.h中定义和实现。
定时器是用来计时的,与传统的软件模拟(while或for实现)计时相比,定时器在计时精度上有着明显的优势,并且还不占用CPU的资源,可以让CPU去处理别的事情。定时的原理:向重装载数值寄存器中写入需要定时的数值,然后配置系统定时器的控制及状态寄存器,开始倒数计数。当当前数值寄存器中的值减到0时,会根据控制及状态寄存器的配置来决定是否产生中断、以及把控制及状态寄存器中的状态位置1(M3的状态标志位是第16bit,不同的核状态标志位可能不一样)。要是使能了中断,则CPU执行相应的中断服务函数响应中断。而同时计数器把重装载数值寄存器中的值重新装载到当前数值寄存器中,然后开始下一轮的计数,以此循环往复。
从上面可以知道,定时器其实就是做减法计数操作。那么多长时间减一次(时钟)、计数到0的时候是否要产生中断、以及是否使能定时器问题咱们可以配置相应的寄存器来实现。

  • STK_CTRL:第16bit指示定时器中的数值是否减到0,要是到0则置1(读出1后会自动清零),bit2用来选择定时器的时钟,bit1用来配置是否产生中断。bit0则是开启定时器的使能开关
  • STK_VAL,当前数值寄存器,读取这个寄存器既可获取到当前计数的值。
    • 时钟源TIMxCLK,即内部时钟CK_INT,是经APB1预分频器后分频提供。APB1预分频系数为1,则使用APB1时钟。否则翻倍使用,库函数中对APB1预分频的系统是2,因此调用库函数时钟源是72M
    • 计数器时钟分频器,定时器时钟源经过PSC预分频器之后,得到CK_INT用来驱动计数器计数。PSC是一个16位的预分频器,对时钟TIMxCLK进行1~65536之间的任何一个数进行分频。
    • 计数器CNT:计数器CNT是一个16位的计数器,只能往上计数,最大数值为65535。当计数达到自动重装载寄存器的时候产生更新事件,并清零从头开始计数。

    时钟源

    只有在CEN位(TIMx_CR1寄存器中)置1后内部时钟才会向预分频器提供时钟

    计数模式

    即使在计数器运行时,软件也可以读写计数器、自动重装载寄存器和预分频寄存器。自动重装载寄存器是预加载的, 每次读写自动重装载寄存器时,实际上是通过读写预加载寄存器实现。可以配置自动重装载预加载使能位,来实现写入预加载寄存器的内容是立即还是在每次事件更新时传送到它的影子寄存器。在计数器溢出时,硬件发出更新事件
    假如要修改定时器的时间,则需要修改自动重装载寄存器的值。修改自动重装载的值后也是在更新事件产生时更新自动重装载影子寄存器(前提是ARPE使能)。如下图:

    STM32系统时钟简介

    基本定时器编程

    上述就是通用定时器的工作原理。在库函数中定义如下结构体:

    其中通用寄存器能使用上的是TIM_Prescaler和TIM_Period,即定时器预分频器设置系数和自动重装载的值。

    在对基本定时器的编程流程为:

    • 开启定时器的时钟,没有时钟一些都是免谈。基本定时器TIM6/7都是挂载在APB1总线上。
    • 初始化时基结构体TIM_TimeBaseInitTypeDef,调用函数TIM_TimeBaseInit()进行初始化。
    • 使能基本定时器的中断,调用TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState)。基本定时器 TIM6 and TIM7 can only generate an update interrupt.
    • 开启定时器void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState)
    • 要是使能中断则需要实现相应中断服务函数和NVIC的配置。如TIM6_IRQHandler()和TIM7_IRQHandler。
      由于外部中断很多时候共用同一个中断通道,所以在中断服务函数中要区分是什么中断类型在基本定时器中可以通过API: ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT)来获取是什么中断触发了。而通过调用void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);来清除已经处理后的中断。
      库函数的具体实现这里就不贴出来了,对于想了解的同学,可以自己去库文件里面查阅源码。

    声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2019年11月28日
下一篇 2019年11月28日

相关推荐