找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2764|回復(fù): 8
打印 上一主題 下一主題
收起左側(cè)

關(guān)于STM32外部中斷回調(diào)函數(shù)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:609192 發(fā)表于 2021-11-24 20:24 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
該程序放入延時(shí)函數(shù)就發(fā)送錯(cuò)誤,實(shí)現(xiàn)不了功能,把延時(shí)函數(shù)注釋掉又可以實(shí)現(xiàn)。
究竟是什么問(wèn)題導(dǎo)致的?

1. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)  
2. {  
3. HAL_Delay(100);//消抖,通過(guò)延時(shí)然后讀取按鍵電平,達(dá)到消抖的效果。  
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空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:301191 發(fā)表于 2021-11-24 23:35 | 只看該作者
頂一下
回復(fù)

使用道具 舉報(bào)

板凳
ID:935919 發(fā)表于 2021-11-25 08:14 | 只看該作者
hal_delay里面有個(gè)循環(huán)一直在等待, 外部中斷的callback是在中斷的時(shí)候調(diào)用, 還處在中斷里面. 如果你的中斷的優(yōu)先級(jí)比定時(shí)器的優(yōu)先級(jí)高, 那么delay里面獲取的tick計(jì)數(shù)都沒(méi)有增加, 當(dāng)然就會(huì)卡死在此處了.

哪怕是tick計(jì)數(shù)增加, 也不建議在中斷里面使用延時(shí)程序.
回復(fù)

使用道具 舉報(bào)

地板
ID:609192 發(fā)表于 2021-11-25 09:20 | 只看該作者
sinside 發(fā)表于 2021-11-25 08:14
hal_delay里面有個(gè)循環(huán)一直在等待, 外部中斷的callback是在中斷的時(shí)候調(diào)用, 還處在中斷里面. 如果你的中斷 ...

我昨晚睡覺(jué)的時(shí)候也在想是不是中斷優(yōu)先級(jí)的問(wèn)題,今天早上發(fā)現(xiàn)果然是這個(gè)問(wèn)題導(dǎo)致的。另外中斷里面放延時(shí)是正點(diǎn)原子例程里面的騷操作,我初學(xué)就抄過(guò)來(lái)了,下次不會(huì)了
回復(fù)

使用道具 舉報(bào)

5#
ID:123289 發(fā)表于 2021-11-25 15:58 | 只看該作者
樓主對(duì)中斷的理解不足。有沒(méi)有考慮,連續(xù)中斷發(fā)生時(shí),CPU是如何處置這些連續(xù)中斷的呢?
回復(fù)

使用道具 舉報(bào)

6#
ID:759731 發(fā)表于 2021-12-4 22:09 | 只看該作者
k9702 發(fā)表于 2021-11-25 09:20
我昨晚睡覺(jué)的時(shí)候也在想是不是中斷優(yōu)先級(jí)的問(wèn)題,今天早上發(fā)現(xiàn)果然是這個(gè)問(wèn)題導(dǎo)致的。另外中斷里面放延時(shí) ...

你確定正點(diǎn)原子用的是hal_delay這個(gè)系統(tǒng)自帶的延時(shí)函數(shù)??
回復(fù)

使用道具 舉報(bào)

7#
ID:139866 發(fā)表于 2021-12-5 12:44 | 只看該作者
k9702 發(fā)表于 2021-11-25 09:20
我昨晚睡覺(jué)的時(shí)候也在想是不是中斷優(yōu)先級(jí)的問(wèn)題,今天早上發(fā)現(xiàn)果然是這個(gè)問(wèn)題導(dǎo)致的。另外中斷里面放延時(shí) ...

hal_delay()優(yōu)先級(jí)比外部中斷低多了,你自己寫個(gè)延時(shí)函數(shù)都能用,但是用這個(gè)不行
回復(fù)

使用道具 舉報(bào)

8#
ID:609192 發(fā)表于 2021-12-24 14:20 | 只看該作者
2873632596 發(fā)表于 2021-12-4 22:09
你確定正點(diǎn)原子用的是hal_delay這個(gè)系統(tǒng)自帶的延時(shí)函數(shù)??

他放的是自己寫的延時(shí)函數(shù),我沒(méi)用他的庫(kù),就放了HAL庫(kù)的
回復(fù)

使用道具 舉報(bào)

9#
ID:883242 發(fā)表于 2021-12-24 14:43 | 只看該作者
hal_delay()是用systick中斷實(shí)現(xiàn)的,而這個(gè)中斷優(yōu)先級(jí)最低,中斷里面用永遠(yuǎn)也退不出來(lái)。更大的問(wèn)題是中斷處理程序里面放delay本身就是非常愚蠢的行為,不管用什么手段實(shí)現(xiàn),應(yīng)該快進(jìn)快出。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表