现在想实现串口空闲中断+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");
}
}
|