外部中断
- 在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