void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if(GPIO_Pin == GPIO_PIN_9) { HAL_Delay(5); if(page_sta==0) { OLED_Clear(); page_sta=1; page2_test(); } else if(page_sta==1) { OLED_Clear(); page_sta=0; page1_test(); } } } 程序到HAL_Delay(5);就卡死了
时间: 2024-04-06 16:28:51 浏览: 57
这个程序很可能是因为 HAL_Delay(5) 导致的死循环,因为 HAL_Delay() 函数是一个阻塞函数,会使CPU进入等待状态,直到延时时间结束。在这段代码中,如果GPIO中断触发时,跳转到中断处理函数 HAL_GPIO_EXTI_Callback(),如果GPIO_Pin为GPIO_PIN_9,则会执行 HAL_Delay(5),这里的延时时间是5ms,这段时间内CPU会一直等待,如果期间又有GPIO中断触发,则会卡死。
解决这个问题的方法是使用定时器中断来替代 HAL_Delay() 函数,或者使用RTOS等操作系统来管理任务,避免阻塞CPU。
相关问题
void HAL_GPIO_EXTI_callback(uingt16_t GPIO_Pin)与_weak void HAL_GPIO_EXTI_callback(uingt16_t GPIO_Pin)的区别
`void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)` 是STM32F4xx HAL库中的中断处理函数,当外部中断线(EXTI)检测到事件时被调用[^1]。这个函数的主要作用是清除当前的中断标志并执行回调函数`HAL_GPIO_EXTI_Callback(GPIO_Pin)`。
而`_weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)` 可能是一个弱定义的回调函数,它允许用户自定义EXTI中断的处理逻辑。`_weak`关键字意味着如果在用户代码中未提供相应的强定义(即不是`__attribute__((weak))`),编译器会默认使用这个弱版本。这样可以保证基础库功能正常工作,但同时也给用户留出了扩展或替换回调行为的空间。
具体区别在于:
1. **默认行为**:如果不显式重写,`HAL_GPIO_EXTI_Callback`将按照库的设计执行中断处理流程。
2. **可覆盖性**:用户可以通过提供非 `_weak` 的 `HAL_GPIO_EXTI_Callback` 定义来替换默认的行为,从而实现特定于项目的需求。
3. **稳定性**:`_weak` 提供了一种方式来维护库的稳定性,即使用户修改了回调,如果没有明确替换,基础库仍能保持预期的工作。
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if(GPIO_Pin == GPIO_PIN_0){ printf("btke:\r\n"); HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0); flag_key = flag_key ? 0:1; } }
这是一个STM32的中断回调函数,在外部中断引脚(GPIO_Pin)被触发时被调用。当GPIO_Pin等于GPIO_PIN_0时,会打印"btke:",并且通过HAL_GPIO_TogglePin函数切换GPIOB的0号引脚的状态。同时,使用三目运算符切换flag_key的值,这样flag_key将在两个状态之间切换。这段代码可能用于检测按键的状态,并在按键按下时切换某些设备的状态。
阅读全文