历史上的今天
今天是:2024年10月19日(星期六)
2021年10月19日 | stm32专题五:时钟树(三)自定义配置HSE时钟 超频
2021-10-19 来源:eefocus
在前一节分析了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--);
}
史海拾趣
|
日前,全球著名的商店零售自动化解决方案供应商———NCR公司以鲜明的技术理念和完备的产品阵容在第七届中国连锁店展览会上展示了崭新的形象。其中NCR享誉全球的FastLaneTM自助结账系统、“RFID结账通道”及“ ...… 查看全部问答> |
|
基于单片机的数控直流电源 1.基本要求 (1)输出电压:范围0~+12V,步进0.1V,纹波不大于10mV; (2)输出电流:500mA; (3)输出电压值由数码管显示; (4)由“+”、“-”两键分别控制输出电压步进增减; 请 ...… 查看全部问答> |
|
哪位高手可以帮帮我!!??我刚上班接的第一个任务就是这个:用c8051f410单片机制作可控电源。由于没经验,不知从何下手。 大家帮我想想办法,简单的说下思路,只字片语也成啊,谢谢大家拉! 具体要求如下: 1定时开关机,并通知主板 2红外控 ...… 查看全部问答> |
|
用DNW通过USB下载NK。BIN,有些可以成功下载下去,有些NK。BIN不管下载多少次都下不下去,进度条老是停在中间就没动静了,怎么一回事啊? 用DNW通过USB下载NK。BIN,有些可以成功下载下去,有些NK。BIN不管下载多少次都下不下去,进度条老是停在中间就没动静了,怎么一回事啊? 这些NK没什么区别,也就大小差个0。1MB的样子,好奇怪。你说不能下就都不能下,为什么有的可以有的又不行 ...… 查看全部问答> |
|
三相交流伺服 电动机 应用广泛,但通过长期运行后,会发生各种故障,及时判断故障原因,进行相应处理 ,是防止故障扩大,保证设备正常运行的一项重要的工作。 一、通电后电动机不能转动,但无异响,也无异味和冒烟。 1.故障原因①电源未通(至少两 ...… 查看全部问答> |






