• stm32的RCC系统时钟配置 以及RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t PLLM, uint32_t PLLN, uint32_t PLLP, uint32_t PLLQ)的配置


    一直以来,我使用的系统时钟都是默认设置,没有经过修改,也一直能用,但是一直不清楚如何一步步配置,现在知道怎么改了,所以把修改的方法写下来供参考。

    很全很细的介绍请看这里 https://wenku.baidu.com/view/3c11ec1925c52cc58bd6bed8.html

    想复制一下,随便改改就能用请看下面。重点是注释

    首先贴我从野火f103抄来的,经过修改的代码

     1 void HSE_SetSysClockTo72(void)
     2 {
     3     __IO uint32_t StartUpCounter = 0, HSEStartUpStatus = 0;
     4 
     5     // 把RCC外设初始化成复位状态,这句是必须的
     6   RCC_DeInit();
     7 
     8   //使能HSE,开启外部晶振,野火开发板用的是8M
     9   RCC_HSEConfig(RCC_HSE_ON);
    10 
    11   // 等待 HSE 启动稳定
    12   HSEStartUpStatus = RCC_WaitForHSEStartUp();
    13     
    14     // 只有 HSE 稳定之后则继续往下执行
    15   if (HSEStartUpStatus == SUCCESS)
    16   {
    17 //----------------------------------------------------------------------//
    18     // 使能FLASH 预存取缓冲区
    19     FLASH_PrefetchBufferCmd(ENABLE);
    20 
    21     // SYSCLK周期与闪存访问时间的比例设置,这里统一设置成2
    22         // 设置成2的时候,SYSCLK低于48M也可以工作,如果设置成0或者1的时候,
    23         // 如果配置的SYSCLK超出了范围的话,则会进入硬件错误,程序就死了
    24         // 0:0 < SYSCLK <= 24M
    25         // 1:24< SYSCLK <= 48M
    26         // 2:48< SYSCLK <= 72M
    27     FLASH_SetLatency(FLASH_Latency_2);
    28 //----------------------------------------------------------------------//
    29  
    30     // AHB预分频因子设置为1分频,HCLK = SYSCLK 
    31     RCC_HCLKConfig(RCC_SYSCLK_Div1); 
    32   
    33     // APB2预分频因子设置为1分频,PCLK2 = HCLK
    34     RCC_PCLK2Config(RCC_HCLK_Div1); 
    35 
    36     // APB1预分频因子设置为1分频,PCLK1 = HCLK/2 
    37     RCC_PCLK1Config(RCC_HCLK_Div2);
    38         
    39 //-----------------设置各种频率主要就是在这里设置-------------------//
    40     // 设置PLL时钟来源为HSE,HSE=8MHz
    41 //        PLLM:PLL_VCO input clock =(HSE or HSI /PLLM)
    42 //    PLLN:PLL_VCO output clock =(PLL_VCP input clock)*PLLN
    43 //    PLLP:System Clock =PLL_VCO output clock/PLLP
    44 //    PLLQ:配置SD卡读写,USB等功能,暂时不用
    45         RCC_PLLConfig(RCC_PLLSource_HSE, 8,432,6,7);
    46 //------------------------------------------------------------------//
    47 
    48     // 开启PLL 
    49     RCC_PLLCmd(ENABLE);
    50 
    51     // 等待 PLL稳定
    52     while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    53     {
    54     }
    55 
    56     // 当PLL稳定之后,把PLL时钟切换为系统时钟SYSCLK
    57     RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
    58 
    59     // 读取时钟切换状态位,确保PLLCLK被选为系统时钟
    60     while (RCC_GetSYSCLKSource() != 0x08)
    61     {
    62     }
    63   }
    64   else
    65   { // 如果HSE开启失败,那么程序就会来到这里,用户可在这里添加出错的代码处理
    66         // 当HSE开启失败或者故障的时候,单片机会自动把HSI设置为系统时钟,
    67         // HSI是内部的高速时钟,8MHZ
    68     while (1)
    69     {
    70     }
    71   }
    72 }

    注释写的很清楚,多看看应该能看懂,

    我主要修改了第45行RCC_PLLConfig()这个函数,f407和f103是有很大区别的,函数内的参数很不一样,刚开始我一点都看不懂,最终在发现了一篇详细的介绍,才知道怎么配置成72MHz。我也已经写到注释里了。

    着重介绍下一种修改默认配置到达修改时钟频率的方法,在system_stm32f40x.c这个文件中,有这么一段,只要知道了PLLM,PLLN,PLLP,PLLQ的含义和用法,然后改改,就好了,

     1 #if defined (STM32F40_41xxx) || defined (STM32F427_437xx) || defined (STM32F429_439xx) || defined (STM32F401xx)
     2 /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */
     3 #define PLL_M      8
     4 #else /* STM32F411xE */
     5 #if defined (USE_HSE_BYPASS)
     6 #define PLL_M      8    
     7 #else /* STM32F411xE */   
     8 #define PLL_M      16
     9 #endif /* USE_HSE_BYPASS */
    10 #endif /* STM32F40_41xxx || STM32F427_437xx || STM32F429_439xx || STM32F401xx */  
    11 
    12 /* USB OTG FS, SDIO and RNG Clock =  PLL_VCO / PLLQ */
    13 #define PLL_Q      7
    14 
    15 #if defined (STM32F40_41xxx)
    16 #define PLL_N      432
    17 /* SYSCLK = PLL_VCO / PLL_P */
    18 #define PLL_P      6
    19 #endif /* STM32F40_41xxx */
    20 
    21 #if defined (STM32F427_437xx) || defined (STM32F429_439xx)
    22 #define PLL_N      432
    23 /* SYSCLK = PLL_VCO / PLL_P */
    24 #define PLL_P      6
    25 #endif /* STM32F427_437x || STM32F429_439xx */
    26 
    27 #if defined (STM32F401xx)
    28 #define PLL_N      432
    29 /* SYSCLK = PLL_VCO / PLL_P */
    30 #define PLL_P      6
    31 #endif /* STM32F401xx */
    32 
    33 #if defined (STM32F411xE)
    34 #define PLL_N      432
    35 /* SYSCLK = PLL_VCO / PLL_P */
    36 #define PLL_P      6   
    37 #endif /* STM32F411xx */
  • 相关阅读:
    js使用sessionStorage、cookie保存token
    在vue项目中的main.js中直接使用element-ui中的Message 消息提示、MessageBox 弹框、Notification 通知
    git报错:'fatal:remote origin already exists'怎么处理、附上git常用操作以及说明
    Module build failed: TypeError: loaderContext.getResolve is not a function
    Git相关命令
    用户反馈录
    静雅斋数学[目录]
    探索|尝试编制高质量的跟踪训练试卷
    直线参数方程何时必须化为标准形式
    快速高效的做三角函数图像
  • 原文地址:https://www.cnblogs.com/hexia7935/p/14595386.html
Copyright © 2020-2023  润新知