标题: 关于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
sinside 发表于 2021-11-25 08:14
hal_delay里面有个循环一直在等待, 外部中断的callback是在中断的时候调用, 还处在中断里面. 如果你的中断 ...

我昨晚睡觉的时候也在想是不是中断优先级的问题,今天早上发现果然是这个问题导致的。另外中断里面放延时是正点原子例程里面的骚操作,我初学就抄过来了,下次不会了
作者: yzwzfyz    时间: 2021-11-25 15:58
楼主对中断的理解不足。有没有考虑,连续中断发生时,CPU是如何处置这些连续中断的呢?
作者: 2873632596    时间: 2021-12-4 22:09
k9702 发表于 2021-11-25 09:20
我昨晚睡觉的时候也在想是不是中断优先级的问题,今天早上发现果然是这个问题导致的。另外中断里面放延时 ...

你确定正点原子用的是hal_delay这个系统自带的延时函数??
作者: 天ノ忆    时间: 2021-12-5 12:44
k9702 发表于 2021-11-25 09:20
我昨晚睡觉的时候也在想是不是中断优先级的问题,今天早上发现果然是这个问题导致的。另外中断里面放延时 ...

hal_delay()优先级比外部中断低多了,你自己写个延时函数都能用,但是用这个不行
作者: k9702    时间: 2021-12-24 14:20
2873632596 发表于 2021-12-4 22:09
你确定正点原子用的是hal_delay这个系统自带的延时函数??

他放的是自己写的延时函数,我没用他的库,就放了HAL库的
作者: Hephaestus    时间: 2021-12-24 14:43
hal_delay()是用systick中断实现的,而这个中断优先级最低,中断里面用永远也退不出来。更大的问题是中断处理程序里面放delay本身就是非常愚蠢的行为,不管用什么手段实现,应该快进快出。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1