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

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

[复制链接]
STMCU小助手 发布时间:2022-7-1 13:00
    在时钟树的讲解中我们知道,通过修改PLLMUL中的倍系数值(2-16)可以改变系统的时钟频率。在库函数中也有对时钟倍频因子配置的函数,如下:
. v! o( ]& k3 @& `. |

void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t RCC_PLLMul);2 N5 n0 X0 K4 }. J

    第一个参数是PLL时钟源选择,例程中一般采用的都是HSE作为PLL的时钟源,可以设置为RCC_PLLSource_HSE_Div1/RCC_PLLSource_HSE_Div2。第二个参数就是倍频因子值可以是RCC_PLLMul_2~RCC_PLLMul_16。方便修改系统时钟,这里自定义一个系统时钟初始化函数,将函数放在对应实验程序的main.c中。自定义系统时钟,可以通过修改PLL时钟源和倍频系数实现时钟调整具体代码如下:# u9 Q5 m/ ?+ f% S5 ~  @

void RCC_HSE_Config(u32 div,u32 pllm) //自定义系统时间(可以修改时钟)
8 Q) V) c4 F  r6 M0 j& m; c+ B# \3 z{
& U. v; \* p% \# M    RCC_DeInit(); //将外设RCC寄存器重设为缺省值
( l0 I7 d1 Y% S. O8 j1 O    RCC_HSEConfig(RCC_HSE_ON);//设置外部高速晶振(HSE)  ]7 V7 @0 |1 c  |, T- q: X
    if(RCC_WaitForHSEStartUp()==SUCCESS) //等待 HSE 起振
+ X- C2 A4 s" W8 y+ `    {1 ], _. f' Q& ^! G2 I$ `
        RCC_HCLKConfig(RCC_SYSCLK_Div1);//设置AHB时钟(HCLK)" A# \0 m. t; [* O% L6 C
        RCC_PCLK1Config(RCC_HCLK_Div2);//设置低速AHB时钟(PCLK1)* p% J- ~2 M2 M# t! F$ }& i/ b( p( m
        RCC_PCLK2Config(RCC_HCLK_Div1);//设置高速AHB时钟(PCLK2); A" Y& i0 c/ y3 }0 r# s
        RCC_PLLConfig(div,pllm);//设置PLL时钟源及倍频系数- q( t# H) D& j
        RCC_PLLCmd(ENABLE); //使能或者失能PLL6 J, k6 d1 }3 r: n
        //检查指定的RCC标志位设置与否,PLL就绪% S1 Y5 a! k6 |! D
        while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);
        //设置系统时钟(SYSCLK)
/ w$ I3 Q" c! P& X  w$ t        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);8 _- S* e. r, c7 y* v3 W
        //返回用作系统时钟的时钟源,0x08:PLL作为系统时钟
        while(RCC_GetSYSCLKSource()!=0x08);0 J  \8 d' b$ Y& u8 A
    }
}

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

RCC_HSE_Config(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);9 i3 o1 U* o; h& O9 e5 R

    如果想让系统时钟为36M,只需要将参数值修改即可:
  ]/ A7 E8 X" ~

RCC_HSE_Config(RCC_PLLSource_HSE_Div2,RCC_PLLMul_9);
/ f3 M+ f, [' e7 V

    此时修改的是div这个参数值,此参数用来对HSE时钟分频系数设置,从时钟树可知,HSE可以直接流入到PLLSRC,还可以经过2分频后给PLLSRC。它的取值为RCC_PLLSource_HSE_Div1或RCC_PLLSource_HSE_Div2。( _0 S0 S0 V5 h0 x4 T. y
    最后我们可以通过一个LED指示灯闪烁速度来反映系统时钟修改后的效果。主函数代码如下:   P* s8 x3 {, Z8 Z/ z

int main()9 o5 I& V; N* O5 t  N! H0 W' k5 F9 b
{, d5 K5 _8 v$ n- `# d* M
    RCC_HSE_Config(RCC_PLLSource_HSE_Div2,RCC_PLLMul_9); //36M. w  c6 W1 L  e% g  R8 u
    LED_Init();) u0 I+ g5 v& b. _' o
    while(1)( B* N) J+ }7 ^* v  u0 G& S
    {
# k5 L; }+ @7 H- ]2 K1 B$ A        GPIO_ResetBits(LED_PORT,GPIO_Pin_0);//点亮D1
0 }& D& ~' l. ^5 K3 }: |! _        delay(6000000);7 n# j  D2 h# |4 P) x5 N9 a3 b4 X
        GPIO_SetBits(LED_PORT,GPIO_Pin_0);( P8 @( Y9 |; v8 P* U& `% l5 @" u' |: U
        delay(6000000);& k! \/ }+ c( |7 |  i1 r6 E8 ^1 u
    }
}

    如果将div原先的1值修改为2,此时系统时钟即为36M,相当于速度慢了一倍。LED闪烁的速度也就慢了一倍。注意:不要把STM32系统时钟设置超过72M使用,否则容易崩溃。

' W5 y( f' v; @9 g
收藏 评论0 发布时间:2022-7-1 13:00

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版