標籤:
背景:項目中需要使用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);
}
STM32外部中斷易出錯總結(詳見連結)
http://blog.csdn.net/yskcg/article/details/8201505
基於STM32F0的GPIO外部中斷