标题: 关于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://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |