现在想实现串口空闲中断+DMA接收的方式。在网上查的资料说stm32串口空闲中断在接收到一帧数据时,数据接收完毕后会进入一次IDLE中断,通过串口助手发送一帧数据时,发现经常会进入两次中断,很少进入一次中断。如果一帧数据分两次进入了IDLE中断,DMA在IDLE中断里的接收数据就有误了。开始以为时串口Rx引脚的问题,后来Rx引脚配置成上拉模式还是不行。
中断处理函数
- void USART3_IRQ_User(void)
- {
- uint8_t i;
- if(__HAL_UART_GET_FLAG(&huart3,UART_FLAG_IDLE) != RESET)
- {
- __HAL_UART_CLEAR_IDLEFLAG(&huart3);
- HAL_UART_DMAStop(&huart3);
- USART3_RxCount = RX_BUFFER_SIZE-__HAL_DMA_GET_COUNTER(&hdma_usart3_rx);
- HAL_UART_Receive_DMA(&huart3,USART3_RxBuffer,RX_BUFFER_SIZE);
- receive_over = 1;
-
- printf("count=%d\r\n",USART3_RxCount);
- for(i = 0;i<USART3_RxCount;i++)
- {
- printf(" %d",USART3_RxBuffer[i]);
- }
- printf("\r\n");
- }
- }
|