STM32单片机中断机制揭秘:掌握中断处理流程,提升代码效率
发布时间: 2024-07-01 21:01:32 阅读量: 83 订阅数: 55
![STM32单片机中断机制揭秘:掌握中断处理流程,提升代码效率](https://img-blog.csdnimg.cn/509823d7be834421a341f28adb5146bf.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aW955qEX-a1qeWQjOWtpg==,size_20,color_FFFFFF,t_70,g_se,x_16)
# 1. STM32单片机中断简介**
中断是一种硬件机制,允许外围设备或事件在不影响主程序执行流程的情况下通知CPU。STM32单片机提供了一个强大的中断系统,支持多达100多个中断源。中断处理机制包括中断向量表、中断优先级和中断嵌套,这些机制共同确保了系统对中断事件的快速响应和有序处理。
# 2. STM32 中断处理流程
### 2.1 中断向量表
中断向量表是一个存储在 ROM 中的地址表,它将中断号映射到相应的 ISR(中断服务例程)地址。当发生中断时,CPU 会根据中断号从中断向量表中读取 ISR 地址,并跳转到该地址执行 ISR。
STM32 的中断向量表位于地址 0x0000_0000,它包含 256 个 32 位的地址项,每个地址项对应一个中断号。中断向量表的结构如下:
```
地址 | 中断号 | ISR 地址
------|--------|--------
0x0000_0000 | 0 | ISR0 地址
0x0000_0004 | 1 | ISR1 地址
0x0000_0FFC | 255 | ISR255 地址
```
### 2.2 中断优先级
STM32 的中断具有可配置的优先级,允许用户根据中断的重要性对中断进行排序。中断优先级分为 16 个级别,0 为最高优先级,15 为最低优先级。
当发生多个中断时,CPU 会根据中断优先级选择执行哪个 ISR。优先级较高的 ISR 会先于优先级较低的 ISR 执行。
中断优先级可以通过寄存器 `NVIC_IPR` 进行配置。`NVIC_IPR` 寄存器包含 8 个 32 位的寄存器,每个寄存器对应 32 个中断。每个中断的优先级可以通过设置 `NVIC_IPR` 寄存器的相应位来配置。
### 2.3 中断嵌套
STM32 支持中断嵌套,允许在 ISR 执行期间发生其他中断。当发生嵌套中断时,CPU 会暂停当前 ISR 的执行,并跳转到嵌套 ISR 地址执行。嵌套 ISR 执行完成后,CPU 会返回到原来的 ISR 继续执行。
中断嵌套的优先级由 `NVIC_IPR` 寄存器中的 `SubPriority` 位决定。`SubPriority` 位将中断分为 4 个嵌套级别,0 为最高嵌套级别,3 为最低嵌套级别。
当发生嵌套中断时,CPU 会根据 `SubPriority` 位选择执行哪个嵌套 ISR。`SubPriority` 位较高的 ISR 会先于 `SubPriority` 位较低的 ISR 执行。
# 3.1 中断初始化
在STM32中,中断初始化主要涉及两个方面:中断向量表和中断优先级。
**中断向量表**
中断向量表是一组地址,指向中断服务函数(ISR)的入口点。当发生中断时,处理器会根据中断号从中断向量表中获取ISR的地址,并跳转到ISR执行。
STM32的中断向量表位于0x00000000地址,包含256个32位地址。每个地址对应一个中断号,范围从0到255。
**中断优先级**
中断优先级决定了当多个中断同时发生时,哪个中断会被优先处理。STM32的中断优先级分为4个等级:
* **最高优先级(0):** 无法被其他中断抢占。
* **高优先级(1):** 仅能被最高优先级中断抢占。
* **中优先级(2):** 仅能被最高和高优先级中断抢占。
* **低优先级(3):** 可以被所有其他优先级中断抢占。
中断优先级可以通过设置NVIC(嵌套矢量中断控制器)中的寄存器来配置。
**代码块:中断向量表和优先级初始化**
```c
#include "stm32f10x.h"
// 中断向量表
const uint32_t InterruptVectorTable[] __attribute__((section(".isr_vector"))) = {
// ...
};
// 中断优先级初始化
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
{
// ...
}
```
**逻辑分析:**
* `InterruptVectorTable`数组定义了中断向量表,每个元素对应一个中断号。
* `NVIC_PriorityGroupConfig`函数用于配置中断优先级组,可以设置中断优先级的等级。
### 3.2 中断服务函数
中断服务函数(ISR)是响应中断事件的代码段。ISR的编写遵循以下规则:
* ISR必须以`__attribute__((interrupt))`修饰。
* ISR必须声明为`void`类型,不能有参数。
* ISR必须在中断向量表中注册。
**代码块:中断服务函数示例**
```c
void SysTick_Handler(void) __attribute__((interrupt))
{
// ...
}
```
**逻辑分析:**
* `SysTick_Handler`函数是SysTick中断的ISR。
* `__attribute__((interrupt))`修饰符表明该函数是ISR。
* ISR中可以执行中断处理逻辑,例如更新变量、设置标志位等。
### 3.3 中断处理流程示例
以下是一个中断处理流程示例:
1. **中断发生:** 当发生中断事件时,处理器会暂停当前执行的代码,并跳转到中断向量表中指定的中断服务函数(ISR)。
2. **ISR执行:** ISR执行中断处理逻辑,例如更新变量、设置标志位等。
3. **返回中断:** ISR执行完毕后,处理器会返回到中断发生前的代码执行点。
**代码块:中断处理流程示例**
```c
void SysTick_Handler(void) __attribute__((interrupt))
{
```
0
0