今天小白我将带领大家详细介绍 STM32 单片机中的中断处理机制, 包括中断的基本概念, 配置和使用方法. 中断在嵌入式系统中扮演着重要角色, 使系统能够快速响应外部事件, 提高系统的实时性和效率.
中断 (Interrupt) 是单片机和其他嵌入式系统中的一种重要机制, 用于在发生特定事件时通知处理器. 中断使得可以由外部事件 (如按键按下, 定时器溢出等) 触发, 也可以由软件生成.
STM32 单片机基于 ARM Cortex-M 内核, 具有高度可配置的中断控制器 (NVIC, Nested Vectored Interrupt Controller). NVIC 支持多达 240 个中断源. 包括外部中断 (如 GPIO 中断, 定时器中断, 通信接口中断等.
STM32 信号 | 内核中断 | 外部中断 | 中断优先级 |
---|---|---|---|
STM32F103xx | 10 | 60 | 16 |
STM32F407xx | 10 | 82 | 16 |
STM32F429xx | 10 | 91 | 16 |
STM32F750xx | 10 | 98 | 16 |
STM32F767xx | 10 | 110 | 16 |
STM32H743xx | 10 | 150 | 16 |
STM32H750xx | 10 | 150 | 16 |
NVIC (Nested Vectored Interrupt Controller), 嵌套向量中断控制器. NVIC 是 ARM Cortex-M 系列单片机中的一种高级中断控制器.
NVIC 的一些基本概念:
中断向量表 (Interrupt Vector Table) 是一种数据结构, 用于存储中断处理函数的地址信息. 在单片机中, 每个中断源都与中断向量表中的一个条目相关联. 当中断事件发生时, 单片机控制器会根据中断向量表中的信息转跳到相应的中断处理函数执行.
中断向量表的相关概念:
NVIC 相关寄存器介绍:
NVIC 相关寄存器 | 位数 | 寄存器个数 | 备注 |
---|---|---|---|
中断使能寄存器 (ISER) | 32 | 8 | 每个位控制一个中断 |
中断失能寄存器 (ICER) | 32 | 8 | 每个位控制一个中断 |
应用程序中断及复位控制器 (AIRCR) | 32 | 1 | 位[10:8] 控制优先级分组 |
中断优先级寄存器 (IPR) | 8 | 240 | 8 个位对应一个中断, 而 STM32 只使用高 4 位 |
例子:
编号 | 自然优先级 | 对应外设 | 抢占 | 响应 |
---|---|---|---|---|
3 | 10 | RTC | 2 | 1 |
6 | 13 | EXIT0 | 3 | 0 |
7 | 14 | EXIT | 2 | 0 |
-1 | 6 | Systick | 3 | 0 |
在单片机中, 外部中断 (EXTI, External Interrupt/Event Controller) 是一种重要的硬件属性. EXTI 使单片机能够对外部事件做出快速响应.
在 STM32 单片机中, EXTI 是一种特殊的中断来源, 可以通过外部引脚触发, 或者通过软件生成. 每个 EXTI 线路都可以独立配置为上升沿触发, 下降沿触发或者双边沿触发. 此外, EXTI 还支持事件生成, 既不产生中断, 但能触发 DMA 请求.
中断和事件:
配置 STM32 的 EXTI 通常需要以下步骤:
EXTI 的 HAL 库设置步骤:
在 STM32 单片机中, AFIO (Alternate Function I/O) 模块是一个重要的硬件模块, 负责管理 STM32 的多功能引脚.
在 STM32 单片机中, AFIO (Alternate Function I/O) 模块不仅负责管理多功能引脚, 也负责配置外部中断线 EXTI (External Interrupt/Event Controller) 的源. 举个例子, 每个外部中断线可以由多个 GPIO 引脚之一触发, 选择哪个 GPIO 引脚取决于 AFIO 模块的配置.
STM32 的外部中断源与 GPIO 引脚的关联是固定的. 例如 EXTI0 可以由任何一组 Px0 引脚触发. AFIO 模块的 EXTI 配置寄存器 (AAFIO_EXTICR)决定了具体由哪一个 GPIO 引脚触发对应的中断.
#include "./stm32f1xx_it.h"
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./BSP/BEEP/beep.h"
#include "./BSP/EXTI/exti.h"
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
delay_init(72); /* 延时初始化 */
usart_init(115200); /* 串口初始化为115200 */
led_init(); /* 初始化LED */
beep_init(); /* 初始化蜂鸣器 */
extix_init(); /* 初始化外部中断输入 */
LED0(0); /* 先点亮红灯 */
while (1)
{
printf("OK\r\n");
delay_ms(1000);
}
}