博客 / 詳情

返回

STM32HAL庫中斷教程以及分裝中斷工具函數(附下載地址)

文章內容

  1. 使用HAL庫實現引腳外部中斷
  2. 封裝中斷工具函數

快速入門

  1. 訪問git倉庫: Guardian-Elf/Guardian-Elf-Embedded
  2. 找到並下載中斷工具文件(2個文件:Interrupt.h/.c)
  3. 由於我的項目中使用了串口來調試中斷函數,所以如果報錯就把無關的代碼刪除
  4. 代碼示例
// 配置GPIOB的1,0引腳
void Interrupt_Service_Init(void) {  
    Interrupt_Init(GPIOB, GPIO_PIN_0, 1, 3);  
    Interrupt_Init(GPIOB, GPIO_PIN_1, 1, 3);  
}  
  
// 中斷觸發時會執行這兩個函數
void Interrupt_0(void) {  
    OLED_NextPage();  // 這個OLED的驅動函數,你可以改成LED點燈來判斷是否成功
}  
void Interrupt_1(void) {  
    OLED_PrevPage();  
}

HAL庫實現串口中斷

初始化引腳

__HAL_RCC_GPIOB_CLK_ENABLE() // 開啓引腳使能

GPIO_InitTypeDef GPIO_InitStruct = {0};  
GPIO_InitStruct.Pin = GPIO_PIN_0;  // GPIOB 0引腳
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;  // 下降沿觸發(按鍵按下為低)
GPIO_InitStruct.Pull = GPIO_PULLUP;  // 默認上拉,未按下時為高
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;  
HAL_GPIO_Init(GPIO_PORT, &GPIO_InitStruct);

// 配置中斷優先級並使能  
// EXTI0_IRQn 表示0通道,當A0,B0,C0...觸發中斷後會激活這個通道
HAL_NVIC_SetPriority(EXTI0_IRQn, 3, 0);  
HAL_NVIC_EnableIRQ(EXTI0_IRQn);

中斷觸發函數

  1. EXTI0_IRQHandler實現
// 當A0,B0,C0...觸發中斷後會進入這個函數
void EXTI0_IRQHandler(void)    {  
    HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0); // 內部自動處理有關中斷的寄存器標誌位
}
  1. HAL_GPIO_EXTI_IRQHandler解析

這個函數是HAL庫自帶的,用於自帶處理中斷標誌位,這樣用户就可以不用操作寄存器,而是實現具體中斷業務代碼

因為這個函數是用來處理所有組的所有引腳的中斷,所有需要判斷引腳

/**  
  * @brief  This function handles EXTI interrupt request.  * @param  GPIO_Pin: Specifies the pins connected EXTI line  * @retval None  */void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)  
{  
  /* EXTI line interrupt detected */  
  if (__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != 0x00u)  
  {  
    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);  
    HAL_GPIO_EXTI_Callback(GPIO_Pin);  
  }  
}

可以看到當產生中斷是會執行HAL_GPIO_EXTI_Callback函數,所以用户只需要重寫這個函數即可

  1. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    if(GPIO_Pin == GPIO_PIN_0)
    {
        // 這裏寫你的中斷處理代碼
        
        // 示例:翻轉LED
        HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
        
        // 示例:發送消息
        // UART_SendString("EXTI0 Triggered!\r\n");
    }
}

結語

如果覺得有幫助到你,就請給倉庫一個 star 吧!

git倉庫: Guardian-Elf/Guardian-Elf-Embedded

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.