背景:項目中需要使用hall傳感器檢測門鎖狀態,觸發中斷,發送門鎖狀態信息。(這兒中斷服務中只是點了led燈說明了狀況)
硬件情況:采用PB3管腳,因而使用中斷線:EXTI_Line3和中斷服務函數:EXTI2_3_IRQn。
具體過程:
1、設置中斷時鍾
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
2、配置GPIO
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; //輸入
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //拉高
GPIO_Init(GPIOB, &GPIO_InitStructure);
3、GPIO與中斷線的映射
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource3);
4、配置EXTI
EXTI_InitTypeDef EXTI_InitStructure
EXTI_InitStructure.EXTI_Line = EXTI_Line3; //中斷線3
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; //邊沿觸發
EXTI_Init(&EXTI_InitStructure);
5、配置NVIC
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_3_IRQn; //頂層頭文件重定義好的
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPriority = 0x00; //中斷優先級
NVIC_Init(&NVIC_InitStructure);
6、中斷服務程序及標志位清除
void EXTI2_3_IRQHandler() //啟動文件中定義好的
{
if (LOCK_SENSOR == 0)
{
GPIO_SetBits(GPIOF, GPIO_Pin_6);
GPIO_ResetBits(GPIOF, GPIO_Pin_7);
}
if (LOCK_SENSOR == 1)
{
GPIO_SetBits(GPIOF, GPIO_Pin_7);
GPIO_ResetBits(GPIOF, GPIO_Pin_6);
}
EXTI_ClearITPendingBit(EXTI_Line3);
}
關於中斷服務函數,需要再強調一下,它主要包含2塊內容,1.中斷所要執行的內容。2.中斷標記位清零(否則會陷入中斷死循環)。
為避免中斷超時,導致死機,可以添加看門狗程序。
還有,中斷是可以進行嵌套的。低優先級中斷執行過程中,進入高優先級中斷,執行完后,返回低優先級中斷,繼續執行。
STM32外部中斷易出錯總結(詳見鏈接)
http://blog.csdn.net/yskcg/article/details/8201505
