標題: 關于STM32外部中斷回調函數 [打印本頁]
作者: k9702 時間: 2021-11-24 20:24
標題: 關于STM32外部中斷回調函數
該程序放入延時函數就發送錯誤,實現不了功能,把延時函數注釋掉又可以實現。
究竟是什么問題導致的?
1. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
2. {
3. HAL_Delay(100);//消抖,通過延時然后讀取按鍵電平,達到消抖的效果。
4. switch(GPIO_Pin)
5. {
6. case KEY_UP_Pin:
7. if(KEY_UP==1)
8. {
9. HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET);
10. HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_RESET);
11. }
12. break;
13. case KEY2_Pin:
14. if(KEY2==0)
15. {
16. HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET);
17. }
18. break;
19. case KEY1_Pin:
20. if(KEY1==0)
21. {
22. HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_SET);
23. }
24. break;
25. case KEY0_Pin:
26. if(KEY0==0)
27. {
28. HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET);
29. HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_SET);
30. }
31. break;
32. }
33. }
作者: 人工置頂員 時間: 2021-11-24 23:35
頂一下
作者: sinside 時間: 2021-11-25 08:14
hal_delay里面有個循環一直在等待, 外部中斷的callback是在中斷的時候調用, 還處在中斷里面. 如果你的中斷的優先級比定時器的優先級高, 那么delay里面獲取的tick計數都沒有增加, 當然就會卡死在此處了.
哪怕是tick計數增加, 也不建議在中斷里面使用延時程序.
作者: k9702 時間: 2021-11-25 09:20
我昨晚睡覺的時候也在想是不是中斷優先級的問題,今天早上發現果然是這個問題導致的。另外中斷里面放延時是正點原子例程里面的騷操作,我初學就抄過來了,下次不會了
作者: yzwzfyz 時間: 2021-11-25 15:58
樓主對中斷的理解不足。有沒有考慮,連續中斷發生時,CPU是如何處置這些連續中斷的呢?
作者: 2873632596 時間: 2021-12-4 22:09
你確定正點原子用的是hal_delay這個系統自帶的延時函數??
作者: 天ノ憶 時間: 2021-12-5 12:44
hal_delay()優先級比外部中斷低多了,你自己寫個延時函數都能用,但是用這個不行
作者: k9702 時間: 2021-12-24 14:20
他放的是自己寫的延時函數,我沒用他的庫,就放了HAL庫的
作者: Hephaestus 時間: 2021-12-24 14:43
hal_delay()是用systick中斷實現的,而這個中斷優先級最低,中斷里面用永遠也退不出來。更大的問題是中斷處理程序里面放delay本身就是非常愚蠢的行為,不管用什么手段實現,應該快進快出。
| 歡迎光臨 (http://m.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |