文章内容
快速入门
- 访问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);
复制代码 中断触发函数
- // 当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
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |