2015.8.3stm32f4串口调试记录
由于最近要做一个IRIGB的转码模块,需要从GPS模块获取时间数据,处理器和GPS采用串口通信的方式。由于串口通信用得太多,就直接上手将串口的配置代码写完,然后试着用串口发送一个字符‘2‘,然后通过PC上的串口调试助手,可以看到我收到的是一个’向上的箭头‘。于是问题来了,对于我这个单片机玩了都不玩的人来说,这似乎有点弱智,可是我调了一下午也没发现什么端倪,因为,这个代码确实是比较简单。最后没有办法只有用百度去搜搜类似的问题,百度上答案无非都是在说是时钟配置问题,但是这一点我似乎不太相信。因为之前我也遇到过类似时钟配置的问题,但是后来我都改过来了,所以时钟配置应该是没什么问题的。我还用个LED测试了一下,让他每隔一秒闪烁一下,结果显示正常。之前时钟出问题是由于板载时钟是8MHz,但是在文件system_stm32f4xx.c中却将PLL_M设置成了25,改过来之后就好了。
/* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */ #define PLL_M 8 #define PLL_N 336
抱着对时钟配置正确的想法,我又折腾了很久,还是没有丝毫进展,于是又去仔细查看别人的回答,偶然看到一个人的回答,他说时钟配置除了以上位置要改之外,还有一处要设置,我按照他的方法设置之后,测试结果正确。这一处代码就在stm32f4xx.h中:
#if !defined (HSE_VALUE) #define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */ #endif /* HSE_VALUE */
原来里面的是((uint32_t)25000000),这里由于板载时钟是8MHz,所以要将其改为8000000
2016.5.30
做网络通信,用串口配置WiFi时,发现串口出现乱码,调试许久无果。怀疑是时钟问题,经查找,发现除了上面两处跟时钟相关的地方之外还有一处就是在stm32f4xx.conf.h里面。有这样一段代码:
#if defined (HSE_VALUE)
/* Redefine the HSE value; it's equal to 8 MHz on the STM32F4-DISCOVERY Kit */
#undef HSE_VALUE
#define HSE_VALUE ((uint32_t)8000000)
#endif /* HSE_VALUE */
由于本次单片机用的时钟是10MHz的时钟,修改时只修改了上面头两处,然后在主函数里面用IO和延时输出脉冲发现,输出方波正常,但是串口乱码。然后发现在stm32f4xx.conf.h里面有这样一处,发现在这里将之前的HSE_VALUE(10MHz)已经#undef,然后重定义成了8MHz,所以造成串口时钟对不上。