STM32外部中断小结

外部中断

  1. 在STM32中,每个IO脚都可以作为外部中断的输入脚。
  2. 但是一个饮片不可能配置相同数量的中断线,来接收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

猜你喜欢

转载自www.cnblogs.com/DY004/p/11581711.html