1、修改system_stm32f10x.c文件中的void SystemInit(void)函数。修改如下:
void SystemInit (void)
{
//设置单片机flash延时
/* Enable Prefetch Buffer */
FLASH->ACR |= FLASH_ACR_PRFTBE;
/* Flash 2 wait state */
FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;
while((uint32_t)(READ_BIT(FLASH->ACR, FLASH_ACR_LATENCY)) != FLASH_ACR_LATENCY_2){
}
//设置内部HSI校正值
// MODIFY_REG(RCC->CR, RCC_CR_HSITRIM, 16 << (3U));
RCC_AdjustHSICalibrationValue(16);
/* 开启HSI 即内部晶振时钟 */
RCC->CR |= (uint32_t)0x00000001;
/* 等待HSI稳定 */
while((READ_BIT(RCC->CR, RCC_CR_HSIRDY) == (RCC_CR_HSIRDY)) != 1){
}
/*选择HSI为PLL的时钟源HSI必须2分频给PLL*/
RCC->CFGR |= (uint32_t)RCC_CFGR_PLLSRC_HSI_Div2;
/*PLLCLK=8/2*14=56MHz 设置倍频得到时钟源PLL的频率*/
//理论上最高可以设置64MHz主频,之前看了一篇文章因为没有设置flash延时,频率设置高了单片机会挂,可以自行验证
RCC->CFGR |= (uint32_t)RCC_CFGR_PLLMULL14;
/* PLL不分频输出 */
RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
/* 使能 PLL时钟 */
RCC->CR |= RCC_CR_PLLON;
/* 等待PLL时钟就绪*/
while((RCC->CR & RCC_CR_PLLRDY) == 0)
{
}
/* 选择PLL为系统时钟的时钟源 */
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;
/* 等到PLL成为系统时钟的时钟源*/
while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08)
{
}
/* HCLK = SYSCLK */
RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
/* PCLK2 = HCLK */
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;
/* PCLK1 = HCLK/2 */
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;
}
在main函数里面更新一下时钟
int main(void)
{
RCC_ClocksTypeDef RCC_Clocks; //初始化时钟频率结构体
SystemCoreClockUpdate();//需要更新一下时钟,否则systick定时器延时可能不准
BSP_Init();//硬件资源初始化,如串口,IO等
RCC_GetClocksFreq(&RCC_Clocks); //获取各个时钟频率
while(1)
{
printf("SYSCLK_Frequency %d \r\n",RCC_Clocks.SYSCLK_Frequency);//串口输出主频
delay_ms(1000);//延迟1s
}
}