一, 修改晶振频率(STM32F1/4xx.h)
- #define HSE_VALUE ((uint32_t)25000000) /*!<Value of the External oscillator in Hz */
- #define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/
二, 使用外部晶振作为系统时钟源
- 1.STM32F4xx (system_stm32f4xx.c)
- RCC->PLLCFGR = PLL_M | (PLL_N<<6) | (((PLL_P>> 1) -1) <<16) | (RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24);
- 2.STM32F1xx(system_stm32f1xx.c)
- RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL6);
修改这几个分 / 倍频系数.
三, 配置内部时钟
- 1.STM32F4xx(system_stm32f4xx.c)
- SetSysClock();--> RCC_Configuration(16,336,2,7); (SYSCLK = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N/ PLL_P)
- void RCC_Configuration(uint32_t m, uint32_t n, uint32_t p, uint32_t q)
- {
- __IO uint32_t HSIStartUpStatus = 0;
- RCC_DeInit();
- RCC_HSICmd(ENABLE);
- HSIStartUpStatus = RCC->CR & RCC_CR_HSIRDY;
- if (HSIStartUpStatus == RCC_CR_HSIRDY) {
- RCC->APB1ENR |= RCC_APB1ENR_PWREN;
- PWR->CR |= PWR_CR_VOS;
- RCC_HCLKConfig(RCC_SYSCLK_Div1);
- RCC_PCLK2Config(RCC_HCLK_Div2);
- RCC_PCLK1Config(RCC_HCLK_Div4);
- RCC_PLLConfig(RCC_PLLSource_HSI, m, n, p, q);
- RCC_PLLCmd(ENABLE);
- while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) {
- }
- FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_5WS;
- RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
- while (RCC_GetSYSCLKSource() != 0x08){
- }
- }
- else{
- while(1) {
- }
- }
- }
- 2.STM32F1xx
- //use HSI as system clock MAX freq = 64M HZ
- void RCC_Configuration()
- {
- RCC_DeInit(); /* 将外设 RCC 寄存器重设为缺省值 */
- RCC_HSICmd(ENABLE);
- while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY)== RESET);// 等待 HSI 就绪
- RCC_HCLKConfig(RCC_SYSCLK_Div1); /* 设置 AHB 时钟(HCLK) RCC_SYSCLK_Div1--AHB 时钟 = 系统时 */
- RCC_PCLK2Config(RCC_HCLK_Div1); /* 设置高速 AHB 时钟(PCLK2)RCC_HCLK_Div1--APB2 时钟 = HCLK*/
- RCC_PCLK1Config(RCC_HCLK_Div2); /* 设置低速 AHB 时钟(PCLK1)RCC_HCLK_Div2--APB1 时钟 = HCLK / 2*/
- FLASH_SetLatency(FLASH_Latency_2); /* 设置 FLASH 存储器延时时钟周期数 FLASH_Latency_2 2 延时周期 */
- FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); /* 选择 FLASH 预取指缓存的模, 预取指缓存使能 */
- RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_16);/* 设置 PLL 时钟源及倍频系数, 频率为 8/2*16=64Mhz*/
- RCC_PLLCmd(ENABLE); /* 使能 PLL */
- while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) ; /* 检查指定的 RCC 标志位 (PLL 准备好标志) 设置与否 */
- RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /* 设置系统时钟(SYSCLK) */
- while(RCC_GetSYSCLKSource() != 0x08); /*0x08:PLL 作为系统时钟 */
- }
来源: http://www.bubuko.com/infodetail-2986734.html