这段时间自己开了一块STM32F4的板子,调试过程中发现,外部电路焊接的晶振为8MHz,但在调试过程中检测得的时钟确是25MHz,令人恼火。
本着遇到问题解决问题的思路,开始思考问题出在哪里。
首先,将单片机的系统时钟配置为内部的16MHz晶振,单片机工作正常,说明电路板是没问题的。
之后,将单片机的系统时钟配置成外部8MHz晶振,发现通过RCC_GetClocksFreq函数获取的时钟值确是25MHz,由此观之问题可能出在两个方面:
1:晶振本身有问题;
2:RCC_GetClocksFreq函数获取时钟值问题。
通过用调换三个晶振,结果一样,初步判定晶振是没有问题的。那么问题就是出在RCC_GetClocksFreq函数上了,仔细翻看函数不难发现,这个函数获取时钟值并不是通过单片机内部的寄存器读值的,而是预先设定好的一个宏定义值,如下图所示:
很明显,这个值和我使用的实际的晶振值是不同的,因此需要把这个值修改成实际使用的晶振值才可以,否则,程序中依赖这个值进行计算的地方都会出错。
定位到这个宏定义在stm32f4xx.h文件下,如下图:
果然不出所料,将这个值改为:8000000,编译、烧录、运行,问题即解决。
快速解决>>>>>>
修改默认晶振需要修改的位置:
stm32f4xx.h文件下的第139行的HSE_VALUE值为实际晶振值。