STM32F0单片机快速入门五 GPIO中断

简介: STM32F0单片机快速入门五 GPIO中断

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.sEXTI4_15_IRQHandler(void)     <-stm32f0xx_it.cHAL_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个中断向量。


外部中断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

相关文章
|
6月前
|
传感器 编解码 数据处理
毕业设计|基于STM32单片机的水位浑浊度检测设计
毕业设计|基于STM32单片机的水位浑浊度检测设计
787 0
|
6月前
|
存储
STM32F103标准外设库——GPIO 输入、输出 (五)
STM32F103标准外设库——GPIO 输入、输出 (五)
346 0
STM32F103标准外设库——GPIO 输入、输出 (五)
|
24天前
|
传感器 监控 JavaScript
千套单片机\stm32毕设课设题目及资料案列-干货分享
为帮助电子工程领域的学习者顺利毕业或掌握更多专业知识,我们精心整理了一系列单片机和STM32相关的题目及资料案例。这些资源覆盖了从毕业设计到课程设计的各个方面,包括但不限于智能小车、温度控制系统、无线通信、智能家居等多个领域。每项设计都配有详细的原理图、仿真图以及完整的文档资料,旨在帮助学生深入理解理论知识的同时,提高实际动手操作能力。无论是初学者还是有一定基础的学生,都能从中找到适合自己的项目进行实践探索。
92 8
|
4月前
stm32f407探索者开发板(八)——按键输入实验--GPIO做输入
stm32f407探索者开发板(八)——按键输入实验--GPIO做输入
|
4月前
|
传感器 编解码 API
【STM32开发入门】温湿度监测系统实战:SPI LCD显示、HAL库应用、GPIO配置、UART中断接收、ADC采集与串口通信全解析
SPI(Serial Peripheral Interface)是一种同步串行通信接口,常用于微控制器与外围设备间的数据传输。SPI LCD是指使用SPI接口与微控制器通信的液晶显示屏。这类LCD通常具有较少的引脚(通常4个:MISO、MOSI、SCK和SS),因此在引脚资源有限的系统中非常有用。通过SPI协议,微控制器可以向LCD发送命令和数据,控制显示内容和模式。
143 0
|
5月前
|
Web App开发 传感器 Linux
【嵌入式软件工程师面经】STM32单片机
【嵌入式软件工程师面经】STM32单片机
121 1
|
5月前
经验大分享:STM32F4寄存器初始化系列:GPIO
经验大分享:STM32F4寄存器初始化系列:GPIO
29 0
|
6月前
|
存储
MCS-51单片机的中断源
MCS-51单片机的中断源
168 1