历史上的今天
返回首页

历史上的今天

今天是:2026年03月17日(星期二)

正在发生

2023年03月17日 | STM32F0单片机快速入门五: GPIO中断

2023-03-17 来源:zhihu

1.按键如何触发中断

我们从一个例程看一下,如何用一个GPIO引脚来触发中断,来控制另一个引脚的翻转去控制LED指示灯。

我们用 Keil 打开下面这个工程:

STM32Cube_FW_F0_V1.11.0ProjectsSTM32F030R8-NucleoExamplesGPIOGPIO_EXTIMDK-ARMProject.uvprojx

编译下载运行此代码,然后按压 B1 USER 这个按键,每一次按压会触发板上一个LED灯翻转一次。这个功能也很简单,但它牵涉到的东西却不少。看一下代码:

上一篇文章讲了如何翻转GPIO引脚,所以现在我们只关注一下如何用一个引脚触发中断吧。main()函数里调用了一个外部中断模块(EXTI)初始化后就进入while循环了。

我们在下面可以找到这个初始化函数的实现。它调用HAL库函数对按键连接的引脚PC13做了初始化,把此引脚初始化为能触发中断的模式。

初始化函数的下面是一个回调函数(Callback Function)。在此函数中翻转了连接LED的引脚。我们接下来分别讲一下这个回调函数和如何把一个GPIO引脚初始化为中断模式。

2.回调函数

回调函数这个概念,解释可以说五花八门,什么原因呢?因为这好像不是一句自然(人)语言(话)。咱们还是打个比方好理解一些。

好比你在厨房做菜,突然发现酱油没了。你叫你儿子去给你打酱油,儿子就是你的驱动。儿子听到你的召唤,说:行啊,老爸,但你得先给我点钱啊!你看,儿子这就是回调(Callback)。一会儿儿子打酱油回来了,然后把酱油交给你,这也是回调。



那我们回到程序,看一下应用程序(Application),驱动(Driver)和回调函数(Callback Function)是什么关系。如果应用程序调用一个驱动,这个驱动在执行前先调用一个函数来获取一些参数,而这些参数需要由应用程序提供,所以此函数位于应用层,它就是一个回调函数。还有一种情况就是驱动执行完毕,通过调用应用层的一个函数返回结果,或通知应用层执行完毕,此函数也是回调函数。

下面就是从中断发生,一直到应用层的回调路径:

B1 USER 按键(连接至PC13引脚)按下,中断发生

EXTI4_15_IRQHandler <-startup_stm32f030x8.s

EXTI4_15_IRQHandler(void) <-stm32f0xx_it.c

HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin) <- stm32f0xx_hal_gpio.c

HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) <-main.c

那么如何才能让PC13触发这个中断呢?

3.GPIO中断引脚配置

MCU是如何把一个引脚电平的变化和一个中断联系起来的呢?我们马上想到给每个GPIO引脚分配一个中断向量就好了。当一个引脚电平变化,马上就可以跳转到自己对应的中断服务程序。这确实是最简单的办法,但MCU一般都有几十个引脚,如果这样做像M0这种内核只支持32个外部中断,根本就不够用的。所以我们看STM32F030仅支持16个外部中断,又在中断向量表中进一步缩减为3个中断向量。

RM0360 STM32F030 Reference manual

外部中断0至15

0,1对应一个中断向量(5号中断);

2,3对应一个(6号中断);

4至15对应一个(7号中断)。

STM32F030的16个外部中断是如何对应到各个引脚上的呢?

这就要通过 EXTI (Extended interrupts and events controller)这个模块。它除了可以完成中断引脚的选择(映射),还可以配置是上升沿还是下降沿触发,也可以屏蔽(Mask)某个引脚。下面的示意图简要的显示了这种关系。

大家注意,图中这些模块虽然都在一个芯片内,但是EXTI是芯片级模块,NVIC是在M0内核之中。

相关寄存器介绍:


一共有4个这样的寄存器:

SYSCFG_EXTICR1,SYSCFG_EXTICR2,SYSCFG_EXTICR3,SYSCFG_EXTICR4

每一个寄存器对应着4个引脚的选择。

下面的这些寄存器都有 32 bits (Bit31 - Bit0),每一个bit对应一个中断。

EXTI_IMR (Interrupt mask register)

0: 屏蔽所对应的中断。1: 允许对应中断。


EXTI_RTSR (Rising trigger selection register)

0: 禁止上升沿触发。1: 使能上升沿触发。


EXTI_FTSR (Falling trigger selection register)

0: 禁止下降沿触发。1: 使能下降沿触发。


如果上升沿和下降沿都设置为1,那么在上升沿和下降沿都会触发中断。

EXTI_PR (Pending register)

0: 没有中断请求。1: 有中断请求。

当中断发生使此寄存器某一位被置1后,在此位写入1可以清除此标志位。


现在大家再返回去,理解代码就会容易一些了。

参考资料:

PM0215 STM32F0xxx Cortex-M0 programming manual

UM1785 Description of STM32F0 HAL and low-layer drivers

STM32F030 Datasheet

STM32F030 Reference Manual


推荐阅读

史海拾趣

ADTech公司的发展小趣事

AdTech公司深知人才是企业发展的核心动力。因此,公司一直致力于培养和引进高素质的人才,打造了一支具有丰富经验和专业技能的团队。公司通过提供良好的工作环境和福利待遇,吸引了一批优秀的研发、市场和管理人才。同时,公司还注重员工的培训和成长,为员工的职业发展提供了广阔的空间。这些措施使得公司的团队更加稳定和高效,为公司的持续发展提供了有力保障。

国炬(GOOGLL)公司的发展小趣事
为了防止电路中的元器件损坏导致负载回路短路,常常在负载回路中转入熔断丝作为保护措施。
芯源半导体(CW)公司的发展小趣事

随着公司产品的逐步成熟,芯源半导体(CW)公司开始寻求与行业内其他企业的合作。经过深入的市场调研和谈判,公司成功与多家知名电子企业建立了战略合作伙伴关系。这些合作伙伴为芯源半导体(CW)公司提供了更多的市场机会和技术支持,使公司得以迅速扩大市场份额,提升品牌影响力。

Concurrent Logic公司的发展小趣事

Concurrent Logic公司的创立源于一群工程师对并行计算和逻辑设计的热爱。在公司成立初期,他们面临着巨大的挑战。由于资金有限,他们不得不在狭小的办公室内开始他们的创新之旅。初创团队的成员们夜以继日地工作,开发并优化他们的第一个产品——一款高性能的并行处理芯片。尽管条件艰苦,但他们的努力和热情为公司的未来奠定了坚实的基础。

广东华裕(GDHY)公司的发展小趣事

随着公司规模的扩大,Concurrent Logic开始寻求国际合作。他们与日本、韩国和欧洲的几家公司签订了技术合作协议,共同开发新一代的并行处理解决方案。这些合作为公司带来了更广阔的市场和更多的资源,推动了技术的进一步创新。

AUREL公司的发展小趣事

在国内市场站稳脚跟后,AUREL公司开始积极拓展国际市场。公司积极参加国际电子展会和技术交流活动,与海外企业建立了广泛的合作关系。同时,公司还针对不同国家和地区的市场需求,推出了定制化的产品和服务。这些举措使得AUREL公司的品牌影响力逐渐扩大,国际市场份额不断攀升。

问答坊 | AI 解惑

夏玄雪(我喜欢的一本书,推荐你看)

我喜欢的一本书,推荐你看 呵呵…

查看全部问答>

疯狂的ISE软件,崩溃了

搞了一段时间ISE,几乎就要崩溃了     最近做个东西,要用到xilinx的ISe开发软件,找了很久,也下载了几个 但都是没法安装,把我搞惨了,哪位朋友能给我发一个不?版本不要太高, ise6.2等级别的,万分感谢了 我的邮箱是317930100@qq ...…

查看全部问答>

啥地方要用到30层PCB?

来自EEWORLD合作群:arm linux fpga 嵌入0(49900581) 群主:wangkj…

查看全部问答>

LED芯片发光简点介绍

LED是T型和N型半导体,三价有电洞,五价提供电子,两者结合中间有空乏区,能够产生能量,光就发出来。由于它是半导体,有能隙,随著参杂元素的不同而产生不同能隙,从氮化镓的3.4eV到磷化铟的1.35eV,波长亦随著改变,而产生出不同的颜色,从紫外光 ...…

查看全部问答>

求菲利浦的 PDIUSBD12 的驱动,和使用方法

用51 + PDIUSBD12 ,实现和 PC通信,固件程序写好了,可是找不到PC winxp的驱动, 求菲利浦的 PDIUSBD12 的驱动,和使用方法。 如果谁知道哪里可以下载麻烦告知一下。也可发我邮箱 yuexianhanshu@yahoo.com.cn 谢了…

查看全部问答>

如何支持media player?

wince5.0,已经把media player相关的组件都加入了,格式支持都加入了,基本上multimedia里面的都加上了。 启动后看到.mpg,.wmv的文件图标改了,.avi的图标没变。 打开.wmv,提示缺少一个解码器,然后只有声音没有图像。 .mpg的都不能打开。试过 ...…

查看全部问答>

用89C2051芯片取代89c51芯片的问题

本人用了89C51写了一个时钟显示程序,硬件电路共有4个单独的数码管显示,P1.1G至P1.7接了数码管的A、B、C、D、E、F、G   P2.3接了显示时的个位数码管DP脚,P2.7、P2.6、P2.5、P2.4分别接了时的十位数码管、时的个位数码管、分的十位数码管、 ...…

查看全部问答>

智能家居系统中国标准

基于EIB标准的智能家居系统,供大家参考…

查看全部问答>

STM32的引脚配置确实灵活!

                                 灵活到让人有点不知所措了!…

查看全部问答>