stm32专题五:时钟树(三)自定义配置HSE时钟 超频

        在前一节分析了stm32系统默认时钟配置的过程,现在想自己实现一个自定义修改时钟配置的函数。其实原理很简单,因为系统在上电复位时就会按照默认完成时钟配置。因此,要先复位时钟,然后按照流程来配置就ok,我们通过修改PLL锁相环的倍频因子,就可以实现超频。用到的所有函数,都可以在rcc.h和flash.h中找到。

bsp_rccclkconfig.c

/* RCC时钟配置函数 */

#include "bsp_rccclkconfig.h"

// 自定义时钟配置函数
void HSE_SetSysClk(uint32_t RCC_PLLMul_x)
{
    ErrorStatus HSEStatus;
	
	// 把RCC时钟复位成复位值
	RCC_DeInit();

    /* 
    @arg RCC_HSE_OFF: HSE oscillator OFF
    @arg RCC_HSE_ON: HSE oscillator ON
    @arg RCC_HSE_Bypass: HSE oscillator bypassed with external clock
    */
    // 传入参数有3个可选项,其中RCC_HSE_Bypass是使用外部有源晶振时,
    // 由外电路提供时钟,此时外部时钟只接OSC_IN,而OSC_OUT引脚悬空
    // 使用外部无源晶振时,晶体 + 起振电容配合内部电路来产生时钟信号
    RCC_HSEConfig(RCC_HSE_ON);

    // 等待获取HSE启动状态
    HSEStatus = RCC_WaitForHSEStartUp();

    // HSE启动成功
    if (HSEStatus == SUCCESS)
    {
        // 使能预取指,这个函数直接去stm32f10x_flash.h中找到
        FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

        // 设置延时,latency表示“延迟”,同样在stm32f10x_flash.h中找到
        FLASH_SetLatency(FLASH_Latency_2);

        // 配置三条总线的分频因子
        RCC_HCLKConfig(RCC_SYSCLK_Div1);
        RCC_PCLK1Config(RCC_HCLK_Div2);
        RCC_PCLK2Config(RCC_HCLK_Div1);

        // 配置PLL锁相环的输入源和倍频因子,使能PLL
        RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_x);
        RCC_PLLCmd(ENABLE);

        // 等待PLL准备就绪
        while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
            ;

        // 选择PLLCLK作为系统时钟
        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

        // 等待系统时钟切换成功并稳定
        while (RCC_GetSYSCLKSource() != 0x08)
            ;
    }
    // HSE启动失败
    else
    {
        // 添加错误处理代码
    }
    
}

// MCO引脚配置函数,用于检测时钟,包括HSE PLLCLK LSE等
void MCO_GPIO_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
	
	GPIO_Init(GPIOA, &GPIO_InitStruct);
}

        这里我们还配置了MCO引脚(PA8复用得到),根据要求配置为复用推挽输出,通过MCO可以监测系统时钟(HSE、LSE、SYSCLK)等,用于测量我们配置的超频时钟。

bsp_rccclkconfig.h

#ifndef __BSP_RCCCLKCONFIG_H
#define __BSP_RCCCLKCONFIG_H

#include "stm32f10x.h"

void HSE_SetSysClk(uint32_t RCC_PLLMul_x);
void MCO_GPIO_Config(void);

#endif /* __BSP_RCCCLKCONFIG_H */

       然后在主函数中调用,进行测试,观察led的闪烁速度,并利用示波器实际测量PA8引脚输出的时钟频率。

main.c

#include "stm32f10x.h"
#include "bsp_led.h"
#include "bsp_rccclkconfig.h"

void delay(uint32_t count);

int main(void)
{
	// 来到这里时,系统时钟已经被配置成72MHz
	
	// 必须要先复位时钟,因为系统上电就会执行systeminit函数配置时钟
	// 此函数已经放在HSE_SetSysClk函数内
	// RCC_DeInit();
	
	// 16倍频,此时超频到128MHz
	HSE_SetSysClk(RCC_PLLMul_16);
	
	// 初始化MCO的GPIO
	MCO_GPIO_Config();
	
	// 选择系统时钟输出(检测sysclk)
	RCC_MCOConfig(RCC_MCO_SYSCLK);
	
	LED_GPIO_Config();

	while (1)
	{
		LED_YELLOW;
		delay(0XFFFFF);
		LED_ALL_OFF;
		delay(0XFFFFF);
	}
}

void delay(uint32_t count)
{
	for (; count != 0; count--);
}

 

 

 

 

 

 

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值