我们从2011年坚守至今,只想做存粹的技术论坛。  由于网站在外面,点击附件后要很长世间才弹出下载,请耐心等待,勿重复点击不要用Edge和IE浏览器下载,否则提示不安全下载不了

 找回密码
 立即注册
搜索
查看: 1111|回复: 4

[技术文章] 用STM32F4的库函数RCC_PLLConfig()代替SystemInit()手动初始化

[复制链接]

该用户从未签到

22

主题

23

回帖

0

积分

二级逆天

积分
0

终身成就奖

QQ
发表于 2020-8-26 09:14:14 | 显示全部楼层 |阅读模式
STM32上电复位后首先执行Reset_Handler,然后调用SystemInit()函数完成时钟等基本初始化,再执行main函数。

; Reset handler
Reset_Handler    PROC
                 EXPORT  Reset_Handler             [WEAK]
        IMPORT  SystemInit
        IMPORT  __main

                 LDR     R0, =SystemInit
                 BLX     R0
                 LDR     R0, =__main
                 BX      R0

                 ENDP
SystemInit()函数在文件system_stm32f4xx.c中。由于该函数中宏定义较多,所以可读性不高,该函数并不能一目了然的看懂STM32F4的各个时钟都配置成了什么样子,笔者归纳总结了库函数和网上的一些资料,自己写了个手动配置RCC时钟的函数如下:
********************************************************************************
* .@1 - 复位 RCC 时钟配置为系统上电复位后的状态
*       系统上电复位后的时钟状态定义如下 - HSI ON and used as system clock source
*                                        - HSE, PLL and PLLI2S OFF
*                                        - AHB, APB1 and APB2 prescaler set to 1
*                                        - CSS, MCO1 and MCO2 OFF
*                                        - All interrupts disabled
*       该函数不改变如下配置:- Peripheral clocks  
*                             - LSI, LSE and RTC clocks  

********************************************************************************  
* .RCC_PLLConfig(RCC_PLLSource, PLLM, PLLN, PLLP, PLLQ)
*
*      RCC_PLLSource - PLL输入时钟源:RCC_PLLSource_HSI/RCC_PLLSource_HSE 之一
*                      .........................................................
*      PLLM          - 分频因数,用来生成PLL VCO输入时钟,该时钟范围:1~2M
*                      RCC_PLLSource/PLLM = PLL VCO输入时钟
*                      该分频因数的范围:2~63
*                      .........................................................
*      PLLN          - 倍频因数,PLL VCO输入时钟*PLLN = PLL VCO输出时钟
*                      PLL VCO输出时钟范围:192~432M
*                      .........................................................
*      PLLP          - 分频因数,用于生成SYSCLK
*                      PLL VCO输出时钟/PLLP = SYSCLK
*                      该分频因数的范围:2,4,6 OR 8
*                      .........................................................
*      PLLQ          - USB OTG FS, SDIO and RNG(随机数发生器)时钟的分频因数
*                      USB OTG FS需要48M的时钟以正常工作
*                      SDIO and RNG(随机数发生器)时钟 <= 48M
*                      该分频因数的范围:2~15
*      .........................................................................
*      PLL_VCO                        =  (RCC_PLLSource/PLLM)*PLLN
*      SYSCLK                         = ((RCC_PLLSource/PLLM)*PLLN) / PLLP
*      USB OTG FS, SDIO and RNG Clock = ((RCC_PLLSource/PLLM)*PLLN) / PLLQ
*      .........................................................................
*                                                                                             2018-01-27
********************************************************************************
*/
void RCC_MyConfig(void)
{
    RCC_DeInit();                                                              //@1
    RCC_HSEConfig(RCC_HSE_ON);                                   //打开外部时钟
   
    if(RCC_WaitForHseStartUp() == SUCCESS)                  //等待外部时钟成功启动
    {
        //RCC_PLLCmd(DISABLE);    //配置PLL前应先关闭主PLL
        
        RCC_SYSCLKConfig(RCC_SYSCLKSOURCE_PLLCLK);      //选择PLL时钟为系统时钟
        
        RCC_HCLKConfig(RCC_SYSCLK_Div1);                          //HCLK(AHB)时钟为系统时钟1分频
        
        RCC_PCLK1Config(RCC_HCLK_Div4);                            //PCLK(APB1)时钟为HCLK时钟8分频
        RCC_PCLK2Config(RCC_HCLK_Div2);                            //PCLK(APB2)时钟为HCLK时钟2分频
        
        RCC_PLLConfig(RCC_PLLSource_HSE, 25, 336, 2, 7);     //PLL时钟配置,外部晶振为25MHz,系统配置为168MHz
        
        RCC_PLLCmd(ENABLE);                                               //开启PLL时钟,并等待PLL时钟准备好
        while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
        
        while(RCC_GetSYSCLKSource() != 0x08);                      //Wait till PLL is used as system clock source
    }
}



看过上面的文章,读者可能有不懂的一个地方就是PLL VCO,那么,PLL,是倍频电路,我们把PLL倍频电路看作一个黑匣子,它是有输入和输出的,RCC_PLLSource经过PLLM分频后,就得到了这个黑匣子的输入时钟,这个输入时钟经过PLLN倍频后,就得到了黑匣子的输出时钟,OK,这个时钟就叫做PLL VCO

关键字:STM32F4  库函数RCC_PLLConfig()  SystemInit()  手动初始化
回复

使用道具 举报

  • TA的每日心情
    开心
    昨天 08:28
  • 签到天数: 109 天

    [LV.6]常住居民II

    5

    主题

    6753

    回帖

    1万

    积分

    三级逆天

    积分
    14192

    终身成就奖特殊贡献奖原创先锋奖

    发表于 2020-8-28 08:32:53 | 显示全部楼层
    回复

    使用道具 举报

  • TA的每日心情
    开心
    昨天 08:23
  • 签到天数: 126 天

    [LV.7]常住居民III

    2

    主题

    8636

    回帖

    9972

    积分

    二级逆天

    积分
    9972

    社区居民终身成就奖特殊贡献奖原创先锋奖

    QQ
    发表于 2020-8-28 08:55:18 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    1

    主题

    6218

    回帖

    8730

    积分

    二级逆天

    积分
    8730

    终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

    QQ
    发表于 2020-8-31 07:28:36 | 显示全部楼层
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    昨天 19:13
  • 签到天数: 124 天

    [LV.7]常住居民III

    809

    主题

    5250

    回帖

    9012

    积分

    二级逆天

    积分
    9012

    终身成就奖特殊贡献奖原创先锋奖金点子奖优秀斑竹奖

    发表于 2021-1-31 08:54:09 | 显示全部楼层
    回复

    使用道具 举报

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

    本版积分规则

    论坛开启做任务可以
    额外奖励金币快速赚
    积分升级了


    Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

    本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请发帖投诉

    平平安安
    TOP
    快速回复 返回顶部 返回列表