Stm32中EXTI的作用

EXTI片上外设

EXTI简介

EXTI中文名字是外部中断,检测指定的引脚的电平的变化,一旦发生了电平变化,EXTI则会产生中断,这个中断会传送到NVIC哪里去。NVIC是stm32中断的管理设备。

关于中断和事件:

  • 中断,由于 stm32 中的中断最终的管理者是 NVIC 所以,中断是需要进入 NVIC 进行处理的。
  • 事件,不需要进入 NVIC ,仅用于内部硬件自动控制的,如:TIM、DMA等等

所以,EXTI的作用可以看作是管理芯片内外部事件的中断

EXTI的物理结构

由以上图可以看出EXTI如何使用,首先通过GPIO来输出信号,通过AFIO来选择一个信号并且将其输出至EXTI,交由EXTI同一管理。

AFIO的作用

  1. AFIO主要用于引脚复用功能的选择和重定义
  2. 在STM32中,AFIO主要完成两个任务:复用功能引脚重映射、中断引脚选择

结构框图:

  1. 调试IO配置,JTAG/SWD的开关状态
  2. 重映射配置,部分外设IO重映射配置
  3. 外部中断配置,配置 EXTI 中断线 0-15 对应到哪个具体IO口

AFIO相关函数

1
2
3
4
void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);//配置AFIO输出事件信号,而不是
void GPIO_EventOutputCmd(FunctionalState NewState);//使能中断事件信号
void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);//AFIO引脚重映射
void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);//选择EXTI所连接的中断线,实际上就是上面有颜色框图的最左边

EXTI的作用

会向NVIC申请中断,通过NVIC的裁决后,判断是否中断,如何中断。所以EXTI的作用是检测作用。当有指定的情况发生时,EXTI会产生中断信号发送至NVIC

同时,EXTI不仅仅可以产生中断信号。还可以产生一个事件信号。事件信号就是不在通知cpu,而是去通知一个外设。这个事件信号就是外设之间的协调配合所使用的。而中断信号就是去通知cpu的。

下面是EXTI的内部结构图

怎么看这个结构图:

  • 箭头、线上面的20表示有一样的20根线

产生中断线路目的是把输入信号输入到NVIC,进一步会运行中断服务函数,实现功能,这样是软件级的。而产生事件线路目的就是传输一个脉冲信号给其他外设使用, 并且是电路级别的信号传输,属于硬件级的。

EXTI的特点:
每一条 EXTI 线都可以单独配置,并且可以选择类型(中断或是事件)并且 EXTI 的所有输出只有两条路径,一条是中断输出(至NVIC),一条是事件输出(至其他外设)。只是中断的使用多于使用事件。

stm32中的中断路线

GPIO/其他外设->AFIO/SYSCFG->EXIT->NVIC->CUP

EXTI和NVIC片上外设之间的关系

EXTI来进行检测,检测到信号以后发送给NVIC。由NVIC来进行处理。

EXTI是外部中断/事件控制器,主要用来通过电平的变化来产生外部中断。之后发给NVIC。

EXTI编程

首先,我们需要了解中断的配置步骤:

EXTI的初始化结构

1
2
3
4
5
6
typedef struct {
uint32_t EXTI_Line; // 中断/事件线
EXTIMode_TypeDef EXTI_Mode; // EXTI模式
EXTITrigger_TypeDef EXTI_Trigger; // EXTI边沿触发事件
FunctionalState EXTI_LineCmd; // EXTI使能
} EXTI_InitTypeDef;

详细解释:

  • EXTI_Line:EXTI中断/事件线选择,可选EXTI0至EXTI19,可参考表 EXTI中断_事件线 选择。

  • EXTI_Mode:EXTI模式选择,可选为产生中断(EXTI_Mode_Interrupt)或者产生事件(EXTI_Mode_Event)。

  • EXTI_Trigger:EXTI边沿触发事件,可选上升沿触发(EXTI_Trigger_Rising)、 下降沿触发( EXTI_Trigger_Falling)或者上升沿和下降沿都触发( EXTI_Trigger_Rising_Falling)。

  • EXTI_LineCmd:控制是否使能EXTI线,可选使能EXTI线(ENABLE)或禁用(DISABLE)。

相关函数

1
2
3
4
5
6
7
8
void EXTI_DeInit(void);//将EXTI的配置全部清除
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);//初始化EXTI配置
void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct);//使用默认的参数来初始化EXTI
void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line);//创建一个软件中断
FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line);//获取状态位
void EXTI_ClearFlag(uint32_t EXTI_Line);//清除状态位
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);//这个函数一般在中断函数中使用,当然上面这个函数也可以在中断中使用,但是st公司为我们选配了两个选择所以我们最好按照规则来
void EXTI_ClearITPendingBit(uint32_t EXTI_Line);//清除状态位

中断服务函数的定义

所有的中断服务函数都需要定义在stm32f10x_it.c,并且所有的中断函数名字都是确定的, 这是由于arm公司确定了中断向量表, 我们可以在startup_stm32f10x_hd.s中找到, 当然这个需要根据自己的stm32芯片来选择.


Stm32中EXTI的作用
https://ysc2.github.io/ysc2.github.io/2023/11/21/Stm32中EXTI的作用/
作者
Ysc
发布于
2023年11月21日
许可协议