搜索
bottom↓
回复: 35

关于STM32外接12MHz晶振的处理办法

[复制链接]

出0入0汤圆

发表于 2010-12-26 17:27:38 | 显示全部楼层 |阅读模式
由于STM32F10x库官方采用的是默认的外接8MHz晶振,因此造成很多用户也采用了8MHz的晶振,但是,8MHz的晶振不是必须的,其他频点的晶振也是可行的,只需要在库中做相应的修改就行。
    在论坛上看到很多用户反映,使用外接12MHz的晶振,会造成很多的问题,如USART的波特率不正确,Systick走时不准等问题,在无论是在实际调试还是在软件模拟中都会发现这个情况,其实,这不能怪ST官方,我们必须肯定ST官方为方便用户开发所做的努力,下面我们就通过简单的三个步骤就可以让你随意的使用4—16MHz之内任何频点的晶振,我们以STM32F10x_StdPeriph_Lib_V3.4.0为例说明。
    第一步,打开stm32f10x.h,将
#define HSE_VALUE    ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */
修改为:
#define HSE_VALUE    ((uint32_t)12000000) /*!< Value of the External oscillator in Hz */

    第二步,打开system_stm32f10x.c,修改PLL参数,将
    /*  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_PLLMULL9);
修改为:  
    /*  PLL configuration: PLLCLK = HSE * 6 = 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);
    至此,原文件已经修改完成,如果你想将主频修改至其他频率,请自行修改。但是,到现在,如果您直接编译调试的话,就会出现上文所说的USART的波特率不正确,Systick走时不准等问题,原因就是我们需要进行第三部的修改,这个修改不是在原文件中,而是在编译环境中。我们已Keil MDK为例说明。
    第三步,打开你已经建立的STM32工程,选择Projects-〉Options for target ***,找到Target标签,你会发现,外接的晶振默认还是8MHz,我们将外接的晶振参数修改为12MHz,确定保存,再编译,调试,你就会发现,所有的参数都回归的正常轨道,设置波特率为9600,它也不会跑到14400,设置Systick为1ms中断,它不会1.5ms中断。

现在,我们也得出了一个结论,在keil MDK编译环境的设置参数的优先级是高于原文件中的设置的。

出0入0汤圆

 楼主| 发表于 2010-12-26 17:44:04 | 显示全部楼层
昨天晚上,我花了两个小时认真阅读了STM32F10x_StdPeriph_Lib_V3.4.0相关源代码,结合坛友的疑问和自己的实际经验得出的结论,欢迎广大坛友论证实验!

出0入0汤圆

发表于 2010-12-26 17:46:10 | 显示全部楼层
12M一年前就用过,当初手中没有8M的。

出0入0汤圆

发表于 2010-12-26 19:23:52 | 显示全部楼层
我想知道 STM32F10X_LD_VL 是在那里定义的????

#if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL)
/* #define SYSCLK_FREQ_HSE    HSE_Value */
#define SYSCLK_FREQ_24MHz  24000000
#else
/* #define SYSCLK_FREQ_HSE    HSE_Value */
/* #define SYSCLK_FREQ_24MHz  24000000 */
/* #define SYSCLK_FREQ_36MHz  36000000 */
/* #define SYSCLK_FREQ_48MHz  48000000 */
/* #define SYSCLK_FREQ_56MHz  56000000 */
#define SYSCLK_FREQ_72MHz  72000000
#endif

出0入0汤圆

发表于 2011-1-7 09:42:20 | 显示全部楼层
顶LZ  谢谢

出0入0汤圆

发表于 2011-1-7 10:58:40 | 显示全部楼层
想超频的可以拿来用用看,效果怎么样!呵呵 !

出0入12汤圆

发表于 2011-1-7 11:12:32 | 显示全部楼层
求给个最新的库,ST改版都不知道哪里下了

出0入0汤圆

发表于 2011-1-7 12:16:58 | 显示全部楼层
求给个最新的库

出0入12汤圆

发表于 2011-1-7 13:39:25 | 显示全部楼层
找到了
http://www.st.com/internet/com/SOFTWARE_RESOURCES/SW_COMPONENT/FIRMWARE/stm32f10x_stdperiph_lib.zip

出0入0汤圆

发表于 2011-4-20 00:26:45 | 显示全部楼层
哪里定义CPU类型?

出0入0汤圆

发表于 2011-4-20 09:36:09 | 显示全部楼层
如果用到软件仿真的话,第三步是必须的。如果直接下到flash中运行的话,第三步可以不修改。
KEIL中那个晶振的设置只和仿真有关,最后LZ的一句的结构似乎不对吧?

出0入0汤圆

发表于 2011-4-20 13:33:35 | 显示全部楼层
这么多跳线

出0入0汤圆

发表于 2011-5-21 15:57:28 | 显示全部楼层
3.4版本重新定义一点用都没有。

出0入0汤圆

发表于 2013-8-25 15:33:33 | 显示全部楼层
呵呵,新的固件库的确不是这么改的

出0入0汤圆

发表于 2013-10-17 20:55:56 | 显示全部楼层
nicholasdlut 发表于 2013-8-25 15:33
呵呵,新的固件库的确不是这么改的

必须重新编译库,更痛苦。

出0入0汤圆

发表于 2014-2-25 14:01:18 | 显示全部楼层
请问 3.5 固件库   应该怎么该呢?

出0入0汤圆

发表于 2014-2-25 14:39:24 | 显示全部楼层
我试验  楼主的修改方法是可以的啊-----------

出0入0汤圆

发表于 2014-2-25 14:44:57 | 显示全部楼层
可以改啊

出0入0汤圆

发表于 2014-2-25 18:08:47 | 显示全部楼层
netawater 发表于 2013-10-17 20:55
必须重新编译库,更痛苦。

请教是怎么改的啊  ????

出0入0汤圆

发表于 2014-2-25 18:10:43 | 显示全部楼层
nicholasdlut 发表于 2013-8-25 15:33
呵呵,新的固件库的确不是这么改的

请教是怎么改的啊???

出0入0汤圆

发表于 2014-2-25 18:31:32 | 显示全部楼层
FASHAOYIHAOAMO 发表于 2014-2-25 18:08
请教是怎么改的啊  ????

要么改了重新编译相关库,要么将源文件全拷到工程目录里,改了重新编译。

出0入0汤圆

发表于 2014-2-28 12:03:50 | 显示全部楼层
mark,有时间试下!

出0入0汤圆

发表于 2014-3-7 09:13:04 | 显示全部楼层
看看,学学!顶一个!

出0入42汤圆

发表于 2014-3-7 10:03:19 来自手机 | 显示全部楼层
不建议这么改,没记错的话这个头文件是只读的,这表明这个文件是官方不建议改的
我用的方法是:
1,在编译器的预处理选项中添加 HSE_VALUE=12000000
2,去掉system_stm32f10x.c,自己另写一个System_Init,想怎么配时钟就怎么配

出0入0汤圆

发表于 2014-3-13 12:01:09 | 显示全部楼层
感谢楼主-------

出0入0汤圆

发表于 2014-4-23 14:12:37 | 显示全部楼层
点击-------------

出0入4汤圆

发表于 2014-4-23 15:37:34 | 显示全部楼层
wso75839840 发表于 2011-4-20 09:36
如果用到软件仿真的话,第三步是必须的。如果直接下到flash中运行的话,第三步可以不修改。
KEIL中那个晶振 ...

对的,如果直接下载到flash中的话,是不需要修改第三步的。

出0入0汤圆

发表于 2014-6-15 16:43:28 | 显示全部楼层
wshtyr 发表于 2014-3-7 10:03
不建议这么改,没记错的话这个头文件是只读的,这表明这个文件是官方不建议改的
我用的方法是:
1,在编译器 ...

在编译器的预处理选项中添加 HSE_VALUE=12000000 这个方法最靠谱了
因为在官方库stm32f10x.h早有预定义
#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)8000000) /*!< Value of the External oscillator in Hz */
#endif /* STM32F10X_CL */
#endif /* HSE_VALUE */

所以只要在预处理中添加HSE_VALUE=12000000,就不用对库文件作任何更改了

出0入0汤圆

发表于 2014-6-17 09:08:29 | 显示全部楼层
mark 学习一下

出0入0汤圆

发表于 2014-11-19 18:20:19 | 显示全部楼层
三步都改了呀  为什么还是没有成功呢?

出0入8汤圆

发表于 2014-11-19 18:25:40 | 显示全部楼层
顶楼主,学习了

出0入0汤圆

发表于 2014-11-19 19:23:48 | 显示全部楼层
刚刚测了一下  按照上面的方法,只有8M呀  求前辈指点

出0入0汤圆

发表于 2015-4-11 21:03:01 | 显示全部楼层
在编译器的预处理选项中添加 HSE_VALUE=12000000 ,但是又不想动system_stm32f10x.c中system文件,有没有什么好办法??

出0入0汤圆

发表于 2016-1-12 16:33:46 | 显示全部楼层
总结的非常到位!清楚明白一针见血

出0入0汤圆

发表于 2016-5-27 07:41:57 | 显示全部楼层
一直在用12M的,没有出现什么问题,感觉很稳定。

出0入0汤圆

发表于 2017-3-22 22:03:53 | 显示全部楼层
唯美世佳 发表于 2016-5-27 07:41
一直在用12M的,没有出现什么问题,感觉很稳定。

您是怎么设置的,可以分享一下吗?
谢谢。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-18 17:41

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表