时钟"/>
使用HSE配置系统时钟
配置时钟顺序需要按照时钟树的顺序来配置。
我们使用STM32时基本都是使用 HSE(外部高速时钟),然后 HSE 经过 PLL 倍频之后作为系统时钟。通常的配置是:HSE=8M,PLL 的倍频因子为:9,PLL时钟就设置成:72M,选择PLLCLK为系统统时钟源;则SYSCLK = PLLCLK8M * 9 = 72M。
编写代码步骤
1. 复位时钟
固件库:RCC_DeInit();
在系统启动时已经将时钟配置好了是开启(enable)的状态,有些时钟寄存器在enable的情况下是不能配置的,所以第一步要复位时钟。
2.使能HSE外部高速时钟并等待其准备就绪
RCC_HSEConfig(RCC_HSE_ON);//使能HSE
操作时钟控制寄存器(RCC_CR)将其第16位置1就开启了HSE时钟。
RCC_WaitForHSEStartUp();等待其准备就绪,成功返回SUCCESS。
3.选择PLL寄存器的信号源和倍频数
设置 HSE为PLL 时钟来源 ,设置 PLL 倍频因子
// PLLCLK = 8MHz * RCC_PLLMul_2 = 16 M
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_2);
4.使能PLL
// 开启 PLL并判断是否ready准备就绪。
RCC_PLLCmd(ENABLE);
RCC_GetFlagStatus(RCC_FLAG_PLLRDY);//Checks whether the specified RCC flag is set or not。
5.把 PLL 时钟切换为系统时钟 (SYSCLK)
//选择系统时钟源
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//specifies the clock source used as system clock
6配置预设分屏器APB/APB1/APB2
AHB 预分频因子设置为 1 分频, HCLK = SYSCLK
RCC_HCLKConfig(RCC_SYSCLK_Div1);
// APB2 预分频因子设置为 1 分频, PCLK2 = HCLK
RCC_PCLK2Config(RCC_HCLK_Div1);
// APB1 预分频因子设置为 2分频, PCLK1 = HCLK/2因为APB1最大允许36M的时钟。
RCC_PCLK1Config(RCC_HCLK_Div2);
7.检查
// 读取时钟切换状态位,确保 PLLCLK 被选为系统时钟
while (RCC_GetSYSCLKSource() != 0x08);
void HSE_SETSYS_CLK()
{ErrorStatus HSEStatus;RCC_DeInit();//使能HSE,开启外部晶振RCC_HSEConfig(RCC_HSE_ON);//等待HSE起振HSEStatus = RCC_WaitForHSEStartUp();if(HSEStatus == SUCCESS){// 设置 PLL 时钟来源为 HSE,设置 PLL 倍频因子// PLLCLK = 8MHz * RCC_PLLMul_2 = 16 MRCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_2);// 开启 PLLRCC_PLLCmd(ENABLE);// 等待 PLL 稳定while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);// 当 PLL 稳定之后,把 PLL 时钟切换为系统时钟 SYSCLKRCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);/*设置预分频器*/// AHB 预分频因子设置为 1 分频, HCLK = SYSCLKRCC_HCLKConfig(RCC_SYSCLK_Div1);// APB2 预分频因子设置为 1 分频, PCLK2 = HCLKRCC_PCLK2Config(RCC_HCLK_Div1);// APB1 预分频因子设置为 2分频, PCLK1 = HCLK/2RCC_PCLK1Config(RCC_HCLK_Div2);// 读取时钟切换状态位,确保 PLLCLK 被选为系统时钟while (RCC_GetSYSCLKSource() != 0x08);}
在MOC引脚输出时钟
初始化MCO引脚PA8
- 在F1系列中MCO引脚只有一个,即PA8
MOC_GPIO_init();RCC_MCOConfig(RCC_MCO_SYSCLK);//选择MOC输出的时钟源
更多推荐
使用HSE配置系统时钟
发布评论