Hitomi22 发表于 2025-7-17 09:09

STM32 F407 HAL_RxCpltCallback停止调用

我遇到了回调函数的问题。回调函数在不确定次数的调用后会停止被触发。USART 2和3最初都有这个问题,但通过在每次回调中清除溢出错误标志,USART 2的回调能够被持续调用了。然而这个方法对USART 3没有帮助。USART 3的RX通常会在STM需要重启前调用回调函数两次。有时它只会被调用一次,极少数情况下回调函数完全不会被调用。USART 2和3的区别在于它们的波特率:分别是115200和3000000比特/秒。由于USART 3的速度较高,我不得不将过采样降低到8个样本,而USART 2使用16个样本的过采样。这是我的回调函数oid HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)        // OK{       if(huart->Instance == USART2) {                  send_uart("UART2 OK\n");                  __HAL_UART_CLEAR_OREFLAG(&huart2);                  HAL_UART_Receive_IT(&huart2, (uint8_t *) getBuffer, 10);          } else if (huart->Instance == USART3) {                  send_uart("UART3 OK\n");                  __HAL_UART_CLEAR_OREFLAG(&huart3);                  HAL_UART_Receive_IT(&huart3, (uint8_t *) getBuffer, 100);          }}调试时检查SFRs发现,USART3的数据寄存器确实多次接收到了数据。但不知为何这似乎没有触发RxCpltCallback。USART3连接着一个IMU,我通过复位IMU来检查回调函数是否被调用。我用逻辑分析仪检查了IMU发出的信号,每次复位时确实都有信号从IMU传到STM。有什么可能的原因?是不是最好避免使用HAL,改用LL来编写?

LOVEEVER 发表于 2025-7-29 23:33

Callback非常不错
页: [1]
查看完整版本: STM32 F407 HAL_RxCpltCallback停止调用