重工电子论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 4991|回复: 1
打印 上一主题 下一主题

STM32F103的时钟配置问题

[复制链接]

12

主题

66

帖子

538

积分

高级会员

Rank: 4

积分
538
QQ
跳转到指定楼层
楼主
发表于 2016-1-12 17:14:00 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
      新拿到一块板子,需要测试一下板子工作是否正常,先上电检查电压,没有问题;点了个灯,也闪的很欢快;再测试SD卡存储,也没有问题;然后测试串口的时候,出来是乱码。经过分析,发现晶振焊的是12M的,程序里默认8M,这就需要修改时钟配置,读了stm32参考手册里关于时钟的描述,有两种解决办法,一种使用内部高速时钟HSI,一种仍然使用HSE时钟,但是需要对库文件里关于时钟的配置进行修改;想一下,还是用外部晶振稳定精确一些,决定用第二种方法改,我是懒人,不想一点点读库函数,于是先百度,很顺利的在网上找到了修改办法。以下红色字体是修改办法,出自阿莫论坛的一个坛友:
      
  由于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中断。
       按照说明改完之后,OK,串口正常工作。 这里面HSE_VALUE    和PLL倍频倍数进行了修改,也就提供了一种超频工作的办法,想到了以前在学校里刚接触STM32用它来做摄像循迹的小车的时候想过用超频提高小车对赛道的响应速度,但是不知道怎么来实现超频。stm32f103默认最高工作于72M,如果使用8M晶振,最大倍频数16,就可以倍频到8M*16=128M,在对处理速度有特殊需求的情况下,让MCU在短时间内超频工作应该也是可以的。具体超频到多少能够正常工作,工作多久,待测试,有兴趣的可以研究一下。

      
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

299

主题

684

帖子

7026

积分

学生管理组

Rank: 8Rank: 8

积分
7026
沙发
发表于 2017-2-2 16:56:57 | 只看该作者
正常情况,战舰里面的那一集视频讲清楚了朗格设置分频和倍频的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|cqutlab ( 渝ICP备15004556号

GMT+8, 2024-12-22 22:46 , Processed in 0.179855 second(s), 29 queries .

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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