你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32入门系列-STM32时钟系统,自定义系统时钟

[复制链接]
STMCU小助手 发布时间:2022-7-1 13:00
    在时钟树的讲解中我们知道,通过修改PLLMUL中的倍系数值(2-16)可以改变系统的时钟频率。在库函数中也有对时钟倍频因子配置的函数,如下:2 R  t) u; h/ W7 a; f' g

void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t RCC_PLLMul);
3 x1 K; O. {" v0 y8 \

    第一个参数是PLL时钟源选择,例程中一般采用的都是HSE作为PLL的时钟源,可以设置为RCC_PLLSource_HSE_Div1/RCC_PLLSource_HSE_Div2。第二个参数就是倍频因子值可以是RCC_PLLMul_2~RCC_PLLMul_16。方便修改系统时钟,这里自定义一个系统时钟初始化函数,将函数放在对应实验程序的main.c中。自定义系统时钟,可以通过修改PLL时钟源和倍频系数实现时钟调整具体代码如下:
) n( _  Z, `3 j  k, z7 N

void RCC_HSE_Config(u32 div,u32 pllm) //自定义系统时间(可以修改时钟)6 l; h: e+ l( z5 j& p# D* F8 H
{- i+ u/ }- q- N9 n; G( h7 `
    RCC_DeInit(); //将外设RCC寄存器重设为缺省值
- I+ z+ R1 L5 {" r& K3 p! J3 M4 M    RCC_HSEConfig(RCC_HSE_ON);//设置外部高速晶振(HSE)! I0 p8 f, h! m5 t5 e( p
    if(RCC_WaitForHSEStartUp()==SUCCESS) //等待 HSE 起振3 }1 y& A8 L1 W9 v8 N% G! m! P! B
    {5 j- ~4 u7 Z' K# F! C  m' {+ z
        RCC_HCLKConfig(RCC_SYSCLK_Div1);//设置AHB时钟(HCLK)
% i( v, s& D5 ^+ C  o$ y% u& m3 G0 b        RCC_PCLK1Config(RCC_HCLK_Div2);//设置低速AHB时钟(PCLK1)
, }% I: p) Z: X2 h! F7 T  w        RCC_PCLK2Config(RCC_HCLK_Div1);//设置高速AHB时钟(PCLK2)& Y2 M* Y/ K. W( n. F- s3 @' V) ?
        RCC_PLLConfig(div,pllm);//设置PLL时钟源及倍频系数1 B. L' w: |( Z' g5 R. g) g
        RCC_PLLCmd(ENABLE); //使能或者失能PLL7 r& ~7 Y9 a6 x. y
        //检查指定的RCC标志位设置与否,PLL就绪: |: N0 V$ g, N9 v: y
        while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);
        //设置系统时钟(SYSCLK)
( T  }: t" |* l& N        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);& \3 |+ r! v) R8 K) m& L& U; X
        //返回用作系统时钟的时钟源,0x08:PLL作为系统时钟
        while(RCC_GetSYSCLKSource()!=0x08);
" q1 s# u" V5 g8 q    }
}

    函数具体实现过程在程序中已经注释,大家可以参考注释。在函数中设置倍频因子时,我们给他传递了形参中的变量,这样做的好处是当你调用此函数时,只需要修改传递给函数形参内的值即可修改系统时钟,无需修改函数内部程序。在未修改系统时钟时,系统初始化后的时钟是72M,对应着此函数参数设置如下:

RCC_HSE_Config(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);
$ K4 s! J+ l. z9 a* |0 A

    如果想让系统时钟为36M,只需要将参数值修改即可:
) |2 w- H/ e: I& q

RCC_HSE_Config(RCC_PLLSource_HSE_Div2,RCC_PLLMul_9);' v9 l# s/ I6 ~- e5 o+ E

    此时修改的是div这个参数值,此参数用来对HSE时钟分频系数设置,从时钟树可知,HSE可以直接流入到PLLSRC,还可以经过2分频后给PLLSRC。它的取值为RCC_PLLSource_HSE_Div1或RCC_PLLSource_HSE_Div2。/ x, \. F) s$ ]  k  B* F
    最后我们可以通过一个LED指示灯闪烁速度来反映系统时钟修改后的效果。主函数代码如下: 7 @' s4 T* j! q+ T1 b

int main()
. A. L0 V* p# H9 v2 i{
8 G, `$ X& }: r, i* W    RCC_HSE_Config(RCC_PLLSource_HSE_Div2,RCC_PLLMul_9); //36M
2 j- B' h$ [# J: U  c    LED_Init();
' q1 a. ^8 ^: K    while(1)
% C6 b0 @9 Q6 T. n3 N0 g    {: H5 p6 C; F) W* `6 k
        GPIO_ResetBits(LED_PORT,GPIO_Pin_0);//点亮D1
: P) {8 y4 P& O  h, S. r7 [+ X        delay(6000000);
4 Q6 @1 m: e$ E. E- ?& H# I        GPIO_SetBits(LED_PORT,GPIO_Pin_0);/ I  O' m1 ]% F) c/ ]3 o; V
        delay(6000000);! G' W% b/ m. T' {: h# e
    }
}

    如果将div原先的1值修改为2,此时系统时钟即为36M,相当于速度慢了一倍。LED闪烁的速度也就慢了一倍。注意:不要把STM32系统时钟设置超过72M使用,否则容易崩溃。
, L" L8 p; o: a8 X4 l; ~
收藏 评论0 发布时间:2022-7-1 13:00

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版