STM32单片机EXTI模块详解

​ STM32的EXTI(外部中断/事件控制器、External Interrupt/Event Controller)模块是一个功能强大的外设,用于处理外部中断和事件。它允许微控制器在外部信号发生变化时触发中断或事件,从而实现对外部事件的快速响应。本文是对STM32单片机的 EXTI模块的详细介绍,希望能为读者提供帮助。


1. EXTI模块

​ EXTI模块允许STM32的GPIO引脚配置为外部中断源。当外部信号发生变化时,EXTI可以触发中断,使CPU暂停当前任务,转而处理中断事件。

AFIO(备用功能输入输出、Alternate Function I/O)

​ AFIO是STM32微控制器中的一个特殊功能模块,它主要用于配置GPIO引脚的备用功能,实现引脚的复用和重映射。此处AFIO负责将GPIO引脚映射到外部中断线(EXTI),使得所有GPIO引脚都能作为外部中断的输入源。但需注意,引脚的端口(Port)可以不同但引脚号(Pin Number)不能相同(例如PA1和PB1不能同时做为输入源)。

中断触发方式

​ 每个EXTI线可以独立配置为上升沿触发、下降沿触发、双边沿触发或软件触发。

触发方式 效果
上升沿触发 只有在信号从低到高变化时,才会触发中断。 信号保持高电平或低电平时,不会触发任何操作。
下降沿触发 只有在信号从高到低变化时,才会触发中断。 信号保持高电平或低电平时,不会触发任何操作。
双边沿触发 无论信号是上升还是下降,都会触发中断。 信号保持高电平或低电平时,不会触发任何操作。
软件触发 通过设置EXTI的软件中断寄存器(EXTI_SWIER)来模拟硬件信号触发的中断

​ 由前三种触发方式可知,EXTI仅检测信号的变化状态,不检测信号的初始状态或保持状态。但由于大部分元件都遵循常态上拉,触发下拉的原则。因此GPIO接口建议设为上拉输入、或是浮空输入。

通道数

​ STM32支持最多16个GPIO中断线(EXTI0到EXTI15),外加PVD输出、RTC闹钟、USB唤醒、以太网唤醒。

NVIC优先级分组

​ NVIC的中断优先级由优先级寄存器的4位(0~15)决定,这4位可以进行切分,形成五组分组方式,分为高n位的抢占优先级和低4-n位的响应优先级。**数值越小,优先级越高。**抢占优先级高的可以中断嵌套,响应优先级高的可以优先排队,抢占优先级和响应优先级均相同的按中断号排队。

  • 中断号(Interrupt Number):标识STM32微控制器中不同中断源的编号。每个中断源都有一个唯一的中断号,这些中断号在中断向量表中对应着特定的中断服务程序(ISR)入口地址。STM32 的启动文件(通常是 startup_stm32f10x.s 或类似的文件名)中包含了中断向量表。
分组方式 抢占优先级 响应优先级
分组0 0位,取值为0 4位,取值为0~15
分组1 1位,取值为0~1 3位,取值为0~7
分组2 2位,取值为0~3 2位,取值为0~3
分组3 3位,取值为0~7 1位,取值为0~1
分组4 4位,取值为0~15 0位,取值为0

2. EXTI模块的工作流程

  1. 边沿检测:每个EXTI线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿检测。

  2. 中断触发:当检测到指定的边沿信号时,EXTI会向NVIC发出中断申请,经过NVIC裁决后即可中断CPU主程序。若同时有多个中断申请,则NVIC会根据优先级配置决定优先执行哪个函数。

  3. 中断服务函数:在中断服务函数中处理中断事件,如读取GPIO引脚状态、更新计数值等。


3. EXTI的配置步骤

以下是配置EXTI的基本步骤:

3.1 启用GPIO和AFIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
3.2 配置GPIO引脚

将GPIO引脚配置为输入模式:

GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入
GPIO_Init(GPIOA, &GPIO_InitStructure);
3.3 配置EXTI线

将GPIO引脚映射到EXTI线,并设置触发条件:

GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line = EXTI_Line0;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; // 下降沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
3.4 配置NVIC

设置中断优先级并使能中断:

NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
3.5 编写中断服务函数

在中断服务函数中处理中断事件:

void EXTI0_IRQHandler(void)
{
    if(EXTI_GetITStatus(EXTI_Line0) == SET)
    {
        // 处理中断事件
        EXTI_ClearITPendingBit(EXTI_Line0); // 清除中断标志位
    }
}
  • EXTI_GetITStatus:用于检查EXTI线的中断标志位。如果返回SET,表示该EXTI线已经触发了中断。注意:此处的SET不代表该位为高电平,仅代表中断被触发。
  • EXTI_ClearITPendingBit:用于清除EXTI线的中断标志位,避免重复触发中断。

4. EXTI的事件功能

​ STM32的EXTI模块不仅支持中断响应,还支持事件响应。事件响应不会触发中断,而是触发其他外设的操作,例如启动ADC转换或DMA操作。


如有错误,欢迎批评指正!

你可能感兴趣的:(STM32单片机基础,单片机,stm32,嵌入式硬件)