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

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

[复制链接]
STMCU小助手 发布时间:2022-7-1 13:00
    在时钟树的讲解中我们知道,通过修改PLLMUL中的倍系数值(2-16)可以改变系统的时钟频率。在库函数中也有对时钟倍频因子配置的函数,如下:
8 b% l$ N& z5 y: J$ k+ r6 K

void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t RCC_PLLMul);
! M" g: e4 ^+ V

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

void RCC_HSE_Config(u32 div,u32 pllm) //自定义系统时间(可以修改时钟)
  H7 l, R% D7 _! f$ H( Y$ S{
% G6 @( [9 C# F' T* I* v; p  e    RCC_DeInit(); //将外设RCC寄存器重设为缺省值+ o9 w5 s0 a- n+ s. \: ^7 m$ n- P
    RCC_HSEConfig(RCC_HSE_ON);//设置外部高速晶振(HSE)+ K- ?+ d% j2 y& A. c
    if(RCC_WaitForHSEStartUp()==SUCCESS) //等待 HSE 起振! Y& [. Y' Q5 v
    {2 U; Z6 O0 k& @% a, ^5 Z/ W
        RCC_HCLKConfig(RCC_SYSCLK_Div1);//设置AHB时钟(HCLK)
6 z6 I$ @7 M+ z" b1 N/ D6 p        RCC_PCLK1Config(RCC_HCLK_Div2);//设置低速AHB时钟(PCLK1)5 m" }% B: U) r& @8 k: d9 I
        RCC_PCLK2Config(RCC_HCLK_Div1);//设置高速AHB时钟(PCLK2)
0 |. C5 c2 C; F        RCC_PLLConfig(div,pllm);//设置PLL时钟源及倍频系数
; @3 j, ^! G6 g5 R. u        RCC_PLLCmd(ENABLE); //使能或者失能PLL3 [' b) U+ |0 _4 v
        //检查指定的RCC标志位设置与否,PLL就绪
: |& ?: A8 {7 e, D: m3 M) u7 \+ B; R& b& k6 X        while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);
        //设置系统时钟(SYSCLK)" }0 ^, |2 ?3 n9 w
        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
- a5 y# o! o' j$ t, _        //返回用作系统时钟的时钟源,0x08:PLL作为系统时钟
        while(RCC_GetSYSCLKSource()!=0x08);5 b+ m  O7 y& q4 f
    }
}

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

RCC_HSE_Config(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);
  c, f+ T; W4 D( U& A2 x: L

    如果想让系统时钟为36M,只需要将参数值修改即可:$ w. d' U: i' K0 @) F$ T1 O, q

RCC_HSE_Config(RCC_PLLSource_HSE_Div2,RCC_PLLMul_9);  \& k4 s, L: n; p! l+ @+ Y# a# S

    此时修改的是div这个参数值,此参数用来对HSE时钟分频系数设置,从时钟树可知,HSE可以直接流入到PLLSRC,还可以经过2分频后给PLLSRC。它的取值为RCC_PLLSource_HSE_Div1或RCC_PLLSource_HSE_Div2。
- a* P% x: J) k# t6 U4 m    最后我们可以通过一个LED指示灯闪烁速度来反映系统时钟修改后的效果。主函数代码如下:
. ~# c( O5 m7 C9 D3 M6 W

int main(): C3 l; S+ S* K* [% j
{
  B. n0 z: [- u) Y1 J& Y    RCC_HSE_Config(RCC_PLLSource_HSE_Div2,RCC_PLLMul_9); //36M/ r6 I6 I; w3 e, ]( m
    LED_Init();
* e* e5 v7 g! K    while(1)
+ p+ t3 Z5 U5 L) e( ]    {
+ {5 L* p* m2 q0 {) y        GPIO_ResetBits(LED_PORT,GPIO_Pin_0);//点亮D1
( B* z) t7 R* u: m. f. I        delay(6000000);* s0 c( g* O/ T
        GPIO_SetBits(LED_PORT,GPIO_Pin_0);
; V% H9 V" j& R% r- j4 P
        delay(6000000);* _# M0 C/ ]1 W* {+ b4 M
    }
}

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

& D: d( c/ _0 }# N  M2 M
赞 收藏 评论0 发布时间:2022-7-1 13:00

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版