我们知道,STM32芯片里的ARM处理器都集成了1个24位向下计数的具备自动重装功能的SYSTICK定时器,功能比较单纯,就是计数定时。它常用来作为OS的滴答时钟,或者作为基本的计数时基。比方在各个RTOS系统里往往把SYSTICK作为滴答时钟,对于OS来讲,用它做时基可以提高代码移植方面的便利性,反正只要使用Arm核的芯片都有这个SYSTICK定时器。再比方,ST公司的HAL库一般默认将SYSTICK作为一个基本的延时功能定时器,那个库函数HAL_Delay()就是用SYSTICK实现计数延时,一般默认设置为每毫秒中断1次。
因为SYSTICK定时器属于核外设,所以在STM32芯片的参考手册里并没有很仔细的介绍,关于它的介绍需要查看ARM公司提供的相关内核的技术手册。
其大致工作架构如下:
每次计数器发生从1记到0时进行计数器的重装并开启下轮计数,此时COUNTFLAG标志被置位并可以触发中断。SYSTICK定时器涉及到4个主要的寄存器,分别是SYSTICK控制寄存器、重装值寄存器、计数器值寄存器、校准值寄存器。这里重点看看前3个。
其中,计数器值寄存器自然是体现任一时刻计数器的值,对它的写操作都会让其计数器值清零,同时使得COUNTFLAG【控制寄存器的一位】被清零。重装值寄存器盛放计数器每次向下记到0时要重装的起始值,结合时钟一起决定计数周期长短。
对SYSTICK定时器的计数器进行启、停操作,SYSTICK定时中断的使能、关闭操作以及对SYSTICK时钟源的选择就由SYSTICK控制寄存器掌控,其中起作用的就是4个位,参考下图:
BIT0【ENABLE】掌控SYSTICK计数器的启动、停止,类似于STM32外设定时器控制寄存器里的CEN位。
BIT1【TICKINT】掌控SYSTICK中断请求的使能、禁用,类似于STM32各个外设事件的中断请求使能控制位。
BIT3【ClockSource】掌控SYSTICK时钟源的选择。
BIT4【COUNTFLAG】是状态标志位,当计数器从1记到0时该位被置1,可以读清零。
我们在STM32应用中,尤其基于CubeMx配置生成基于HAL库的工程时,SYSTICK定时器默认打开,并开启1ms的周期性中断。有时,如果我希望关闭或临时关闭SYSTICK的中断请求,即不希望它产生中断请求,如何操作呢?
既然是不希望SYSTICK产生中断请求,自然会想到直接关闭其中断请求使能,即对上面控制寄存器中的TICKINT位进行清零。
如果基于STM32库定义的写法可以是这样:
SysTick->CTRL &=~SysTick_CTRL_TICKINT_Msk;
一般来讲,关闭SYSTICK的中断功能后其计数定时功能往往也不太需要了,即使需要也不太方便使用。既然这样,我们也可以通过关闭SYSTICK的计数功能进而阻止基于硬件计数事件的中断请求产生。【我为什么加个基于硬件计数事件呢,是因为很多中断请求都可以基于软件方式产生】,基于STM32库定义的写法可以是这样:
SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;
当然,对于关闭SYSTICK计数器的做法除了直接对控制寄存器的计数使能位清零外,还有个比较快捷省事的做法,那就是直接对其重装寄存器写0值,即像下面这样操作:
SysTick->LOAD = 0 ;
这个时候,SYSTICK将不做计数动作,自然也不会产生计数溢出而触发中断请求。
为什么我前面强调“基于STM32库定义的写法”呢?是因为有关SYSTICK的寄存器的命名,STM32库定义的跟ARM技术手册命名不一样。ARM的命名是这样的:
而STM32库定义的寄存器命名是这样的:
当然这个命名只是符号上的差异,最终对应的访问地址都是一样的。个人觉得ST库定义的更直观、易记、易识别点。
上面说的都是基于不同方式如何关闭SYSTICK的中断请求,开启只是个逆过程而已,无须赘述。
前面重点介绍了从外设端如何关闭SYSTICK中断请求,令其不向内核申请中断。至于如何从内核端使能或禁止对其做出响应,那是NVIC控制器的事了。比方,在STM32的HAL库函数里,HAL_NVIC_EnableIRQ()和HAL_NVIC_DisableIRQ()就是用来针对特定中断请求做允许响应和禁止响应的设定。关于从外设端开关中断请求和从内核端开关中断响应的关系以及行为差异,我们下次找机会再聊。
*******************************
往期话题阅读链接【点击即可阅读】:
1、本来同步的信号为何有相差了?
2、STM32 DMA编程时的应用小提醒
3、开启Cache后UART无法发送新数据
4、CubeMx的配置顺序与DMA传输异常之提醒
文章来源:https://www.toymoban.com/news/detail-649286.html
5、两份做STM32 FDCAN开发的资料文章来源地址https://www.toymoban.com/news/detail-649286.html
到了这里,关于如何开关Systick定时器的中断使能?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!