我遇到了回调函数的问题。回调函数在不确定次数的调用后会停止被触发。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来编写?
|