使用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 M
		RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_2);
		// 开启 PLL
		RCC_PLLCmd(ENABLE);

		// 等待 PLL 稳定
		while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
		// 当 PLL 稳定之后,把 PLL 时钟切换为系统时钟 SYSCLK
		RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
		
		/*设置预分频器*/
	// AHB 预分频因子设置为 1 分频, HCLK = SYSCLK
		RCC_HCLKConfig(RCC_SYSCLK_Div1);
		// APB2 预分频因子设置为 1 分频, PCLK2 = HCLK
		RCC_PCLK2Config(RCC_HCLK_Div1);
		// APB1 预分频因子设置为 2分频, PCLK1 = HCLK/2
		RCC_PCLK1Config(RCC_HCLK_Div2);
		
		// 读取时钟切换状态位,确保 PLLCLK 被选为系统时钟
		while (RCC_GetSYSCLKSource() != 0x08);
	}

在MOC引脚输出时钟

初始化MCO引脚PA8
  • 在F1系列中MCO引脚只有一个,即PA8
	MOC_GPIO_init();
	RCC_MCOConfig(RCC_MCO_SYSCLK);//选择MOC输出的时钟源
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值