STM32 滴答定时器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32 滴答定时器相关的知识,希望对你有一定的参考价值。

STM32 系统滴答定时器等待计数溢出,请问这句话怎么理解。 计数溢出以后该位置1,取反后为0,while()就不成立,就不会执行后面的语句。我这样理解应该是错的,但就是钻不出来了,请指教
//等待计数溢出
while(!(SysTick->CTRL&(1<<16)));
//关闭定时器
SysTick->CTRL &= ~(1<<0);
//清除标志位
SysTick->VAL = 0;//清除溢出标志位

参考技术A 你后面的关闭定时器、清除标志位的语句又不在while循环里面,你这个while语句是空循环来的。。。所以在定时器溢出置位之前,CPU一直在while循环里空转,啥都不干,换句话说就是等待定时器溢出,然后才执行下面的语句。追问

追答

当定时器还没溢出,SysTick的CTRL寄存器第16位为0,与(1<<16)即0x10000000000000000做按位与运算(&),结果必为0,再取反(!),结果为1,while循环的条件成立,所以CPU一直在执行while这个空循环。直到定时器溢出,SysTick的CTRL寄存器第16位置1,与(1<<16)即0x10000000000000000做按位与运算(&),结果不为0,再取反(!),结果不为1,while循环条件不成立,跳出循环,执行下面的语句。我觉得你应该去补补C语言还有STM32的编程手册。。。

追问

谢谢,十分感谢

《零死角玩转STM32》-18-SysTick系统滴答定时器

参考资料:《STM32F4XX内核参考手册》:4.4.8-SHPRX(System Handler Priority Register)与4.5- System Tick Timer.

1. 简介

SysTick是一个24Bit的系统定时器,属于CM4内核的外设,相关寄存器与部分库函数中core_cm4.h中定义。SysTick一般用于操作系统,用于产生时基,维持OS的心跳。

如下所示:当计数器被使能(STC_CTRL: Bit0-ENABLE)并且计数器到0时,STK_LOAD中的预设值会被重新装载到STK_VAL中,并作为计数器的起始值(Start Value),之后开始递减计数。

 "STK_VAL" ---   ---count down---  -----> Zero?

     |                                                    |

    /|\\                                                 \\|/

     |                                                    |

     -<-----Relaod Value from STK_LOAD-

2. SysTick寄存器介绍

技术分享  技术分享

 

STK_CTRL,主要涉及

  计数器的使能(Bit0-ENABLE),

  计数到0的时候是否产生系统异常(Bit1-TICKINT),

  时钟源的选择(Bit2-CLKSOURCE)

  以及计数标志位(Bit16-COUNTFLAG)

STK_LOAD:计数器的预设值

STK_VAL:计数器当前值寄存器,即为:The current value of the SysTick counter.

  注意:读取该寄存器,返回:系统滴答计数器的当前值

     写入“任何数值”到该寄存器都会将该寄存器清零!,同时会清除STK_CTRL寄存器中的COUNTFLAG位!

 

以上是关于STM32 滴答定时器的主要内容,如果未能解决你的问题,请参考以下文章

STM32怎么用库函数使用滴答定时器?

STM32的滴答定时器的计数到0时标志位置1,需要软件清除标志位吗!,还是硬件自动清除

STM32系统时钟配置,滴答定时器配置相关

STM32 的系统滴答定时器( Systick) 彻底研究解读

《零死角玩转STM32》-18-SysTick系统滴答定时器

STM32F103五分钟入门系列SysTick滴答定时器+SysTick中断实现跑马灯