外部中斷
- 在STM32中,每個IO腳都可以作為外部中斷的輸入腳。
- 但是一個飲片不可能配置相同數量的中斷線,來接收IO的狀態(上升,下拉,速度等),所以,怎么使中斷線和大數量的IO腳進行配對呢?

如上圖所示的中斷線配置相對應的IO腳,中斷線的數量將大幅度的減少。
外部中斷的一般配置方法
1、既然是對IO腳線配置,那IO腳的時鍾是第一個需要配置的。
__HAL_RCC_GPIOA_CLK_ENABLE(); //開啟GPIOA時鍾 __HAL_RCC_GPIOC_CLK_ENABLE(); //開啟GPIOC時鍾 __HAL_RCC_GPIOH_CLK_ENABLE(); //開啟GPIOH時鍾
2、配置好IO腳的時鍾之后,接着是需要配置IO腳的狀態。(上升,下拉,速度等)
是配置IO腳的狀態,需要用到 HAL_GPIO_Init(GPIOA,&GPIO_Initure);這個函數
GPIO_Initure.Pin=GPIO_PIN_0; //PA0 GPIO_Initure.Mode=GPIO_MODE_IT_RISING; // GPIO_Initure.Pull=GPIO_PULLDOWN; //下拉 GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速 HAL_GPIO_Init(GPIOA,&GPIO_Initure);
3、在IO腳的相關工作配置完成之后,可以把中斷的相關配置,進行梳理一下。可以首先從中斷優先級和使能中斷開始。
HAL_NVIC_EnableIRQ(EXTI0_IRQn); // HAL_NVIC_SetPriority(EXTI0_IRQn,2,0); // HAL_NVIC_EnableIRQ(EXTI2_IRQn); // HAL_NVIC_SetPriority(EXTI2_IRQn,2,1); // HAL_NVIC_EnableIRQ(EXTI3_IRQn); // HAL_NVIC_SetPriority(EXTI3_IRQn,2,2); //
4、需要中斷的話,就需要外部中斷函數來處理IO腳的中斷情況,STM32提供了外部中斷通用處理函數。HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0)
void EXTI0_IRQHandler() { HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0); } void EXTI2_IRQHandler() { HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_2); }
5、中斷的處理函數的調用完成,得到中斷來源之后,進一步需要在在外部中斷回調函數中來處理數據。void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { delay_ms(100); switch(GPIO_Pin) { case GPIO_PIN_0: //WAKE UP if(WK_UP == 1) LED1=!LED1; LED0=!LED1; break; // case GPIO_PIN_13: //KEY2 if(KEY2 == 0) { LED0=!LED0; } break; // case GPIO_PIN_2: //KEY1 if(KEY1 == 0) { LED1=!LED1; } break; // case GPIO_PIN_3: //KEY0 if(KEY0 == 0) { LED0=!LED0; LED1=!LED1; } break; // } }
這幾個函數在EXTI.C的頭文件中寫好之后。在main.c函數進行調用即可。
int main(void) { HAL_Init(); //初始化HAL庫 Stm32_Clock_Init(360,25,2,8); //設置時鍾,180Mhz delay_init(180); //初始化延時函數 uart_init(115200); //初始化USART LED_Init(); //初始化LED KEY_Init(); //初始化按鍵 EXTI_Init(); //外部中斷初始化 while(1) { printf("ok\r\n"); delay_ms(1000); } }
2019-09-25
