最近在研究系统滴答定时器,简单的说一下对于STM32单片机中,有关于系统滴答定时器的一些感悟,因为刚刚步入,一些不对的观点希望大家给予一点建议或意见。同时也欢迎志同道合的朋友一起学习,也欢迎对科学,对学习充满热爱的朋友一起学习。
为什么我突然想要学习系统滴答定时器器呢?原因是由于最近在一个项目中,沿用老方法,使用原子库自带的延时去处理程序中,需要的一些延时。目前使用来看,好像是影响不大,没有什么危害。但是我发现使用延时的话,程序是处于等待状态的。也就是说,这个时候你的程序是死的。而且一般来说,程序执行速度是非常快的,目前看来大部分的程序,估计10微秒就可以执行完了。但是,当我们使用过多延时在程序中时,就会造成资源的浪费,对于程序本身来说,也非常不便。举一个很简单的例子,就比如说,我们目前一般使用按键时会加上一个10MS的延时来进行去抖,为了去除按键抖动,10MS延时本身是没有任何问题的。但是在这10MS内,单片机只做了一件事,那就是等待。对于主程序执行一次只需要US级别来说,这段时间单片机都可以喝杯茶了。基于以上思路,促使我想要更好的改变这种单片机等待状态。在CM3系列,systick定时器是AMR内核都存在的,这样对于移植程序来说也非常的方便。
肯定有朋友会说,你说的不就是跟使用普通定时器产生中断一样吗?是的,从本质上来说,系统滴答定时器就是一个定时器,他只计数而已。我们当然也可以用其他定时器产生同样的效果,但是既然是单片机自身带的,使用系统滴答定时器获得精准延时岂不是更好,也非常节省资源。
![2bb76d35b89e4bd625e9e59048b7ecfc.png](https://i-blog.csdnimg.cn/blog_migrate/5f563c5d924f79528734a2383cf9ac61.jpeg)
下面是我对于STM32SYSTICK定时器调节过程中的一些方法,仅供参考!
1、要使用systick定时器,只需调用SysTick_Config(uint32_t ticks)函数即可,
自动完成了,重装载值的装载,时钟源选择,计数寄存器复位,中断优先级的设置(低),开中断,开始计数的工作。
2、要修改时钟源调用SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)。
3、要修改中断优先级调用
void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
应用说明:
1、因systick是一个24位的定时器,故重装值最大值为2的24次方=16 777 215,
要注意不要超出这个值。
2、systick是cortex_m3的标配,不是外设。故不需要在RCC寄存器组打开他的时钟。
3、每次systick溢出后会置位计数标志位和中断标志位,计数标志位在计数器重装载后被清除,而中断标志位也会随着中断服务程序的响应被清除,所以这两个标志位都不需要手动清除。
4、采用使用库函数的方法,只能采用中断的方法响应定时器计时时间到,如要采用查询的方法,那只能采用设置systick的寄存器的方法,具体操作以后再做分析。