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