STM32:外部中断

news2025/1/12 20:46:02

        中断,顾名思义就是停止现在正在干的活,去干其他更紧急的事情。在通常的信息系统中,中断发生时,会先保留现场,即当前的运行情况和状态。在去做其他紧急事情。事情做完还要恢复原先中断前的状态继续干原来的活。在STM32中,例如指令出错,定时器结束,串口接收到数据,GPIO电平变化等都会产生中断。

一、外部中断示例

注:使用STM32F103CT6芯片,KEYSKING教程的开发板套件。开发板接口图如下

(1)示例:红灯正常闪烁,按下KEY1按钮,翻转绿灯亮灭。

        在芯片设置界面中设置PA7,PB0口为GPIO_OUTPUT标签命名分别为greenLED,redLED.把PB12口设置为GPIO_EXIT12,命名为key1.

        在属性设置面板中,System Core ->GPIO->PB12 进行详细设置,GPIO MODE 设置为下降沿(Falling Edge)触发.

        而后属性设置面板中,点击中断向量控制NVIC 设置中断优先级,如图

关键代码如下:在main.c中编写红灯闪烁代码

...
 MX_GPIO_Init();
  /* USER CODE BEGIN 2 */
  int status =0 ;
  /* USER CODE END 2 */
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	  status++ ;
	  status%=5;
	  if(status < 1){
	    HAL_GPIO_WritePin(redLED_GPIO_Port, redLED_Pin, GPIO_PIN_RESET);
	  }else{
		HAL_GPIO_WritePin(redLED_GPIO_Port, redLED_Pin, GPIO_PIN_SET);
	  }
	  HAL_Delay(300);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
.....

在stm32f1xx_it.c 中编写中断处理函数。(注:it为"中断"英文缩写)

......
void EXTI15_10_IRQHandler(void)
{
  /* USER CODE BEGIN EXTI15_10_IRQn 0 */
  HAL_Delay(10);
  if(HAL_GPIO_ReadPin(key1_GPIO_Port,key1_Pin) == GPIO_PIN_RESET){
	  //反转pin位,即按下key翻转绿灯亮灭
	  HAL_GPIO_TogglePin(greenLED_GPIO_Port, greenLED_Pin);
  }
  /* USER CODE END EXTI15_10_IRQn 0 */
  HAL_GPIO_EXTI_IRQHandler(key1_Pin);
  /* USER CODE BEGIN EXTI15_10_IRQn 1 */

  /* USER CODE END EXTI15_10_IRQn 1 */
}
......

编译,生成结果。   

二、外部中断原理

        上图是GPIO的输入驱动器模块,电流从I/O引脚进入,到达上拉/下拉电阻,而后到达施密特触发器,而后流入输入数据寄存器或者片上外设。

(1).中断/事件控制器

        再接下来,电平信号便会进入外部中断/事件控制器的输入线中。其框图如下所示。

        在STM32中,这样的控制器在STM32F1系列芯片中由19个。这19个外部中断控制器公用一套寄存器,但是各个部件的连线都是独立的。每个部件之间的连线都有19组,每个外部中断都对应着其中1组线路。该线路也称为外部中断线。

        这19个外部中断线的前16组(EXIT0 ~ EXIT15)分别对应着编号相同的GPIO口。也就是说PA0/PB0/PC0/PD0对应着EXIT0,PA1/PB1/PC1/PD1对应着EXIT1一直到PA15/PB15/PC15/PD15对应着EXIT15...

        边沿检测电路可以检测输入的电平信号是否发生高低电平转换。如果出现电平转换后续就会发出一个高电平信号。

例如在上述示例中,我们把key1对应的PB12设置成了下降沿触发中断。那么当按下按钮时,下降沿触发选择寄存器就会置成1。而后发出高电平信号。经过一个或门到达请求挂起寄存器。请求挂起寄存器收到高电平信号后把满线路编号对应的bit位置为1。并向后续发出高电平信号。 到达了与门。而中断屏蔽器对应的bit位是否发出高电平信号,取决于STM32的端口是否设置为GPIO_EXIT,是则到达嵌套向量中断控制器NVIC.

(2).嵌套向量中断控制器NVIC

        NVIC会根据中断信号,选择对应的处理函数。中断向量前5号对应着各自的中断处理函数。而5号到9号公用同一个处理函数EXIT9_5_IRQHandler。10号到15号公用同一个处理函数EXIT15_10_IRQHandler。在上述示例中,PB12对应的中断向量为EXIT12,对应的处理函数则为EXIT15_10_IRQHandler。

 在中断函数中,有系统自动生成的代码HAL_GPIO_EXTI_IRQHandler();进入到其实现中发现有__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);函数,该函数就是用来重置中断寄存器中的bit位。

(3).中断优先级

当中断发生时如何确定哪个中断先执行呢?例如上述示例中,中断函数中调用了HAL_DELAY函数。该函数也会触发一个时钟滴答(Tick Timer)中断,如果设置的时钟滴答优先级比中断函数处理优先级低。当代码执行到HAL_DELAY时,由于有比HAL_DELAY优先级高的中断处理函数未完成那么系统就会进入"死锁“状态。

当两中断同时发生时,先比较抢占优先级,如果一样则比较响应优先级。如果还一样则取决于在中断向量表中的顺序。

当一个中断正在处理,而另一个中断信号发生。那么就只比较抢占优先级。 

在STM32为每个中断向量准备了4个二进制位来存储优先级信息。在Cube中可以根据优先级组下拉框设置哪几个bit位用来确定抢占优先级(主优先级),剩下的bit位确定为响应优先级(子优先级)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1127862.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python 字典dict和列表list的读取速度问题, range合并

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 python 字典和列表的读取速度问题 最近在进行基因组数据处理的时候&#xff0c;需要读取较大数据&#xff08;2.7G&#xff09;存入字典中&#xff0c; 然后对被处理数据进行字典key值的匹配&#xff0c;在被处理文件中每次…

模拟开关与多路复用器

模拟开关 模拟开关现在有两种工艺&#xff0c;模拟开关与cmos工艺 CMOS模拟开关收到温度还有供电电压影响&#xff0c;尽量供电高一点 jfet断电导通&#xff0c;cmos断电断开 因为寄生电容&#xff0c;交流信号会漏过模拟开关 没有负电源脚不能传交流电&#xff0c…

windows安装docker,解决require wsl 2问题

想在windows上安装桌面版docker&#xff0c;上官网下载了安装包&#xff0c;安装完后&#xff0c;启动报错&#xff0c;忘了截图了。 大概意思就是require wsl 2。 于是就是docker FAQ中找相关问题解决方案&#xff0c;点&#xff0c;点&#xff0c;点然后就点到微软了。 ws…

重入漏洞EtherStore

重入漏洞 // SPDX-License-Identifier: MIT pragma solidity ^0.8.13;contract EtherStore {mapping(address > uint) public balances;function deposit() public payable {balances[msg.sender] msg.value;}function withdraw() public {uint bal balances[msg.sender]…

干货分享 | TSMaster几种过滤器的对比及使用

TSMaster的4种过滤器&#xff1a; //硬件过滤器&#xff1a;可以在硬件端针对数据位进行筛选过滤&#xff0c;硬件过滤。在硬件端阻止接收一部分不需要的报文&#xff0c;留更多带宽对其他报文进行接收。 // 数据流过滤器&#xff1a;过滤总线数据流&#xff0c;软件过滤。操…

A股风格因子看板 (2023.10 第11期)

该因子看板跟踪A股风格因子&#xff0c;该因子主要解释沪深两市的市场收益、刻画市场风格趋势的系列风格因子&#xff0c;用以分析市场风格切换、组合风格暴露等。 今日为该因子跟踪第11期&#xff0c;指数组合数据截止日2023-09-30&#xff0c;要点如下 近1年A股风格因子检验统…

gin框架初识

先引入gin的包 终端执行 go get -u github.com/gin-gonic/gin 代码 package mainimport ("github.com/gin-gonic/gin""net/http" )func main() {r : gin.Default() //默认的路由引擎r.GET("/book", func(c *gin.Context) {c.JSON(http.Statu…

muduo源码学习base——Exception(带 stack trace 的异常基类)

Exception(带 stack trace 的异常基类&#xff09; 前置ExceptionCurrentThread::stackTrace() 前置 ABI: Application Binary Interface&#xff0c;应用程序二进制接口&#xff0c;可以参考&#xff1a;细谈ABI RTTI type_info: RTTI&#xff1a;Run Time Type Identificatio…

js给一段话,遇到的第一个括号处加上换行符

list.forEach((item,index0)>{const productName item.name;const index productName.indexOf(&#xff08;);if (index -1) {return productName;}const before productName.slice(0, index);const after productName.slice(index);item.namebefore \n after;});

算法学习(七)判断一个二叉树是否为完全二叉树

描述 给定一个二叉树&#xff0c;确定他是否是一个完全二叉树。 完全二叉树的定义&#xff1a;若二叉树的深度为 h&#xff0c;除第 h 层外&#xff0c;其它各层的结点数都达到最大个数&#xff0c;第 h 层所有的叶子结点都连续集中在最左边&#xff0c;这就是完全二叉树。&a…

值改变事件(SMART PLC梯形图FC)

值改变事件在通信速度优化上的应用,请查看下面文章链接: C#winform事件驱动 值改变事件 PLC寄存器值改变_plc数据变化触发条件_RXXW_Dor的博客-CSDN博客Modbus通讯时,设置值发生改变时,我们希望启动一次请求帧,发送写数据帧,这个功能,在C#winform里很容易实现,因为有对…

“唯品会VIP商品搜索API:尊享购物体验,一键获取心仪商品!“

唯品会按关键字搜索VIP商品API是一项面向唯品会VIP用户的API服务&#xff0c;它主要用于在唯品会网站上根据用户指定的关键字快速搜索到VIP商品&#xff0c;并提供商品详情、价格、库存量、评价等信息。这个API的核心功能是为用户提供便捷且准确的搜索服务&#xff0c;让用户能…

探索二次开发途径

一、什么是二次开发&#xff1f; 软件二次开发&#xff0c;也被称为定制开发或应用开发&#xff0c;是指在已有的软件基础上&#xff0c;通过编写自定义代码或应用程序来满足特定需求&#xff0c;扩展现有软件的功能。这种方式可在满足定制需求的同时&#xff0c;减少了开发新…

【会议征稿通知】第二届语言与文化传播国际学术会议(ICLCC 2024)

第二届语言与文化传播国际学术会议&#xff08;ICLCC 2024&#xff09; The 2nd International Conference on Language and Cultural Communication 第二届语言与文化传播国际学术会议&#xff08;ICLCC 2024&#xff09;的目标是将语言与文化传播领域的创新学者和行业专家聚…

利用ChatGPT自动生成基于PO的数据驱动测试框架

简介 PO&#xff08;PageObject&#xff09;设计模式将某个页面的所有元素对象定位和对元素对象的操作封装成一个 Page 类&#xff0c;并以页面为单位来写测试用例&#xff0c;实现页面对象和测试用例的分离。 数据驱动测试&#xff08;DDT&#xff09;是一种方法&#xff0c…

有奖招募——2023年度清华社“荐书官”活动今日开始了!

又到“1024程序员节”了&#xff0c;维护网络世界稳定和平的程序员大大们&#xff0c;辛苦了&#xff01;生活难免有bug&#xff0c;来给彼此个hug~ 过完1024&#xff0c;这一年也快要结束了&#xff0c;岁末回顾又要提上日程。很多人都有整理年度书单的习惯&#xff0c;那么这…

服务器数据恢复-服务器系统损坏启动蓝屏的数据恢复案例

服务器故障&分析&#xff1a; 某公司一台华为机架式服务器&#xff0c;运行过程中突然蓝屏。管理员将服务器进行了重启&#xff0c;但是服务器操作系统仍然进入蓝屏状态。 导致服务器蓝屏的原因非常多&#xff0c;比较常见的有&#xff1a;显卡/内存/cpu或者其他板卡接触不…

基于SSM的流浪动物领养信息系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

lua-web-utils和proxy程序示例

以下是一个使用lua-web-utils和https://www.duoip.cn/get_proxy的爬虫程序示例。每行代码后面都给出了详细的中文解释。 -- 导入所需的库 local http require("http") local ltn12 require("ltn12") local json require("json") local web_u…

GitLab升级16.5.0后访问提示502

系统是兼容CentOS8的TencentOS3.1 GitLab原来的版本是16.4.1 使用yum升级时发现GitLab有新版本,决定升级。 升级过程无异常,出现升级成功的提示。 可是意外的时,访问站点时提示502. GitLab比较吃资源,启动的服务较多。之前也有等会就正常的情况。 这次没那么幸运,一…