当前位置: 首页 > article >正文

STM32F103_LL库+寄存器学习笔记02 - 开启SysTick(滴答定时器)中断

导言


《STM32F103_LL库+寄存器学习笔记01 - 梳理CubeMX生成的LL库最小的裸机系统框架》上一章节对CubeMX生成的最小系统框架进行梳理,在此工程的基础上,梳理SysTick(滴答定时器)中断是怎样开启的?为什么SysTick中断会自动调用函数SysTick_Handler()

效果如下:
在这里插入图片描述
在代码stm32f1xx_it.c里的函数SysTick_Handler()在持续被调用,将全局变量gTickCount持续累加。

项目地址:https://github.com/q164129345/MCU_Develop/tree/main/stm32f103_ll_library02_SysTick_Interrupt

一、寄存器SysTick->CTRL


在这里插入图片描述
如上所示,将SysTick->CTRL的段TICKINT置1就可以开启SysTick中断。
在这里插入图片描述
在这里插入图片描述
如上所示,SysTick->CTRL的段CLKSOURCE置1选择AHB时钟,不会分频。 SysTick->CTRL的段ENABLE置1启动滴答定时器。

二、代码


2.1、main.c

在这里插入图片描述
如上所示,通过或运算,将寄存器CTRL的段TICKINT置1,启动SysTick中断。

2.2、stm32f1xx_it.c

在这里插入图片描述
在SysTick中断回调函数SysTick_Handler()里将全局变量gTickCount累加。

三、Debug调试


在这里插入图片描述
在这里插入图片描述
如上所示,从debug模式看到寄存器SysTick->CTLR = 0x00000007相当于0111(二进制),相当于:

  • CLKSOURCE = 1,SysTick的时钟源来自AHB
  • TICKINT = 1,打开中断
  • ENABLE = 1,启动倒数

四、细节补充


4.1、为什么SysTick中断时会自动调用SysTick_Handler()

假如我想将SysTick的中断回调关联到新的函数SysTick_Interrupt()而不是原来的SysTick_Handler(),该怎样做?
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如上四张图所示,改完后直接编译代码。
在这里插入图片描述
如上,编译成功。
在这里插入图片描述
如上所示,新的中断回调函数SysTick_Interrupt()被正常调用。
到此,只是说明怎样改变SysTick中断时,调用其他函数而已。但是,为什么能跟.s启动文件的中断向量表里的SysTick_Interrupt关联起来呢?
在这里插入图片描述
如上所示,中断向量表里的这个位置,就是对应SysTick中断回调的。 在 Cortex-M 的启动文件中,每一个中断/异常在向量表里都有一个固定“槽位”,而那个“DCD SysTick_Interrupt ; SysTick Handler”这一行就代表 SysTick 中断的入口地址。如果你将向量表中的 SysTick 条目写成 DCD SysTick_Interrupt,那么当 SysTick 中断发生时,CPU 就会跳转到名为 SysTick_Interrupt() 的函数入口执行。

换句话说,向量表中的那一行就是告诉 CPU:SysTick 中断对应的中断服务函数是哪个。


http://www.kler.cn/a/601012.html

相关文章:

  • 大摩闭门会:250324 学习总结报告
  • Tasklet_等待队列_工作队列
  • 使用 FastLanguageModel 的 from_pretrained 方法加载一个已经预训练好的大语言模型及其对应的分词器(tokenizer)
  • 快速搭建个人 k8s 集群(版本 1.30.x)
  • 如何通过BinLog日志恢复被删除的数据
  • stable diffusion本地安装
  • 如何在Windows上下载并配置GO语言环境变量
  • Linux--进程控制
  • ETL:数据清洗、规范化和聚合的重要性
  • redis 学习笔记
  • 至此,他19岁青春烙印上了苦涩的烧痕。
  • 【鸿蒙开发】Hi3861学习笔记- TCP客户端
  • 通过国内源在Ubuntu20.0.4安装repo
  • Mininet-topo.py源码解析
  • linux中防火墙的配置
  • 【Docker系列八】使用 Docker run 命令部署 Nginx
  • Windows系统安装Node.js和npm教程【成功】
  • 使用 fn_dblog手动恢复误操作的 update(单列数值型数据恢复)
  • 基于SpringBoot + Vue 的汽车租赁管理系统
  • C++类与对象的的第三个简单的实战练习-3.25笔记