找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2059|回复: 8
打印 上一主题 下一主题
收起左侧

关于STM32外部中断回调函数

[复制链接]
跳转到指定楼层
楼主
ID:609192 发表于 2021-11-24 20:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
该程序放入延时函数就发送错误,实现不了功能,把延时函数注释掉又可以实现。
究竟是什么问题导致的?

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. }


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:301191 发表于 2021-11-24 23:35 | 只看该作者
顶一下
回复

使用道具 举报

板凳
ID:935919 发表于 2021-11-25 08:14 | 只看该作者
hal_delay里面有个循环一直在等待, 外部中断的callback是在中断的时候调用, 还处在中断里面. 如果你的中断的优先级比定时器的优先级高, 那么delay里面获取的tick计数都没有增加, 当然就会卡死在此处了.

哪怕是tick计数增加, 也不建议在中断里面使用延时程序.
回复

使用道具 举报

地板
ID:609192 发表于 2021-11-25 09:20 | 只看该作者
sinside 发表于 2021-11-25 08:14
hal_delay里面有个循环一直在等待, 外部中断的callback是在中断的时候调用, 还处在中断里面. 如果你的中断 ...

我昨晚睡觉的时候也在想是不是中断优先级的问题,今天早上发现果然是这个问题导致的。另外中断里面放延时是正点原子例程里面的骚操作,我初学就抄过来了,下次不会了
回复

使用道具 举报

5#
ID:123289 发表于 2021-11-25 15:58 | 只看该作者
楼主对中断的理解不足。有没有考虑,连续中断发生时,CPU是如何处置这些连续中断的呢?
回复

使用道具 举报

6#
ID:759731 发表于 2021-12-4 22:09 | 只看该作者
k9702 发表于 2021-11-25 09:20
我昨晚睡觉的时候也在想是不是中断优先级的问题,今天早上发现果然是这个问题导致的。另外中断里面放延时 ...

你确定正点原子用的是hal_delay这个系统自带的延时函数??
回复

使用道具 举报

7#
ID:139866 发表于 2021-12-5 12:44 | 只看该作者
k9702 发表于 2021-11-25 09:20
我昨晚睡觉的时候也在想是不是中断优先级的问题,今天早上发现果然是这个问题导致的。另外中断里面放延时 ...

hal_delay()优先级比外部中断低多了,你自己写个延时函数都能用,但是用这个不行
回复

使用道具 举报

8#
ID:609192 发表于 2021-12-24 14:20 | 只看该作者
2873632596 发表于 2021-12-4 22:09
你确定正点原子用的是hal_delay这个系统自带的延时函数??

他放的是自己写的延时函数,我没用他的库,就放了HAL库的
回复

使用道具 举报

9#
ID:883242 发表于 2021-12-24 14:43 | 只看该作者
hal_delay()是用systick中断实现的,而这个中断优先级最低,中断里面用永远也退不出来。更大的问题是中断处理程序里面放delay本身就是非常愚蠢的行为,不管用什么手段实现,应该快进快出。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表