一:觸發方式
STM32 的外部中斷是通過邊沿來觸發的,不支持電平觸發;
二:外部中斷分組
STM32 的每一個GPIO都能配置成一個外部中斷觸發源,STM32 通過根據引腳的序號不同將眾多中斷觸發源分成不同的組,比如:PA0,PB0,PC0,PD0,PE0,PF0,PG0為第一組,那么依此類推,我們能得出一共有16 組,STM32 規定,每一組中同時只能有一個中斷觸發源工作,那么,最多工作的也就是16個外部中斷。
STM32 分組和對應中斷處理函數分配:
管腳 |
中斷標志 |
中斷處理函數分配 |
PA0~PG0 |
EXTI0 |
EXTI0_IRQHandler |
PA1~PG1 |
EXTI1 |
EXTI1_IRQHandler |
PA2~PG2 |
EXTI2 |
EXTI2_IRQHandler |
PA3~PG3 |
EXTI3 |
EXTI3_IRQHandler |
PA4~PG4 |
EXTI4 |
EXTI4_IRQHandler |
PA5~PG5 |
EXTI5 |
EXTI9_5_IRQHandler |
PA6~PG6 |
EXTI6 |
|
PA7~PG7 |
EXTI7 |
|
PA8~PG8 |
EXTI8 |
|
PA9~PG9 |
EXTI9 |
|
PA10~PG10 |
EXTI10 |
EXTI15_10_IRQHandler |
PA11~PG11 |
EXTI11 |
|
PA12~PG12 |
EXTI12 |
|
PA13~PG13 |
EXTI13 |
|
PA14~PG14 |
EXTI14 |
|
PA15~PG15 |
EXTI15 |
三:外部中斷的配置過程
l 配置觸發源 -GPIO
觸發源為通過GPIO端口輸入,所以,要配置GPIO的模式,輸入方式,輸入方式有以下幾種:
1.GPIO_Mode_AIN ,模擬輸入(ADC模擬輸入,或者低功耗下省電)
2.GPIO_Mode_IN_FLOATING ,浮空輸入
3.GPIO_Mode_IPD = 0x28,帶下拉輸入
{
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOB, &GPIO_InitStructure);
EXTI_InitStructure.EXTI_Line= EXTI_Line5;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //先占優先級4位,共16級
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; //先占優先級0位,從優先級4位
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中斷通道
NVIC_Init(&NVIC_InitStructure);
{
delay_ms(10); // 消抖,是按鍵的話這里就需要,否則就不用延遲
printf("delay_ms\r\n");
if (EXTI_GetITStatus( EXTI_Line5) != RESET)
{
printf("EXTI0_IRQHandler\r\n");
}
EXTI_ClearITPendingBit( EXTI_Line5); //清除EXTI13線路掛起位
}