有人問
我使用EXIT喚醒芯片,沒什么沒有觸發中斷,芯片卻喚醒了?
Ⅰ寫在前面
使用STM8S開發過上面類似功能的朋友應該會知道,STM8S的穩定性不如STM32,特別是在低功耗時,使用EXTI外部中斷喚醒,很容易受到干擾信號而喚醒。因此,這種情況需在硬件電路上多加考慮抗干擾的電路。
其次,就是注意軟件的上下拉配置,如果外部加了上拉或下拉電阻,不建議再配置成上拉或下拉;如果沒有,建議加上。要使其軟件穩定,還得深入EXTI的功能。
ⅡEXTI基礎知識
STM8S的EXTI外部中斷歸屬于GPIO一類,只需要將其IO配置成外部中斷、使能全局中斷、在中斷入口函數添加相關的代碼即可。
開啟中斷功能
用戶可以在I/O引腳為輸入模式時通過設置Px_CR2寄存器的相應位來配置某個I/O作為外部輸入中斷模式。在該配置下, I/O引腳上的一個信號沿或是低電平會產生一個中斷請求。
在EXTI_CR[2:1]寄存器中對于每一個中斷向量都可以獨立編程為上升沿或下降沿觸發。
外部中斷只有在對應I/O口被設置為輸入模式下才有效。
屏蔽中斷功能
可以通過對Px_CR2寄存器的相應位進行編程來單獨使能/關閉外部中斷功能。復位后外部中斷是關閉的。
提示:EXTI外部中斷只有在IO輸入模式下才有效,配置才輸出模式,不能正常由外部觸發中斷。
Ⅲ軟件工程源代碼
1.關于工程
本文提供的工程代碼是基于前面軟件工程“STM8S-A04_UART基本收發數據”增加EXTI外部中斷修改而來。初學的朋友可以參看我前面對應的基礎文章,那些文章講的比較詳細。
2.EXTI引腳配置
我們尚且定義為按鍵KEY,浮動輸入,中斷模式。
#define KEY_GPIO_PORT GPIOD
#define KEY_GPIO_PIN GPIO_PIN_2
GPIO_Init(KEY_GPIO_PORT, (GPIO_Pin_TypeDef)KEY_GPIO_PIN, GPIO_MODE_IN_FL_IT);
3.EXTI中斷配置
void EXTI_Configuration(void)
{
EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOD, EXTI_SENSITIVITY_FALL_ONLY);
EXTI_SetTLISensitivity(EXTI_TLISENSITIVITY_FALL_ONLY);
}
這個地方配置成下降沿中斷,端口需對應引腳的端口。
4.中斷入口函數
#define KEY_READ GPIO_ReadInputPin(KEY_GPIO_PORT, KEY_GPIO_PIN)
INTERRUPT_HANDLER(EXTI_PORTD_IRQHandler, 6)
{
if(RESET == KEY_READ)
{
IT_Delay(50); //延時消抖
if(RESET == KEY_READ) //確認按下
{
LED_REVERSE; //改變LED狀態
}
}
}
提示:我們使用的GPIOD,入口需要對應。
Ⅳ下載
STM8S資料:
http://pan.baidu.com/s/1o7Tb9Yq
軟件源代碼工程兩版本(STM8S-A09_EXTI外部中斷):
http://pan.baidu.com/s/1c2EcRo0
-
EXIT圖
+關注
關注
0文章
4瀏覽量
6991 -
STM8S
+關注
關注
16文章
149瀏覽量
31369
發布評論請先 登錄
相關推薦
評論