江科大學習筆記 _3.外部中斷配置
例:開啟PB14的引腳的 接收外部信號 中斷
1.?開啟RCC時鐘,掛載在APB2總線上
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
?
2.?開啟AFIO時鐘,掛載在APB2總線上
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
EXTI和NVIC在STM32中不需要手動開啟
?
3.?選擇EXTI外設中斷線,并配置EXTI
AFIO的配置文件和GPIO在一個函數(shù)里
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);
?
?
配置EXTI
????EXTI_InitTypeDef EXTI_InitStruct;
????EXTI_InitStruct.EXTI_Line = EXTI_Line14;
????EXTI_InitStruct.EXTI_LineCmd = ENABLE;
????EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
????EXTI_InitStruct.EXTI_Trigger = ?EXTI_Trigger_Falling;
????EXTI_Init(&EXTI_InitStruct);
?
4.?配置NVIC
在內(nèi)核函數(shù)庫里(misc.h)
?
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//這個函數(shù)在整個程序里只要配置一次
????
????NVIC_InitTypeDef NVIC_InitStruct;
????NVIC_InitStruct.NVIC_IRQChannel = EXTI15_10_IRQn;
????NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
????NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
????NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
????NVIC_Init(&NVIC_InitStruct);
?
4步后,中斷程序開啟,接下來就需要編寫中斷函數(shù)
每一個中斷通道都對應一個中斷函數(shù)
?
void EXTI15_10_IRQHandler(void)
{
//因為EXTI10--15都能進這個中斷函數(shù),所以先判斷是不是EXTI14進的中斷
????if(EXTI_GetITStatus(EXTI_Line14) == SET)
?????{
??????????
????? ????EXTI_ClearITPendingBit(EXTI_Line14);//關閉這個中斷,否則一直在中斷中
?????}
?
}
?