STM32 MCU的外部晶体振荡器无效?那是因为配置错误吗?

1.提出的问题新项目使用STM32单片机,并使用波特率为500k的CAN通信,因此不使用内部晶体振荡器,而是使用12M外部晶体振荡器。

该项目的程序员发现在调试过程中STM32的时钟频率是错误的,因此我寻求帮助并找到了原因。

2.数据表上的答案通过阅读微控制器的数据表,我们知道STM32的默认外部晶振频率为8M,可以输出72M的频率。

因此,我发现对库函数的注释如下:HSE晶体的默认值设置为8 MHz(或25 MHz,取决于所使用的产品),请参见“ HSE_VALUE”。

在“ stm32f10x.h”中定义当将HSE用作系统时钟源时,直接或通过PLL使用不同的晶振时,必须将HSE值调整为自己的配置。

根据描述,在stm32f10x.h中,大约0121行将从8000000更改为12000000. // WeChat官方帐户:Fun Embedded,ID:micropoint8 #if!defined& nbsp;& nbsp; HSE_VALUE #ifdef STM32F10X_CL #define HSE_VALUE& nbsp;& nbsp;& nbsp;((uint32_t)25000000)/ *!<外部振荡器的值(Hz)* / #else #define HSE_VALUE& nbsp;& nbsp;& nbsp;((uint32_t)12000000)/ *!<外部振荡器的值(Hz) 。

仍然无效,但是很奇怪,即使此处的值被修改,PLL时钟仍然不正确(PLL按9倍频率配置)。

4. PLL时钟配置按照代码查找原因,最后发现真正起作用的部分是system_stm32f10x.c中的SetSysClockTo72(void)函数(第0993行,这里我们假设我们希望MCU在72MHZ下工作)。

在第1058行上有这样一段代码:#else / *& nbsp; PLL& nbsp;配置:& nbsp; PLLCLK& nbsp; =& nbsp; HSE& nbsp; *& nbsp ; 9& nbsp; =& nbsp; 72& nbsp; * / RCC-& gt; RCGR& nbsp;& amp; = nbsp;(uint32_t)((uint32_t)〜(RCC_CFGR_PLLSRC& |||||||||||||||||||||||||||||||||||||||||| nbsp;& nbsp;& nbsp;& nbsp;& nbsp;& nbsp;& nbsp;& nbsp;& nbsp;& nbsp;& nbsp; & nbsp;& nbsp;& nbsp;& nbsp;& nbsp;& nbsp;& nbsp;& nbsp;& nbsp;& nbsp;& n nbsp;& nbsp;& nbsp;& nbsp;& nbsp; RCC_CFGR_PLLMULL));& nbsp;& nbsp;& nbsp;& nbsp; RCC-> CFGR& nbsp; | =& nbsp;(uint32_t)(RCC_CFGR_PLLSRC_HSE& RCC_CFGR_PLLMULL6);该功能附带了注释部分,而真正起作用的部分在此处,因此将RCC_CFGR_PLLMULL9更改为RCC_CFGR_PLLMULL6。

此时,STM32可以正常输出PLL时钟频率。

免责声明:本文内容经21ic授权后发布,版权归原作者所有。

该平台仅提供信息存储服务。

本文仅代表作者的个人观点,并不代表该平台的立场。

如有任何疑问,请与我们联系,谢谢!

产品相关