STM32使用HAL库操作外部中断——理论讲解

简介: STM32使用HAL库操作外部中断——理论讲解

.中断触发过程
对主程序压栈——把中断服务函数的地址写入到程序计数器(PC)——执行中断服务函数

2.中断向量表
中断服务函数的地址在STM32的手册上的中断向量表中(如下是一部分):

如上表所示,EXTI0中断服务函数的地址是0x00000058。意思就是如果触发了外部中断那么就从0x00000058地址开始执行,这个地址的函数可以在HAL库的启动文件中找到。

很明显,EXTI0的中断服务函数的函数名是:EXTI0_IRQHandler

EXTI0~EXTI4是独立的,9~5共用中断源,15~10共用中断源,9~5和15~10的中断需要在中断函数中判断是哪个中断引脚。

3.HAL库中的中断服务函数。
这里我们要用PD10引脚触发外部中断,根据向量表,EXTI10的中断服务函数是:EXTI15_10_IRQHandler。

HAL库中代码是这样执行的:

(1)首先是中断服务函数

PD10外部中断触发之后程序计数器被写入0x000000E0(EXTI15_10_IRQHandler函数的地址)

然后程序开始执行EXTI15_10_IRQHandler函数:

EXTI15_10_IRQHandler函数只是调用了另一个函数HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_10);

在这个函数中清楚中断标志位然后又调用了一个HAL_GPIO_EXTI_Callback(GPIO_Pin)函数。

根据函数名Callback也能看出来这里才是真正执行具体功能的函数,该函数需要用户在mian.c文件中重写:

4.NVIC中断控制器
步骤1-3说明了一个最基本的中断过程。然而还有一个重要的概念没有讲到,NVIC中断控制器。

STM32支持中断嵌套,为了更好的更强大的实现中断嵌套,ST给出了一个NVIC中断控制器来专门管理中断。我们都知道高优先级的中断能打断低优先级的中断优先执行,等高优先级中断执行完之后在返回去执行被打断的中断,这就是中断嵌套。那么如果同时有两个同样优先级的中断出现呢?

于是STM32所有中断都有两个优先级:抢占优先级和副优先级。(英文是 preempition priority和sub priority)

判断中断的优先级,先看抢占优先级,抢占优先级高的中断优先级别高。抢占优先级相同的情况下,先执行副优先高的的。抢占优先级和响应优先级相同的情况下,根据中断向量表确定。

在Cube中配置NVIC如下图

上图所示,使能EXIT line[15:10]中断,抢占优先级是0,副优先级也是0。

那么,共有多少个抢占优先级多少个副优先级呢?

这就要涉及到另一个概念优先级分组了:

上图中的“4.优先级分组”中显示的是2bit for preemption priority,什么意思呢?

STM32以4个比特位表示中断的抢占优先级和副优先级

在这里可以为抢占优先级分配几个bit位。

怎么用呢?举个栗子就很明白了:

假如我设置 3 bit for preemption priority,那么抢占优先级就有2的3次方(8)个优先级,于是副优先级就有2的1(4-3)次方(2)个。如下两个图

相关文章
|
1月前
stm32f407探索者开发板(十七)——串口寄存器库函数配置方法
stm32f407探索者开发板(十七)——串口寄存器库函数配置方法
170 0
|
2月前
使用STM32F103标准库实现定时器控制LED点亮和关闭
通过这篇博客,我们学习了如何使用STM32F103标准库,通过定时器来控制LED的点亮和关闭。我们配置了定时器中断,并在中断处理函数中实现了LED状态的切换。这是一个基础且实用的例子,适合初学者了解STM32定时器和中断的使用。 希望这篇博客对你有所帮助。如果有任何问题或建议,欢迎在评论区留言。
158 2
|
2月前
|
IDE 开发工具
使用STM32F103标准库实现自定义键盘
通过本文,我们学习了如何使用STM32F103标准库实现一个简单的自定义键盘。我们首先初始化了GPIO引脚,然后实现了一个扫描函数来检测按键状态。这个项目不仅能够帮助我们理解STM32的GPIO配置和按键扫描原理,还可以作为进一步学习中断处理和低功耗设计的基础。希望本文对你有所帮助,祝你在嵌入式开发的道路上不断进步!
294 4
|
2月前
|
存储 数据采集 数据安全/隐私保护
使用STM32F103读取TF卡并模拟U盘:使用标准库实现
通过以上步骤,你可以实现用STM32F103将TF卡内容变成U盘进行读取。这种功能在数据采集、便携式存储设备等应用中非常有用。如果你有更多的需求,可以进一步扩展此项目,例如添加文件管理功能、加密存储等。希望这篇博客能帮到你,如果有任何问题,欢迎在评论区留言讨论!
67 1
|
1月前
|
传感器 编解码 API
【STM32开发入门】温湿度监测系统实战:SPI LCD显示、HAL库应用、GPIO配置、UART中断接收、ADC采集与串口通信全解析
SPI(Serial Peripheral Interface)是一种同步串行通信接口,常用于微控制器与外围设备间的数据传输。SPI LCD是指使用SPI接口与微控制器通信的液晶显示屏。这类LCD通常具有较少的引脚(通常4个:MISO、MOSI、SCK和SS),因此在引脚资源有限的系统中非常有用。通过SPI协议,微控制器可以向LCD发送命令和数据,控制显示内容和模式。
|
3月前
|
传感器
|
2月前
|
传感器
【经典案例】STM32F407使用HAL库配置I2C详解
STM32F407是一个强大的微控制器,广泛应用于嵌入式系统中。在许多应用中,我们需要使用I2C总线来与传感器、EEPROM、显示屏等外设进行通信。本文将详细介绍如何使用STM32 HAL库来配置和使用I2C接口。
224 2
|
2月前
|
开发者
【经典案例】使用HAL库配置STM32F407的SPI外设
在嵌入式系统开发中,STM32F407是一款广泛应用的微控制器,而SPI(Serial Peripheral Interface)是一种常用的通信接口。本文将详细介绍如何使用STM32的硬件抽象层(HAL)库配置STM32F407的SPI外设,并提供完整的代码示例。
133 1