前面几篇我讲了如何使用标准固件库来让STM32实现一些功能;但是想要实现各种功能前都必须要对单片机时钟源进行设置,时钟树:如果大家对这块不懂的话推荐大家看看【STM32】超清晰STM32时钟树动画讲解
固件库函数
代码编写
ErrorStatus HSEStartUpStatus;
RCC_DeInit(); // RCC寄存器恢复到初始状态,这通常用于调试目的以确保从一个已知状态开始
RCC_HSEConfig(RCC_HSE_ON); // 使能外部高速晶振(High-Speed External,HSE)
// 等待外部高速晶振(HSE)稳定并准备好, 如果超时则返回ErrorStatus::ERROR
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS){ // 如果HSE启动成功执行以下配置
// 设置PLL(相位锁定环)的时钟源为HSE,并设置倍频系数为9
// 当HSE为8MHz时,经过PLL后,系统时钟(SYSCLK)为72MHz
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
// 设置AHB时钟(HCLK),此处配置为与SYSCLK一致,即72MHz
RCC_HCLKConfig(RCC_SYSCLK_Div1);
// 设置APB1时钟(PCLK1),此处配置为HCLK的一半,即36MHz
// APB1通常用于驱动低速外设
RCC_PCLK1Config(RCC_HCLK_Div2);
// 设置APB2时钟(PCLK2),此处配置为与HCLK一致,即72MHz
// APB2通常用于驱动高速外设
RCC_PCLK2Config(RCC_HCLK_Div1);
// 根据系统时钟设置FLASH存储器的延迟周期,以确保FLASH操作的稳定性
// 系统频率在48MHz到72MHz之间时,推荐设置2个等待周期
FLASH_SetLatency(FLASH_Latency_2);
// 启用FLASH预取指缓冲,以优化代码执行速度
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
// 使能PLL,此配置用于增加系统时钟频率
RCC_PLLCmd(ENABLE);
// 等待PLL输出稳定
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
// 将PLL输出设置为系统时钟源(SYSCLK)
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
// 等待PLL输出确实作为系统时钟源使用
while(RCC_GetSYSCLKSource() != 0x08);
}
// 可以在此处根据需要使能其他外设的时钟
// 例如,如果需要使用USART1,GPIOA,和SPI1,可以取消以下注释来使能相关时钟
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |
// RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE, ENABLE); //APB2外设时钟使能
// RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); //APB1外设时钟使能
// RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
这代码最后注释的RCC使能,我们在之前各个功能设置的时候单独使能了