stm32开机时,在eeprom读取存储的内容,发送给DGUS屏进行显示数据,但是第一个数据显示是0。
时间:10-02
整理:3721RD
点击:
stm32开机时,在eeprom读取存储的内容,然后用串口发送给DGUS屏的变量地址进行显示数据,但是第一个数据显示是0,而且之前发送接收数据时串口通信都不存在问题。通过测试eeprom读数据是成功的,但是为什么DGUS屏显示的第一个数据会失败呢?
第一点,有可能是变量地址写错了,
第二点,有可能是串口传输的问题,
第三点,有可能是dgus屏接收显示数据太慢。
经过咨询DGUS屏的客服,客服的回答是:“会有延时,等完全启动后再发”。
但是在客服回复我之前,我已经找到的我的问题所在,并且已经解决了我的问题。
其实问题就是串口的发送问题,虽然在此之前串口通信并没有问题,最终还是不太严谨的问题。
//串口发送函数
void Txd_Byte(u8 data)
{
USART1->DR=data;
while((USART1->SR&0X40)==0);
}
这里判断的是TC位,要等到数据到移位寄存器中完成后,再发送第二帧数据,但是,由于SR寄存器的复位值是0x00c0,即一开始TC位就是置1的,所以当第一次数据写入DR寄存器中的时候头一个while没有起作用,当第二个数据来了就把第一个数据覆盖了,这就是串口的第一个数据丢失了的原因!解决的办法就是直接判断TXE位,把0X40改为0X80即可。
当数据从发送缓冲器传送到移位寄存器时,设置TXE标志(发送缓冲器空),它表示内部的数据缓冲器可以接收下一个数据了。详情请查阅stm32参考手册。
第一点,有可能是变量地址写错了,
第二点,有可能是串口传输的问题,
第三点,有可能是dgus屏接收显示数据太慢。
经过咨询DGUS屏的客服,客服的回答是:“会有延时,等完全启动后再发”。
但是在客服回复我之前,我已经找到的我的问题所在,并且已经解决了我的问题。
其实问题就是串口的发送问题,虽然在此之前串口通信并没有问题,最终还是不太严谨的问题。
//串口发送函数
void Txd_Byte(u8 data)
{
USART1->DR=data;
while((USART1->SR&0X40)==0);
}
这里判断的是TC位,要等到数据到移位寄存器中完成后,再发送第二帧数据,但是,由于SR寄存器的复位值是0x00c0,即一开始TC位就是置1的,所以当第一次数据写入DR寄存器中的时候头一个while没有起作用,当第二个数据来了就把第一个数据覆盖了,这就是串口的第一个数据丢失了的原因!解决的办法就是直接判断TXE位,把0X40改为0X80即可。
当数据从发送缓冲器传送到移位寄存器时,设置TXE标志(发送缓冲器空),它表示内部的数据缓冲器可以接收下一个数据了。详情请查阅stm32参考手册。
学习了解一下 感谢分享经验
这里有一个STM32免费样品的申请链接,只需要填个问卷就行 希望可以帮到你
https://www.sojump.hk/jq/15943942.aspx