打印
[其他ST产品]

STM32解决串口频繁接收串口死所问题

[复制链接]
147|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
最近在使用STM32空闲中断接收数据的时候发现一旦发送端发送数据较频繁,串口就会出现死锁的情况,即使在接收到数据以后关闭空闲中断,解析完数据后立马打开中断,也会有这个情况。修改串口解析后打开中断部分内容后解决此问题,详解如下:


CubeMX串口配置如下:






使用特权

评论回复
沙发
漫天星yl|  楼主 | 2023-9-22 12:02 | 只看该作者
修改后内容如下:
stm32fl0xx_it.c
#define RECV_BUFFER_SIZE  20

uint8_t uart_dma_recv_buff[RECV_BUFFER_SIZE] = {0};
uint8_t uart_dma_recv_buff_bak[RECV_BUFFER_SIZE] = {0}

void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */

  /* USER CODE END USART1_IRQn 0 */
  HAL_UART_IRQHandler(&huart1);
  /* USER CODE BEGIN USART1_IRQn 1 */
                if(RESET != __HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE))//Check whether the specified UART flag is set or not.
        {
                __HAL_UART_CLEAR_IDLEFLAG(&huart1);//Clear the UART IDLE pending flag.(Otherwise it will continue to interrupt)
//                HAL_UART_DMAStop(&huart1);
                /*关闭接收的DMA*/
                ret_Value = HAL_IS_BIT_SET(huart1.Instance->CR3, USART_CR3_DMAR);
                if ((huart1.RxState == HAL_UART_STATE_BUSY_RX) && ret_Value)
                {
                        CLEAR_BIT(huart1.Instance->CR3, USART_CR3_DMAR);

                        /* Abort the UART DMA Rx stream */
                        if (huart1.hdmarx != NULL)
                        {
                                HAL_DMA_Abort(huart1.hdmarx);
                        }
                        CLEAR_BIT(huart1.Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE));
                        CLEAR_BIT(huart1.Instance->CR3, USART_CR3_EIE);

                        /* At end of Rx process, restore huart->RxState to Ready */
                        huart1.RxState = HAL_UART_STATE_READY;
                }               
                /*******************/
                Uart_recv_len = RECV_BUFFER_SIZE - (__HAL_DMA_GET_COUNTER(&hdma_usart1_rx));//获取接收数据的长度
                Uart_recv_flag = 1;
                memset(uart_dma_recv_buff_bak,0,RECV_BUFFER_SIZE);
                memcpy(uart_dma_recv_buff_bak,uart_dma_recv_buff,RECV_BUFFER_SIZE);
                memset(uart_dma_recv_buff,0,RECV_BUFFER_SIZE);
                __HAL_UART_DISABLE_IT(&huart1, UART_IT_IDLE);//关闭空闲中断
        }




使用特权

评论回复
板凳
漫天星yl|  楼主 | 2023-9-22 12:02 | 只看该作者
接收打开中断部分:
main.c
if (Uart_recv_flag == 1) //串口接收到信恿
        {
                Uart_recv_flag = 0;
               
                /*此处解析接收到的数据*/
               
                HAL_UART_AbortReceive(&huart1);
                HAL_UART_MspInit(&huart1);
                memset(uart_dma_recv_buff_bak,0,RECV_BUFFER_SIZE);
                HAL_UART_Receive_DMA(&huart1, (uint8_t*)uart_dma_recv_buff, RECV_BUFFER_SIZE);
                __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
        }
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

311

帖子

0

粉丝