代码实现:
在主函数里直接调用一下函数就能直接配置
直接对寄存器配置:
void SetSysClockTo64_HSI(void)
{
uint32_t tmpreg = 0;
//1、重置RCC外设为默认值
RCC_DeInit();
//2、启用内部高速时钟(HSI)
RCC->CR |= 1; // 启用内部高速时钟(HSI)
while((RCC->CR & (0x00000002))>>1 != 1); // 等待HSI稳定
//3、设置FLASH预取指令缓存和等待状态
FLASH->ACR |= FLASH_ACR_PRFTBE; /* Enable Prefetch Buffer */
FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2; /* Flash 2 wait state */
//4、配置系统时钟为HSI
RCC->CFGR &= 0xFFFFFFFC; // 清空SW位
RCC->CFGR |= 0; // 设SW位为0
//5、配置AHB、APB1、APB2分频系数
RCC->CFGR &= 0xFFFFFF0F; // AHB分频位清零
RCC->CFGR |= 0; // AHB不分频
RCC->CFGR &= 0xFFFFF4FF; // APB1分频位清零
RCC->CFGR |= 1<<10; // APB1选2分频
RCC->CFGR &= 0xFFFFC7FF; // APB2分频位清零
RCC->CFGR |= 0; // APB2不分频
//6、配置PLL,HSI=8MHZ 8/2*16=64MHZ
//如果需要在应用中使用USB接口,PLL必须被设置为输出48或72MHZ时钟,用于提供48MHz的USBCLK时钟。
RCC->CFGR &= 0xFFFCFFFF; // PLL时钟源位清零
RCC->CFGR |= 0; // HSI作为时钟源
RCC->CFGR &= 0xFFC3FFFF; // PLL分频位清零
RCC->CFGR |= 14<<18; // PLL选16倍频
//7、启用PLL
RCC->CR |= 1<<24; // 启用PLL
while ((RCC->CR & (0x02000000))>>25 != 1); // 等待PLL稳定
//8、选择PLL作为系统时钟源
RCC->CFGR &= 0xFFFFFFFC;
RCC->CFGR |= 2;
while((uint8_t)(RCC->CFGR & 0x0000000C) != 0x08);// 等待系统时钟切换完成
//9、在内部FLASH矢量表重定位
#define VECT_TAB_OFFSET 0x0
#ifdef VECT_TAB_SRAM
SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */
#else
SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */
#endif
//10、如果使用要使用滴答定时器,则需要调用一下函数配置更新系统时钟频率SystemCoreClock
SystemCoreClockUpdate(); // 也可以直接赋值代替此函数SystemCoreClock=64000000;
}
使用库函数配置:
void SetSysClockTo64_HSI(void)
{
//1、重置RCC外设为默认值
RCC_DeInit();
//2、启用内部高速时钟(HSI)
RCC_HSICmd(ENABLE);
while (RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET); // 等待HSI稳定
//3、设置FLASH预取指令缓存和等待状态
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
FLASH_SetLatency(FLASH_Latency_2);
//4、配置系统时钟为HSI
RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);
//5、配置HCLK、PCLK1和PCLK2为SYSCLK分频系数为1
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div2);//APB1最大36mhz
RCC_PCLK2Config(RCC_HCLK_Div1);
//6、配置PLL,HSI=8MHZ 8/2*16=64MHZ
RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_16);
//7、启用PLL
RCC_PLLCmd(ENABLE);
while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); // 等待PLL稳定
//8、选择PLL作为系统时钟源
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
while (RCC_GetSYSCLKSource() != 0x08); // 等待系统时钟切换完成
//9、在内部FLASH矢量表重定位
#define VECT_TAB_OFFSET 0x0
#ifdef VECT_TAB_SRAM
SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */
#else
SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */
#endif
//10、如果使用要使用滴答定时器,则需要调用一下函数配置更新系统时钟频率SystemCoreClock
SystemCoreClockUpdate(); // 也可以直接赋值代替此函数SystemCoreClock=64000000;
}
目录
2.1 查看《F1中文参考手册》6.2章节,关于HSI和PLL的说明如下:
1、分析时钟树
通过HIS输出64MHz系统时钟
图 1 HIS源配