久芯网

Hall库多串口接收时串口中断回调函数重入导致HardFault 0xFFFFFFF1,怎么解决?

avatar JoneCheng 提问时间: 2023-08-29 14:23:25 / 未解决
STM32F103使用HALL库接收多串口(3个)数据时,当数据接收比较频繁时会引起HAL_UART_RxCpltCallback多次被调用,当中断结束退出时触发Hardfault错误,此时R14为0xFFFFFFF1。串口接收回调函数如下,接收多串口数据并存入多缓冲区

///////////////////////////////// UART //////////////////////////////////
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
        if(huart->Instance == USART1){
                ST_UART1.RecBuf[ST_UART1.WritePointer]=UART1_RecData[0];
                ST_UART1.WritePointer++;
                if(ST_UART1.WritePointer == BUFERLENGTH){
                        ST_UART1.WritePointer=0;
                }
                if(HAL_UART_Receive_IT(&huart1, UART1_RecData, 1)==HAL_BUSY){
                        UART1_RestartRecIT=1;
                }       
        }
        if(huart->Instance == USART2){
                ST_UART2.RecBuf[ST_UART2.WritePointer]=UART2_RecData[0];
                ST_UART2.WritePointer++;
                if(ST_UART2.WritePointer == BUFERLENGTH){
                        ST_UART2.WritePointer=0;
                }
                if(HAL_UART_Receive_IT(&huart2, UART2_RecData, 1)==HAL_BUSY){
                        UART2_RestartRecIT=1;
                }       
        }
        if(huart->Instance == USART3){
                ST_UART3.RecBuf[ST_UART3.WritePointer]=UART3_RecData[0];
                ST_UART3.WritePointer++;
                if(ST_UART3.WritePointer == BUFERLENGTH){
                        ST_UART3.WritePointer=0;
                }
                if(HAL_UART_Receive_IT(&huart3, UART3_RecData, 1)==HAL_BUSY){
                        UART3_RestartRecIT=1;
                }       
        }
}


按照正常集成库的设计,各串口都有独立的串口中断响应函数,所以不会存在该问题。但是HAL库回调函数的处理机制会导致不同串口接收时重复调用。这个问题怎么解决?HAL_UART_RxCpltCallback里边如何正确的处理接收才能避免该问题?

1个回答
  • avatar yklstudent
    回答时间: 2023-08-29 14:40:15

    换USART+DMA方式吧

会员中心 微信客服
客服
回到顶部