各位大佬好,@dirtwillfly @hgjinwei @icecut @m564522634 @tyw @ufbycd @xyz549040622 前阶段做了个DMA双缓冲,用着也还行,但是最近发现一个问题。
DMA在前第一次切换的时候会不成功。代码如下。
第一次进空闲中断时,数据在UartxRT->RxDMA_Buf,在if(UartxRT->witchbuf==1)中,将缓冲区切换到UartxRT->RxDMA_Buf2.
第二次进空闲中断时,发现实际上数据还是接收到了UartxRT->RxDMA_Buf。此时运行的是else if(UartxRT->witchbuf==2) ,再次切换到UartxRT->RxDMA_Buf。
第三次进空闲中断时,数据在UartxRT->RxDMA_Buf。然后再次切换到UartxRT->RxDMA_Buf2.
第四次进空闲中断时,发现数据在UartxRT->RxDMA_Buf2,以后的切换都正常。
问题来了,为什么第一次切换会不成功?此前初始化过串口,改了波特率,与这个有关?
- void UsartReceive_IDLE(UART_HandleTypeDef *huart,UartBufferTypedef *UartxRT )
- {
- uint32_t temp;
- if((__HAL_UART_GET_FLAG(huart,UART_FLAG_IDLE) != RESET)) //获取IDLE标志位,如果idle标志被置
- {
- __HAL_UART_CLEAR_IDLEFLAG(huart); //清除串口空闲标志
- HAL_UART_DMAStop(huart);
- temp=__HAL_DMA_GET_COUNTER(huart->hdmarx); //获取DMA中未传输的数据个
- UartxRT->RxDMALen = MAX_RxDMA_BUFFER - temp; //总计数减去未传输的数据个数,得到已经接收的数据个
- if(UartxRT->witchbuf==1) //之前用的buf1,切换为2
- {
- UartxRT->witchbuf=2;
- HAL_UART_Receive_DMA(huart,(uint8_t *)UartxRT->RxDMA_Buf2,MAX_RxDMA_BUFFER); //重启串口DMA接收到buf2
- UartxRT->RxLen+=UartxRT->RxDMALen;
- }
- else if(UartxRT->witchbuf==2) //之前用的buf2,切换为buf1
- {
- UartxRT->witchbuf=1;
- HAL_UART_Receive_DMA(huart,(uint8_t *)UartxRT->RxDMA_Buf,MAX_RxDMA_BUFFER); //重启串口DMA接收到buf1
- UartxRT->RxLen+=UartxRT->RxDMALen;
- }
- }
- }
|