STM32F4 HAL库串口死锁问题调试记录
使用方法:通过串口DMA固定周期向外发送数据,同时开启串口DMA接收用于接收其它板卡发来的数据。
问题:在程序运行一段时间后会出现程序不再接收数据的情况,但向外发送数据正常。
分析:一开始认为是触发了串口ORE错误导致的这个问题呢,但奇怪的是并没有触发串口错误中断的回调函数,通过进一步分析排查发现是由__HAL_LOCK()
引起的,而串口ORE错误是在触发这个问题之后出现的。
调试方法
- 通过如下函数开启串口DMA接收
HAL_UARTEx_ReceiveToIdle_DMA(&JOYSTICK_HUART, joystick_uart_buffer, JOYSTICK_UART_BUFFER_SIZE);
- 通过如下函数以10ms周期定时向外发送数据
HAL_UART_Transmit_DMA(&JOYSTICK_HUART,(uint8_t*)&joystick_display_frame,sizeof(JoystickDisplayFrame_t));
- 实现串口DMA+IDLE中断接收回调函数
uint32_t huart2_err_cnt = 0;
uint32_t aaa[10] = {
0};
HAL_StatusTypeDef huart2_status1;
HAL_StatusTypeDef huart2_status2;
uint32_t tx_lock_cnt = 0;
uint32_t tx_unlock_cnt = 0;
uint8_t rx_irq_flag = 0;
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) {
uart_rx_event_cnt++;
huart2_status1 = HAL_UARTEx_ReceiveToIdle_DMA(&JOYSTICK_HUART, joystick_uart_buffer, JOYSTICK_UART_BUFFER_SIZE)