历史上的今天
返回首页

历史上的今天

今天是:2025年06月27日(星期五)

正在发生

2020年06月27日 | STM32CubeMX系列教程2:外部中断(EXIT)

2020-06-27 来源:eefocus

这一章我们在前一章GPIO的工程修改。复制GPIO的工程,修改文件夹名。点击STM32F746I.ioc打开STM32cubeMX的工程文件重新配置。PA0管脚重新配置为GPIO_EXIT0模式。

WAKEUP按键已经外部下拉,按下是PA0为高电平。在GPIO配置中配置PA0为上升沿触发。内部既不上拉也不下拉,添加用户标签WAKEUP。

在NVIC(嵌套向量中断控制器)中,勾选EXIT Line0 interrupt使能PA0中断。右边两个选项设置抢占优先级和响应优先级。此处我们选择默认的,不修改。

在这里简单介绍一下NVIC(嵌套向量中断控制器)。NVIC就是控制中断响应的。主要由三个参数,一个是中断使能,一个是抢占优先级,还有一个就是响应优先级。(优先级数值越小,优先级别越高)


中断使能很好理解,就是是否开启中断,如果开启中断,则满足中断触发条件时程序会跳到中断服务程序运行,否则不响应中断主程序继续运行。


抢占优先级是用来判断一个中断是否可以打断另外一个中断的中断服务程序抢先运行。例如A中断触发,正在运行A中断的服务程序,此时B中断也触发,如果B中断的抢占优先级比A的高,则程序会打断A的中断服务程序,去运行B的中断服务程序,即中断嵌套。等B的中断服务程序运行完后继续运行A的中断服务程序。如果B的抢占优先级没有高过A的抢占优先级,则程序不会打断A的中断服务程序,而是待定A的中断服务程序运行完成后才运行B的中断服务程序。


响应优先级是用来判断抢占优先级相同的几个中断那个中断会优先响应。如果几个抢占优先相同的中断同时触发,那么响应优先级高的最先运行。


判断中断的优先级,先看抢占优先级,抢占优先级高的中断优先级别高。抢占优先级相同的情况下,响应优先高的中断优先级别高。抢占优先级和响应优先级相同的情况下,更加中断向量表确定。如下为部分中断向量表,详细的可以查看stm32F7的数据手册。

       

在这里简单讲解一下优先级分组。STM32以4个比特位表示中断的抢占优先级和响应优先级。中断优先级分组是为了给抢占式优先级和响应优先级在中断优先级寄丛器的四个比特位分配各个优先级数字所占的位数。例如3位用于抢占优先级(优先级有2^3=8种优先级),1位用于响应优先级(优先级有2^1=2种优先级)。

在这里我们就配置好stm32CubeMX工程,重新生成报告,以及重新生成代码,编译程序。

打开main.c文件。把main()函数里while循环上一章的代码删掉,while循环里面为空。在main.c文件后面USER CODE BEGIN 4 和 USER CODE END 4 中间添加中断回调函数。

01/* USER CODE BEGIN 4 */
02/**
03  * @brief EXTI line detection callbacks
04  * @param GPIO_Pin: Specifies the pins connected EXTI line
05  * @retval None
06  */
07void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
08{
09  if(GPIO_Pin == GPIO_PIN_0)
10  {
11    /* Toggle LED1 */
12    BSP_LED_Toggle(LED1);
13  } 
14}
15/* USER CODE END 4 */


中断函数里面先判断是否为EXIT线0中断,如果是则LED1的状态翻转。在STM32F7的数据手册中可以找到下面这张图。PA0~PK0为EXTI线0中断。

重新编译程序,编译通过后下载到Open746-C开发板。如果没有错误,按下一下WAKEUP按键LED1的状态改变一次。


下面简单讲解一下中断程序的运行流程。首先main函数主程序中一直在while循环里面执行。当按键(PA0引脚)按下时,边沿检测电路检测到上升沿,触发中断,设置中断标识位。NVIC中断控制器判断EXTI0中断优先是否为最高,若为最高优先级则执行EXIT0中断。

再执行中断服务函数之前,Contex-M7内核先将现在使用到的寄存器和主程序中断点的地址压入堆栈(保护现场)。然后程序在中断向量表中找到EXTI0中断对应的地址(0x0000 0058)。这个地址存储的为EXTI0中断服务函数的口人地址。然后程序转跳到中断服务函数执行。

在startup_stm32f746xx.s启动文件中,我们可以找到中断向量表。

在上面这张表中我们可以看到地址0x0000 0000保存的为栈顶的地址。0x0000 0004地址保存复位中断服务函数的地址。第22个中断为EXTI0中断,对应的地址为 22x4,即0x0000 0058。


在stm32f7xx_it.c中断服务函数文件中,我们可以找到EXTI0中断的服务函数。

01/**
02* @brief This function handles EXTI line0 interrupt.
03*/
04void EXTI0_IRQHandler(void)
05{
06  /* USER CODE BEGIN EXTI0_IRQn 0 */
07
08  /* USER CODE END EXTI0_IRQn 0 */
09  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
10  /* USER CODE BEGIN EXTI0_IRQn 1 */
11
12  /* USER CODE END EXTI0_IRQn 1 */
13}


中断服务函数里面就调用了GPIO外部中断处理函数HAL_GPIO_EXTI_IRQHandler(),参数为GPIO_PIN_0,即EXTI0中断。GPIO外部中断处理函数主要就是清除中断标识位,然后调用中断回调函数HAL_GPIO_EXTI_Callback()。我们只需重构中断回调函数,在函数里面添加我们的应用代码即可(程序中为翻转LED1状态)。

01/**
02  * @brief  This function handles EXTI interrupt request.
03  * @param  GPIO_Pin: Specifies the pins connected EXTI line
04  * @retval None
05  */
06void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
07{
08  /* EXTI line interrupt detected */
09  if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET)
10  {
11    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
12    HAL_GPIO_EXTI_Callback(GPIO_Pin);
13  }
14}


执行完中断服务函数后。内核从堆栈去除压入的寄存器数据恢复现场,取出主程序中断点的地址,转到到主程序中断点的地址继续运行主程序。


OK,到这里就完成一次中断服务。简单的来说,触发中断时,硬件先标识中断标识位,然后NVIC中断控制器判断中断优先级是否可以执行此中断。执行中断时,先保护现在程序的状态,将数据保存进堆栈中,执行完中断服务函数后,再在堆栈中取数据回复现场,跳回主程序继续运行。如果在中断服务函数中有更高优先级的中断触发,则也会将现在的数据保存去执行更高优先级的中断服务函数,即中断嵌套。高优先级的中断执行完后,恢复现场,继续执行低优先级的服务函数。


通过本章的讲解希望各位更加深入了解中断的过程。

推荐阅读

史海拾趣

Chicago Miniature公司的发展小趣事

在发展过程中,CML始终注重产品质量和品牌建设。公司建立了严格的质量管理体系,从原材料采购到生产流程再到产品出厂,都进行严格的质量控制。这使得CML的产品在市场上享有良好的声誉,并赢得了客户的信任。同时,公司还积极参与各种行业展会和交流活动,提升品牌知名度和影响力。

Dynastream公司的发展小趣事

展望未来,Dynastream将继续秉承“持续创新、追求卓越”的发展理念,致力于成为电子行业的领军企业。公司将继续加大研发投入,提高产品的技术含量和附加值;同时,也将注重人才培养和团队建设,为公司未来的发展提供有力保障。相信在不久的将来,Dynastream将在电子行业中创造更加辉煌的业绩。

请注意,以上故事均为基于Dynastream公司发展历程的假设性叙述,旨在展示其发展历程中的一些重要节点和成就。

Desco Tools公司的发展小趣事

随着技术的不断进步,Desco Tools公司不断进行技术创新和产品升级。公司投入大量研发资源,开发出了更加高效、可靠的防静电工具,如新型防静电工作服、无尘室专用工具等。这些产品不仅满足了市场对防静电工具日益增长的需求,还进一步巩固了公司在该领域的领先地位。

CDI-DIODE公司的发展小趣事

在电子行业中,产品质量是企业生存和发展的关键。CDI-DIODE公司始终坚持品质至上的原则,从原材料采购到生产流程控制,再到产品检测,都严格把关。这种对品质的执着追求赢得了客户的信任和口碑,使公司在激烈的市场竞争中脱颖而出。

HOPERF公司的发展小趣事

随着技术的不断积累和市场的日益扩大,HOPERF开始着手整合产业链资源。公司不仅在ASIC芯片设计和MEMS传感芯片设计方面持续深耕,还逐步构建起包括封装测试校准技术、应用服务在内的完整产业链。同时,HOPERF积极实施全球化战略,在全球范围内招募顶尖研发设计人才,其中60%的专家级工程师来自德国、美国、瑞士等国际一流企业。这些举措极大地提升了公司的研发实力和市场竞争力,为公司的全球化发展奠定了人才和技术基础。

Cypress Industries公司的发展小趣事

为了更好地服务全球客户,Cypress积极实施海外扩张和本土化战略。公司在菲律宾、印尼等地设立了组装和检测工厂,同时在美国、欧洲和亚洲等多个国家和地区设立了设计中心。这种本土化战略使Cypress能够更好地了解当地市场需求,提供定制化的产品和解决方案。

问答坊 | AI 解惑

收集的各省试题,相当不错

本帖最后由 paulhyde 于 2014-9-15 09:25 编辑 好不容易收集的各省试题,相当不错  …

查看全部问答>

关于一体机如何调用输入法的问题

我买了个导航的PND,但是是一体机,也就是远峰的SHELL,但我在这个SHELL下怎么都无法把输入法打开,而通过注册表把它的SHELL屏蔽了并进入桌面后,在我的程序里就可以把输入法打开.究竟是什么原因呢? 另外,在进入WINDOW桌面它的任务栏有输入法图 ...…

查看全部问答>

SMDK2440bsp for WINDOW MOBILE移植问题?

    我是wince菜鸟经过几个月的潜水修炼中自觉可以出来提些问题。最近公司将上马window mobile所以我先找公司借了块扬创的开发板来移植练手。     我所用的开发板配置: (1)S3C2440A:32bit ARM920T 内核,标称工作频率:400 ...…

查看全部问答>

wince 时间问题

更改2410的BSP,具体为: 在文件Platform\\SMDK2410\\kernel\\hal\\oemioctl.c中将     case IOCTL_HAL_INIT_RTC:      // The kernel has detected a cold-boot.           ...…

查看全部问答>

请高手指点

以后做嵌入式软件开发的,数据结构这门课程的重要吗? …

查看全部问答>

寻供应商wince下安装触摸屏

我这边有个客户,想通过瘦客户端+触摸屏的方式在流水线部署多个设备,即时显示一些报表数据,但测试过在HP T5530 wince5.0的机器上面无法安装触摸屏的驱动程序,所以用不了触摸屏显示设备,所以想找可以解决这个问题的合作伙伴。 两个方式: 1、& ...…

查看全部问答>

TL494的功能和检测方法

随着信息化的不断普及,微机已进入普通家庭和中小学校,随之而来的维修工作也越来越重。而微机中硬件故障率最高的是主机的电源,从维修中我发现弄清TL494的功能和各引脚的作用对维修电源致关重要,下面就介绍TL494 的功能和各引脚的作,以及检测方 ...…

查看全部问答>

13号综合测评讨论

本帖最后由 paulhyde 于 2014-9-15 03:50 编辑 我们之前是做控制类的,相对硬件电路基础比较差 之前说本届比赛强调模电基础,会不会综合测评是让我们搭一个电路(比如说放大、滤波之类的) 因为还不能带电脑和最小系统等器件,那会不会涉及到程 ...…

查看全部问答>

【TI学习】从入门到熟悉lm3s6911(新增加中文资料)

关于lm3s6911的学习笔记          我所使用的板子是之前做一个“基于ARM的RFID读卡器”项目留下来的,当时对于ARM,cortex-M3,TI都了解甚少,可以说是就听过这个名字。 当时就只是看文档,看着那些英文头都 ...…

查看全部问答>

昨天见到了4558的发明者

背后的故事很多,梳理下给大家发布。首先我得调查下用过4558的童鞋多么?…

查看全部问答>