关键字: EXTI
1. 问题背景
客户的终端客户反馈产品会有偶发性的功能异常。问题比较难以复现。
经过调查,在 BOOT 程序跳转到 APP1 程序中时相对比较容易复现问题。查看客户代码,发现客户在 BOOT 程序中会对 EXTI 进行初始化,跳转到 APP 程序后,客户工程师在 APP 中再次对 EXTI 初始化。
检查 EXTI 相关寄存器描述。发现在初始化 EXTI_RTSR1@RTx 寄存器时,在写寄存器期间,如果上升沿信号产生,此时可能无法将相应的挂起位置位,从而导致丢失中断。会不会是这个原因导致的呢?寄存器截图如下:
图1. EXTI_RTSR1@RTx 寄存器描述
客户描述丢中断是在第二次初始化时导致的,但是第二次初始化并没有改变任何配置。即使在第二次进行了初始化,应该也不会导致中断丢失。
2. 问题复现
测试配置:
硬件测试平台 NUCLEO-STM32U575+ NUCLEO-STM32H503
软件工具版本:
STM32CubeMX Version : 6.12.0
STM32Cubeide Version : 1.16.0
2.1. 两次初始化 EXTI 测试
2.1.1. 测试接线
图2. 硬件连接配置
图3. 接线配置
2.1.2. 测试配置
开始在 U575 进入第二次初始化之前产生触发信号给 H503,H503 检测到 U575 产生的起始触发信号后,H503 会产生一个上升沿给到 U575,这个上升沿的产生的时机每次增加一个 NOP 延时,U575 如果检测到 H503 产生的上升沿信号则进行软复位,如果没有检测到触发信号则将 PB10 拉高,以此去遍历所有的触发信号的触发点。
2.1.3. 测试代码
U575 代码:
第二次初始化代码
H503 代码:
2.1.4. 测试结果
CHA(蓝色):测试点 NUCLEO-H503_PA0 U5 产生的触发信号,U5 在进第二次初始化时 U5 会产生触发信号触发 H5 进入中断,H5 进入中断后会递加 NOP 延时后产生触发 U5 进入中断的信号
CHB(红色):测试点 NUCLEO-H503_PA1 H5 产生的触发 U5 进入中断的信号。
CHC(绿色):测试点 NUCLEO-U575_PB11 指示 U5 代码执行位置的信号。
CHD(黄色):测试点 NUCLEO-U575_NRST U5 的复位管脚。
CHE(紫色):测试点 NUCLEO-U575_PB10 指示 U5 接收到触发信号后未进入中断,执行到 while(1)循环将 PB10 拉高,示波器以这个通道的上升沿进行触发,去抓取不能触发中断的波形
测试波形如下:
图4. 测试波形
A 点放大波形如下图:
最后一次正常响应中断
图5. A 点
B 点放大波形如下图,未能响应中断。
图6. B 点
2.2. 分析
图7. 未响应中断波形分析
从测试波形来看随着时间的推进, 在进入第二次初始化 EXTI 时 U5 在 A 点产生触发信号,触发 H5 产生上升沿信号。在 B 点时,H5 产生上升沿信号,测试代码执行到 b-c 段,此时触发信号的到来,MCU 并未响应这个中断。此时正在设置 EXTICR 寄存器。而这个寄存器是用来配置复用开关的寄存器。
图8. EXTI mux GPIO 选择
3. 小结
MCU 设置 EXTICR 寄存器时,即使我们不改变 EXTICR 中的值,在 EXTICR 上操作时也会使用 MUX,这可能是导致出现中断无响应窗口的原因。建议客户的 EXTI 的初始化只在 Boot中做一次就可以了。