注释掉usart初始化后,屏幕就不显示任何东西了。他们之间有什么联系么?
STM32的发送和接收是通过数据寄存器USART_DR来实现的,这是一个双寄存器,包含了TDR和RDR。当向该寄存器写数据时,串口就会自动发送;当收到数据时,也存在该寄存器中。void USART_SendData(...)的意思就是想USART_DR寄存器写入数据。USART_ReceiveData(...)相反。
串口状态32位寄存器USART_SR【State Register】反映了串口的状态,它的各个位代表的内容如下图:
使用这个函数,就可以获取串口寄存器各个位的数值:
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);
这里关注两位:Bit5:RXNE;Bit6:TC
RXNE(读数据寄存器非空):当该位被置一时,说明已经有数据被接收了,并且可以读出来了。此时应尽快读取USART_DR。
读取USART_DR或向该位写0,都可以清除该位。
TC(发送完成):当该位被置位时,说明USART_DR中的数据已经被发送完成了。如果设置了这个位的中断,则会产生中断。
清零该位的两种方法:a、读取USART_SR,写USART_DR。b、直接向该位写0。
初始化串口很简单,一共分为三个步骤:
完整的初始化代码如下图:
根据参考资料的代码,可以看到该代码通过初始化GPIO和USART模块,实现了通过串口向上位机发送数据,并在接收到数据后将其原封不动地返回。关键在于USART的初始化,同时GPIO的初始化也是必要的。
然而,问题在于为什么注释掉USART的初始化后会影响LCD的显示。这里先强调一点,串口和LCD是完全不同的模块,没有直接的联系。但是可以从另一个角度来考虑这个问题。USART1的TX和RX引脚分别连接到PA9和PA10上,而这两个引脚,对应的是STLink调试器的SWDIO和SWCLK,这两个引脚是属于调试器和目标芯片之间的通信接口。为了避免冲突,STLink调试器会在调试开始时关闭SWDIO和SWCLK,因此在STM32不进行USART初始化时,这两个引脚是被关闭的,而一旦进行USART初始化时,这两个引脚就会被重新打开。这样就会导致当STM32未进行USART初始化时,SWDIO和SWCLK失效,因此会无法使用调试功能。而普通的程序可能不会受到影响,但是像LCD这样需要精确的时序的模块,就会出现问题。
因此,解决的方案有以下几种: 1. 在USART未初始化时,需要关闭调试模式,这可以通过将JTAG/SWD模式从调试器软件中更改为SWIM模式来实现,或者直接将JTAG/SWD模式从芯片的BOOT0引脚上跳线设置为1。 2. 如果不需要调试功能,可以将SWD功能从芯片引脚上拆除或进行物理断开。
总之,核心问题在于USART1的引脚连接了调试器的SWDIO和SWCLK,这会导致两个模块间可能存在干扰,从而影响LCD的显示。因此需要采取以上方案进行解决。
检查下LCD的引脚跟串口的引脚是不是在一个GPIO口上,可能USART在初始化时才进行了接口的时钟使能!