文章內容
- 使用HAL庫實現引腳外部中斷
- 封裝中斷工具函數
快速入門
- 訪問git倉庫: Guardian-Elf/Guardian-Elf-Embedded
- 找到並下載中斷工具文件(2個文件:Interrupt.h/.c)
- 由於我的項目中使用了串口來調試中斷函數,所以如果報錯就把無關的代碼刪除
- 代碼示例
// 配置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);
中斷觸發函數
- EXTI0_IRQHandler實現
// 當A0,B0,C0...觸發中斷後會進入這個函數
void EXTI0_IRQHandler(void) {
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0); // 內部自動處理有關中斷的寄存器標誌位
}
- 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函數,所以用户只需要重寫這個函數即可
- 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