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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM