關鍵字: 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中做一次就可以了。
?