最近一项目调试中发现stm32的usart3在工作在dma接收模式下,如果接收数据超出了DMA1_Channel3->CNDTR的指定的长度,会覆盖且只覆盖接收buf[0]。
比如:参数配置CNDTR=3,而当发送在单片机接收引脚上的帧数据为0x01,0x02,0x03,0x04,0x05共5个字节,当DMA接收第3个字节0x03后,CNDTR=0 DMA停止读取串口接收数据,然后软件重新修改CNDTR=3,开启MDA接收功能等待发送到RX上的下一帧数据。问题来了,此时如果RX上没有接收到任何数据的情况先,DMA会自动将上一帧的0x04写入到buf[0],同时CNDTR被减一变为2。
感觉上一帧数据在CNDTR等于0时还是会触发一次DMA接收,当CNDTR重新不等于0以后就开始执行读操作。
附上调试代码,请高手指点,谢谢!!
|