一、修改晶振频率(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作为系统时钟 */
}
原文:https://www.cnblogs.com/dogsuned/p/10528367.html