STM32单片机外部晶振无效?那是因为配置不对?

作者:中国电子网 日期:2021-02-20 14:01:10 人气: 栏目:电工技术


1.问题的提出

新项目用到STM32单片机,用到了500k波特率的CAN通讯,因此没有使用内部晶振,而是用到了12M的外部晶振。该项目的程序员在调试的时候发现,STM32的时钟频率不对,于是我给帮忙看了一下,找到了原因。

2.Datasheet上的答案

通过翻阅单片机的datasheet我们知道,STM32默认的外部晶振频率为8M,可输出72M的频率。于是找到了库函数的一段注释,如下:
The default value of HSE crystal is set to 8 MHz (or 25 MHz, depedning on the product used), refer to "HSE_VALUE" define in "stm32f10x.h" file.When HSE is used as system clock source, directly or through PLL and you are using different crystal you have to adapt the HSE value to your own configuration.
根据描述,将stm32f10x.h中大约在0121行将8000000修改为 12000000
   //微信公众号:玩转嵌入式,ID:micropoint8 #if !defined  HSE_VALUE #ifdef STM32F10X_CL  #define HSE_VALUE    ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */ #else  #define HSE_VALUE    ((uint32_t) 12000000 ) /*!< Value of the External oscillator in Hz */ #endif /* STM32F10X_CL */ #endif /* HSE_VALUE */ //微信公众号:玩转嵌入式,ID:micropoint8  

3.依然无效

不过很奇怪的是,即使修改了此处的值,PLL的时钟还是不正确(PLL按9倍频配置)。

4.PLL时钟配置

顺着代码寻找原因,最后发现真正起作用的部分在 system_stm32f10x.c里的 SetSysClockTo72(void)函数(0993行,这里假设我们希望MCU工作在72MHZ)。
在1058行有这样一段代码:
#else  /*  PLL configuration: PLLCLK = HSE * 9 = 72 MHz */ RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
                                        RCC_CFGR_PLLMULL));
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL6); 
注释部分是函数自带的,真正起作用的部分在这里,因此把RCC_CFGR_PLLMULL9改为 RCC_CFGR_PLLMULL6

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

免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

以上电工吧小编收集整理的 STM32单片机外部晶振无效?那是因为配置不对? 部分内容来自网络,如有侵权请联系删除
本文地址:http://www.dg8.com.cn/jishu/27811.html

end
热门标签:
今日推荐
2020中国电动车质量排名前十名有哪些品牌?
2020中国电动车质量排名前十名有哪些品牌?

 2020随着电动车越来越受年轻上班族的喜爱,而骑电动车也成为了一种时尚,电动车作为短距离代步工具,具有环保、经济、不塞车等诸多优势,越来越多的人选择这种低碳环保的出行方式。那么电动车十大排名,都有哪些品牌全面领先行业呢?  第一名:雅迪电动车 ...[详细]