STM32F103VCT6 UART发送丢失最后一个字节的问题解决

需积分: 5 5 下载量 43 浏览量 更新于2024-09-07 收藏 237KB PDF 举报
STM32F103VCT6在使用UART进行通信时遇到一个问题,即在进入STOP低功耗模式前,通过USART3发送的命令报文会丢失最后一个字节。这个问题经过一系列的测试和代码修改得到了解决。 在STM32微控制器的设计中,STOP模式是一种节能模式,允许设备在不需执行任何操作时降低功耗。然而,在进入STOP模式前,系统通常需要完成一些必要的设置,包括通过UART发送特定命令。在这种情况下,客户发现通过USART3发送的报文在到达最后一字节时出现问题,导致数据不完整。 初步调研显示,通过示波器观察到报文确实缺少了最后一个字节。尝试使用Windows超级终端进行长时间接收,没有发现类似问题,这表明问题可能与系统进入STOP模式有关。进一步的代码修改和测试揭示,当在进入STOP模式前加入一个GPIO翻转操作时,报文能够完整发送。这表明进入STOP模式的速度可能快于UART发送数据的速率。 原来的问题在于,代码使用了USART_FLAG_TXE标志来判断数据是否发送完成,而这个标志只表示数据已加载到移位寄存器,但并不意味着数据实际已经通过串口线传输。因此,STM32在数据尚未完全发送出去时就进入了STOP模式,导致最后一个字节丢失。 为解决此问题,代码被修改为使用USART_FLAG_TC(Transmit Complete)标志,这个标志表明数据不仅已加载到移位寄存器,而且已经成功发送完毕。应用这一修改后,报文在PB7翻转前能完整发送,从而在进入STOP模式前确保数据的完整性。 结论是,正确地使用USART_FLAG_TC作为数据发送完成的依据,而不是USART_FLAG_TXE,能避免在STOP模式启动前数据丢失。这为STM32开发者提供了一个重要教训,即在处理低功耗模式与UART通信的交互时,必须确保数据发送操作的完成状态。 建议使用STM32的开发者在处理UART发送时,要正确理解并使用状态寄存器USART_SR中的标志位,尤其是与数据发送完成相关联的USART_FLAG_TXE和USART_FLAG_TC,以确保数据完整无误地发送。在进入STOP模式或任何可能导致中断数据传输的操作前,应当等待USART_FLAG_TC标志置位,以确保所有数据都已发送完毕。