我们知道,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传输异常之提醒

5、两份做STM32 FDCAN开发的资料

如何开关Systick定时器的中断使能?相关推荐

  1. MC9S12G128 Timer (定时器溢出中断 延迟函数)

    MC9S12G128 Timer (定时器溢出中断 延迟函数) 溢出中断 延迟函数 寄存器 溢出中断 void TIM_Init(void) {TSCR1_TEN = 1; TSCR1_TFFCA = ...

  2. STM32延时函数的四种方法:普通延时(2种)、SysTick 定时器延时(2种)

    STM32延时函数的三种方法:普通延时.SysTick 定时器延时(1.中断方式:2.非中断方式) 单片机编程过程中经常用到延时函数,最常用的莫过于微秒级延时delay_us( )和毫秒级delay_ ...

  3. stm32 systick定时器

    systick定时器是系统滴答定时器,一个24位的倒计时定时器,计到0时,将从RELOAD寄存器中自动装载定时初值,只要不把它在Systick控制及状态寄存器中的使能位清楚,就永不停息,即使在睡眠状态 ...

  4. STM32开发 -- Systick定时器

    如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/81630311 一.Systick定时器介绍 参看:STM32菜鸟成长记录-系 ...

  5. 【STM32】SysTick定时器

    00. 目录 文章目录 00. 目录 01. SysTick定时器概述 02. SysTick定时器寄存器描述 03. 相关函数实现 04. 延时函数实现 05. 应用示例 06. 附录 07. 声明 ...

  6. STM32学习及应用笔记一:SysTick定时器学习及应用

     这几年一直使用STM32的MCU,对ARM内核的SysTick计时器也经常使用,但几乎没有仔细了解过.最近正好要在移植一个新的操作系统时接触到了这块,据比较深入的了解了一下. 1.SysTick ...

  7. 14. GD32F103C8T6入门教程-Systick定时器

    1.简介 Cortex‐M3 处理器内部包含了一个简单的定时器.因为所有的 CM3 芯片都带有这个定时器,软件在不同 CM3 器件间的移植工作得以化简.该定时器的时钟源可以是内部时钟,或者是外部时钟. ...

  8. 填坑-关于SysTick定时器

    目录 01.坑的由来 02.填坑 03.修改代码验证 04.总结 本文主要来填坑,更正之前文章的错误.也进一步加深了我对SysTick定时器的理解,希望对你有帮助. 01.坑的由来 在之前的推文中&l ...

  9. c51两个定时器中断冲突_STM32定时器与中断整理

    目录 1.系统异常中断 2.外部中断(全部) 3.优先级 5.如何开关中断示例 6.抢断优先级.响应优先级说明 7.定时器说明 7.1基本定时器 7.2高级/通用定时器 7.3定时器拓展补充-主要特性 ...

最新文章

  1. 通过Appium获取Android app中webview
  2. VS在windows进行网络开发UDP(一)
  3. [gic]-ARM gicv3/gicv4的详细介绍-2020/12
  4. ICLR 2017 | GAN Missing Modes 和 GAN
  5. Pytorch上下采样函数--interpolate()
  6. List中bean某属性值转换为list
  7. 【Spring学习】Spring的AOP模块应用详解
  8. 颠覆与重构——戴尔助力徐工集团等行业客户实现业务转型
  9. RsyncServer服务无法启动的解决方法
  10. 测试人员的发展瓶颈:35岁之后我们该何去何从...
  11. wxpython和tkinter哪个好_为什么很多Python开发者写GUI不用Tkinter,而要选择PyQt和wxPython或其他?...
  12. Consul添加配置详解
  13. 工业机器人远程监控系统方案
  14. linux抓取snmp trap告警命令,linux snmptrap的发送与接收
  15. 安卓Android Studio开发环境,无需连接外网
  16. 深入浅出程序设计竞赛笔记(草稿
  17. 关于outlook不能发送126邮件的问题
  18. 2021-11-17每日刷题打卡
  19. C语言那些事之脉冲丢包率检测
  20. redis常用命令集合

热门文章

  1. 基于JavaWeb的鲜牛奶订购系统的设计与实现
  2. 心的旅行——2009西藏行之林芝(四)
  3. 210811_152958-Gooey实战 | 几行代码转换Python程序为图形界面应用!
  4. Error: TS Error: Subsequent variable declarations must have the same type. Variable ‘beforeEach‘ mus
  5. 为什么sleeping的会话会造成阻塞(2)
  6. linux网卡updown命令,linuxc获取网卡状态(UPorDOWN)
  7. python 图片保存成视频
  8. c语言制作小数钱变大写,金钱数目小写变大写(C语言版)
  9. 19c 数据高可用实用配置 RAC + SingleADG
  10. TTS技术在语音识别中的应用:提升语音交互的准确性