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 */