打印
[应用相关]

STM32F1xx STM32F2xx STM32F4xx RCC灵活设定 不用默认时钟

[复制链接]
921|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
奥德赛|  楼主 | 2015-9-29 11:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
众所周知,每当系统复位时,会先调用SystemInit()函数,之后跳转__iar_program_start函数,进入main()函数。SystemInit()里复位了RCC,然后调用SetSysClock()函数对各种总线时钟频率进行了设定。

这里讲述一下外部晶振与预设值不同的情况
比如STM32F10x 系列 预设是8M  stm32f10x.h里的HSE_Value8M
犹如STM32F2xx 系列 预设为25M stm32f2xx.h里的HSE_Value 25M

这时候如果外部晶振变为12M怎么办,系统时钟必须不对啊。

首先启动外部晶振,还需要等待起震,然后PLL倍频,分频,比较麻烦,咱们就不管了
流程是调用SystemInit()
再调用system_stm32f2xx.c文件里的SetSysClock()
SetSysClock()就是设置时钟的函数了,但是看的人很晕,有宏定义在里面,不如库函数看的方便。这里就很苦手了,这时候应当回到system_stm32f2xx.c的说明,看了一遍以后,发现Line146(F1F2 F4出现位置不一样)但是差不了10行,出现了一个公式。在我把reference manualRCC那章肯了一遍以后,得出如果要修改RCC时钟,不管事倍频,分频,是需要根据公式计算就行了。SetSysClock()函数会根据

如下图的宏定义设置寄存器,就不用那么苦手自己设置了。

---------------------------------------------------------------------------------------------



---------------------------------------------------------------------------------------------
计算计算中..... PLL_VCO =(HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N..哦。。
这时候把PLL_M 修改为12 ,意思就是12M 再搜索整个工程HSE_VALUE #define的地方,一般就是在系列头文件,HSE_VALUE改为 12000000.这时候就大功告成了。

其实这个函数就是预先写好的操作寄存器的函数,如果要直接操作寄存器的话我也不反对,
但是调用这个函数无非是多了一个调用函数开销,和一些堆栈开销,看起来在初始化阶段是可以忽略的。除非你的资源真的很紧张。。。

举一反三,那么时钟分频怎么办,必须还在这个system_stm32xxxx.c文件里在SetSysClock()函数下,大概360多行,修改一下就可以了。。。

沙发
gejigeji521| | 2015-9-29 13:28 | 只看该作者
果然好玩,楼主特别有心,我也去试试修改修改

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

46

主题

397

帖子

3

粉丝