3 EXTI
3.1 EXTI基本概念
External (Extended) interrrupt/evernt controller(EXTI),即外部(拓展)中断事件控制器。F1系列中,EXTI共有19或20条线用于检测中断。
中断与事件的概念:中断需要进入NVIC,需要CPU处理;而事件不需要进入NVIC,仅用于内部硬件自动控制。
3.2 EXTI线映射
EXTI0 ~ EXTI15:对应GPIO0到15号引脚
EXTI16:连接PVD(可编程电压检测器)输出
EXTI17:连接到RTC(实时时钟)事件
EXTI18:连接到USD唤醒事件
EXTI19:仅存在于F105/107产品,用于以太网唤醒事件
3.3 EXTI主要特性
对于F1/F4/F7系列,每条EXTI线都可以进行单独配置,选择其类型、触发方式等参数。
3.4 EXTI寄存器
寄存器名称 | 位宽 | 功能 | 备注 |
中断屏蔽寄存器IMR | 32,仅0~19可用 | 0为屏蔽对应线的中断请求,1为使能对应线的中断请求 | 无 |
事件屏蔽寄存器EMR | 32,仅0~19可用 | 0为屏蔽对应线事件产生,1为使能对应线的事件产生 | 该寄存器不常用 |
上升沿触发选择寄存器RTSR | 32,仅0~19可用 | 0为屏蔽对应线的上升沿触发,1为使能对应线的上升沿触发 | 无 |
下降沿触发选择寄存器FTSR | 32,仅0~19可用 | 0为屏蔽对应线的下降沿触发,1为使能对应线的下降沿触发 | 无 |
软件中断事件寄存器SWIER | 32,仅0~19可用 | 0表示无效果,写1后会立即产生一个与硬件触发等效的中断/事件请求 | 用于代码调试 |
挂起寄存器PR | 32,仅0~19可用 | 当中断被使能时,对应的PR寄存器位会被写入1 | 在中断服务函数执行完成后必须清除对应PR位 |
4 AFIO
4.1 AFIO简介
Alternate Function I/O(AFIO),即复用功能输入/输出模块,负责管理具有多个功能或搭载了多个外设的引脚。
4.2 AFIO功能
1、外设引脚重映射:将某个外设的默认引脚重映射到其他引脚上,以解决不同外设争用同一引脚的冲突
2、外部中断引脚配置:将选择的GPIO引脚连接到EXTI中断线上
3、事件输出控制:将内部的事件信号引到指定的GPIO引脚上用于触发或同步外部的设备
4.3 AFIO寄存器
寄存器名称 | 位宽 | 功能 | 备注 |
事件控制寄存器EVCR | 32,仅0~7位有效 | 位0~3选择事件输出的GPIO引脚;位4~6选择事件输出的GPIO端口;位7写1使能事件输出功能,写0则为禁止 | HAL库中无直接对应的宏,需要直接操作寄存器 |
复用重映射和调试I/O配置寄存器MAPR | 32 | 位24~26用于调试接口(JTAG/SWD)配置,其他位用于外设引脚重映射 | 位24~26可选值及详细功能见下表 |
外部中断配置寄存器EXTICR1~EXTICR4 | 4×32 | 4个寄存器分别控制EXTI0~15,负责将具体的GPIO引脚连接到对应的EXTI线上 | 通常不需要操作 |
调试端口映像
位24~26 | 调试端口状态 | SWJ I/O引脚状态 | ||||
PA13 | PA14 | PA15 | PB3 | PB4 | ||
000 | 完全SWJ(JTAG-DP和SW-DP) | 不可用 | 不可用 | 不可用 | 不可用 | 不可用 |
001 | 完全SWJ,但没有JNTRST | 不可用 | 不可用 | 不可用 | 不可用 | 可用 |
010 | 关闭JTAG-DP,开启SW-DP | 不可用 | 不可用 | 可用 | 可用 | 可用 |
100 | 关闭JTAG-DP和SW-DP | 可用 | 可用 | 可用 | 可用 | 可用 |
备注 | 不建议使用关闭JTAG-DP和SW-DP(100),会使芯片无法再通过调试器连接 | |||||
5 中断的使用
5.1中断配置步骤
- 使能GPIO时钟
- 设置GPIO参数
- 使能AFIO时钟
- 设置EXTI与IO的关系
- 设置EXTI屏蔽和上下沿触发
- 设置NVIC:设置优先级分组、优先级和使能中断
HAL_GPIO_Init()可同时初始化GPIO、AFIO和EXTI,只需单独初始化NVIC即可。
5.2 中断服务函数
在HAL库中,中断处理分为入口函数、通用处理函数和回调函数三步。
1、入口中断函数:该函数功能为调用HAL库提供的通用处理函数,其函数形式为:
void EXTIx_IRQHandler(void)
在STM32中,x仅有0、1、2、3、4、9_5、15_10七个。
- 通用处理函数:在入口中断函数中被调用,其功能有3个:
- 检查有效性:检测该EXTI中断线是否被使能以及是否有挂起标志
- 清除中断标志:向PR寄存器写1清除中断标志
- 调用用户回调:调用下一步的回调函数
3、用户回调函数:该函数在HAL库中被弱定义,允许被用户重写。该函数执行时间必须极短,否则会阻塞其他中断或主循环。函数形式为:
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
其中GPIO_Pin用以区分触发中断的引脚编号
