最近使用STM32F429,参考原子哥的HAL库函数进行编程,使用串口时出现乱码。波特率设置115200,程序和串口都设置115200。串口一直乱码。
我的硬件是自己画的PCB,外部晶振是16M的。我串口程序是直接将原子哥资料中的串口实验拿出来进行修改,由于晶振不同,通过修改 Stm32_Clock_Init(360, 16, 2, 8); 将系统时钟配置成180M,在while中写了一个delay_ms(500);点灯,然后printf(“111
”),本以为没问题了。结果出现打印乱码。然后在网上搜索问题。发现出现乱码主要是串口波特率配置和系统时钟的原因,但是很快排除了上面两种原因(因为波特率设置是对的,系统时钟“自以为”也是对的)。
问题没有得到解决,最后我通过示波器观察实际输出,发现波特率不对,一个码元输出时间为13.8us左右,然后我通过反推实际的波特率,1/0.0000138 = 72463.76。然后我通过115200/72463 = 1.58,而我恰好发现25M/16M = 1.56.两个值很接近,于是我猜想USART1的时钟(APB2)还是以25M晶振来算的,但是我实际晶振是16M,而且我确实写了Stm32_Clock_Init(360, 16, 2, 8); 将系统时钟配置为180M了。我也感到疑惑。没办法,我就按照网上的晶振不同设置系统时钟的方法(这个地方网友可以百度),找到HSE_VALUE定义的地方(在stm32f4xx_hal_conf.h中),发现这里写着#define HSE_VALUE ((uint32_t)25000000);是25M。我也没注意这个值,死马当活马医,改为#define HSE_VALUE ((uint32_t)16000000);然后,重新编译下载,结果神奇般的正确了。
那么问题来了,明明程序已经写了Stm32_Clock_Init(360, 16, 2, 8); 将系统时钟已经配置为180M了,为什么还收到HSE_VALUE值得影响呢(Stm32_Clock_Init(360, 16, 2, 8); 函数是原子哥写的,可能是为了方便修改, 并不是官方给的例程)?我看到过网上说ST在启动文件中对系统时钟已经配置过了,在main函数中不需要重新配置时钟,我在程序中注释掉过Stm32_Clock_Init(360, 16, 2, 8); 发现根本时钟延时根本不对,这又是为什么?希望原子哥能解答下,谢谢!
一周热门 更多>