STM32F0单片机如何用一个GPIO引脚来触发中断

发布者:HappyExplorer最新更新时间:2024-05-10 来源: elecfans关键字:STM32F0  单片机  GPIO  触发中断 手机看文章 扫描二维码
随时随地手机看文章

1. 按键如何触发中断

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


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

STM32Cube_FW_F0_V1.11.0ProjectsSTM32F030R8-NucleoExamplesGPIOGPIO_EXTIMDK-ARMProject.uvprojx

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

poYBAGL0dQuADHVPAACEzR_lGo8262.png?imageView2/2/w/1000

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

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

pYYBAGL0dSSAOr_jAAD-tegA2iw829.png?imageView2/2/w/1000

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

2. 回调函数

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

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

pYYBAGL0dT-ALExrAAB_VTSltZU096.png?imageView2/2/w/1000

那我们回到程序,看一下应用程序(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个中断向量。

pYYBAGL0dViAWge0AADLtzGx2Ec974.png?imageView2/2/w/1000

RM0360 STM32F030 Reference manual

外部中断0至15

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

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

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

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

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

poYBAGL0dXKAAnMIAAEaBvvciz8676.png?imageView2/2/w/1000

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

相关寄存器介绍:

pYYBAGL0dY-ADxwWAADGwz1YYUc923.png?imageView2/2/w/1000

一共有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可以清除此标志位。

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


关键字:STM32F0  单片机  GPIO  触发中断 引用地址:STM32F0单片机如何用一个GPIO引脚来触发中断

上一篇:基于STM32F030对24LC02进行代码读写
下一篇:stm32多线程 单片机如何实现多线程

推荐阅读最新更新时间:2026-03-22 03:18

【51单片机快速入门指南】3.1:配置外部中断触发方式和中断优先级
普中51-单核-A2 STC89C52 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 源码 stdint.h见【51单片机快速入门指南】1:基础知识和工程创建 中断知识见【51单片机快速入门指南】3:中断系统 将外部中断0和外部中断1均配置为下降沿触发,但外部中断1的优先级最高,外部中断0的优先级最低。 EXTI.c #include REGX52.H #include intrins.h #include stdint.h #include EXTI.h //定义LED管脚 sbit D1 = P2^0; sbit D2 =
[单片机]
【51<font color='red'>单片机</font>快速入门指南】3.1:配置外部<font color='red'>中断</font><font color='red'>触发</font>方式和<font color='red'>中断</font>优先级
STM8L151C8单片机学习例程(6)——外部中断上升沿触发
STM8L_6_EXIT: 1.User:工程及main文件 2.Hardware:EXIT,CLK,LED,Delay 3.STM8L15x_StdPeriph_Driver:STM8自带库文件 4.Debug:hex文件存放于EXE文件夹 5.Function: 外部中断上升沿触发,翻转LED /** ****************************************************************************** * @file main.c * @author Alex——小白 * @version V1.0 * @date 2019
[单片机]
STM8L151C8<font color='red'>单片机</font>学习例程(6)——外部<font color='red'>中断</font>上升沿<font color='red'>触发</font>
关于STM32系列单片机中断触发时间问题
在使用STM32系列单片机的时候,经常要使用到中断,但是STM32参考手册上关于中断只说明了有哪些中断源和中断向量表相关问题。没有具体说明触发中断的信号至少需要多长时间?中断检测到中断源需要多长时间? 在看 ARM Cortex-M3 Cortex-M4权威指南 这本书的时候,上面提到了这两个问题。于是赶紧记录下来,以备以后需要时查看。 在权威指南的第74页说明了,ARM Cortex-M3 Cortex-M4内核的单片机中断等待需要12个周期。也就是说触发中断后,需要12个时钟周期,才能被系统识别到,并去处理。假如单片机时钟周期为72Mhz,那么检测中断的周期就为72/12=6MHz。 中
[单片机]
关于STM32系列<font color='red'>单片机</font><font color='red'>中断</font><font color='red'>触发</font>时间问题
51单片机的外部中断触发方式简介
51单片机的外部中断有两种触发方式可选:电平触发和边沿触发。选择电平触发时,单片机在每个机器周期检查中断源口线,检测到低电平,即置位中断请求标志,向CPU请求中断。选择边沿触发方式时,单片机在上一个机器周期检测到中断源口线为高电平,下一个机器周期检测到低电平,即置位中断标志,请求中断。 这个原理很好理解。但应用时需要特别注意的几点: 1) 电平触发方式时,中断标志寄存器不锁存中断请求信号。也就是说,单片机把每个机器周期的S5P2采样到的外部中断源口线的电平逻辑直接赋值到中断标志寄存器。标志寄存器对于请求信号来说是透明的。这样当中断请求被阻塞而没有得到及时响应时,将被丢失。换句话说,要使电平触发的中断被CPU响应并执行,必须保证
[单片机]
STC15单片机外部中断仅上升沿触发的方法
STC15系列单片机的外部中断0(INT0)和外部中断1(INT1)的触发有两种方式,上升沿和下降沿均可触发方式和仅下降沿触发方式。在实际应用中,有时候需要上升沿触发。这时有两种方案可以解决。 1.将触发方式设置成仅下降沿触发。当外部电路产生一个上升沿时,通过硬件电路加一个三极管进行反向变成下降沿。 2.这种方法不需要改变硬件电路。将触发方式设置成上升沿和下降沿均可触发方式。外部中断产生一个上升沿时,进入中断服务函数,这时在中断服务函数里做进一步处理,检测当前INT0的电平状态。如果是高电平,则判断为上升沿。如果是低电平,则判断为是下降沿。 注意(很重要!): 进入中断服务函数后,一定要延时几个毫秒再去做电平检测。因为不管是
[单片机]
51单片机外部中断触发方式
51单片机的外部中断有两种触发方式可选:电平触发和边沿触发。选择电平触发时,单片机在每个机器周期检查中断源口线,检测到低电平,即置位中断请求标志,向CPU请求中断。选择边沿触发方式时,单片机在上一个机器周期检测到中断源口线为高电平,下一个机器周期检测到低电平,即置位中断标志,请求中断。 这个原理很好理解。但应用时需要特别注意的几点: 1) 电平触发方式时,中断标志寄存器不锁存中断请求信号。也就是说,单片机把每个机器周期的S5P2采样到的外部中断源口线的电平逻辑直接赋值到中断标志寄存器。标志寄存器对于请求信号来说是透明的。这样当中断请求被阻塞而没有得到及时响应时,将被丢失。换句话说,要使电平触发的中断被CPU响应并执行,必须保证外部中
[单片机]
关于51单片机“外部中断触发方式”的经验总结
51单片机的外部中断有两种触发方式可选:电平触发和边沿触发。选择电平触发时,单片机在每个机器周期检查中断源口线,检测到低电平,即置位中断请求标志,向CPU请求中断。选择边沿触发方式时,单片机在上一个机器周期检测到中断源口线为高电平,下一个机器周期检测到低电平,即置位中断标志,请求中断。 这个原理很好理解。但应用时需要特别注意的几点: 1) 电平触发方式时,中断标志寄存器不锁存中断请求信号。也就是说,单片机把每个机器周期的S5P2采样到的外部中断源口线的电平逻辑直接赋值到中断标志寄存器。标志寄存器对于请求信号来说是透明的。这样当中断请求被阻塞而没有得到及时响应时,将被丢失。换句话说,要使电平触发的中断被CPU响应并执行
[单片机]
STM32F0系列MCU硬件电路boot设计
Boot配置的作用是用于选择芯片上电后从何处读取可执行代码运行,STM32F0系列MCU可以从Main flash memory、System memory、Embedded SRAM三个地方boot。 硬件电路设计时可以通过BOOT0这个IO进行设置选择,软件也可以在启动代码里配置nBOOT1、BOOT_SEL和BOOT0这3个bit的值选择boot方式,详细描述可以在STM32F0系列MCU参考手册的第54页的Table 3看到,这里摘录如下图(图一)所示。 (图一) 在常规的设计中,我们都是从Main flash memory启动,所以在硬件设计时一般会在BOOT0这个引脚放一个10kΩ或更大的下拉电阻。 如下图(图
[单片机]
<font color='red'>STM32F0</font>系列<font color='red'>MCU</font>硬件电路boot设计
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved