使用HSE配置系统时钟

本文将模仿固件库文件system_stm32f10x.c的SetSysClockTo72()函数,编写一个可以改变系统时钟大小的函数。

1.使能HSE

1.1.启动HSE

在固件库文件stm32f10x_rcc.h文件中可以找到.c文件定义的函数,其中就能找到使能HSE的函数RCC_HSEConfig(),然后查看这个函数的原型,注释中写道这个函数的功能是配置外部高速晶振,形参有RCC_HSE_ON、RCC_HSE_OFF、RCC_HSE_Bypass三个,Bypass就是不使用,这里选择ON打开外部高速时钟。

cpp 复制代码
    //使能HSE
	RCC_HSEConfig(RCC_HSE_ON);

1.2. 等待启动

因为晶振起振需要时间达到稳定,所以还需要一个等待函数RCC_WaitForHSEStartUp(),这个函数会返回一个变量,所以需要定义一个同类型的变量,ErrorStatus HSEStatus,ErrorStatus是固件库中已经定义的数据类型声明

cpp 复制代码
typedef enum {ERROR = 0, SUCCESS = !ERROR} ErrorStatus;

它有两个值,ERROR为0,SUCCESS为非零,通常为1。

然后通过一个if语句判断HSE是否启动成功,如果成功就就继续执行,如果启动失败,那用户可以在else中添加异常处理代码。

2.配置FLASH

2.1.使能预取指

在固件库stm32f10x_flash.c中找到配置flash预取指的函数FLASH_PrefetchBufferCmd(),通过固件库中对该函数的注释,形参选择Enable。

cpp 复制代码
//使能FLASH预取缓冲区
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

2.2. 设置FLASH的等待周期

同样在固件库中找到对应功能的函数FLASH_SetLatency(),形参有三个,分别是0等待、1个等待、2个等待,如果设置为72MHZ的话就要设置为两个等待

cpp 复制代码
FLASH_SetLatency(FLASH_Latency_2);     //等待两个周期

3.设置三个总线的分频因子

首先是设置ABH总线的分频因子,在stm32f10x_rcc.c中可以找到对应功能的函数RCC_HCLKConfig(),通过函数上面的注释选择一分频的形参

cpp 复制代码
RCC_HCLKConfig(RCC_SYSCLK_Div1);   //ABH一分频

然后再配置两个APB总线的分频因子,在stm32f10x_rcc.c中可以找到对应功能的函数RCC_PCLK1Config和RCC_PCLK2Config,通过函数上面的注释选择相应的形参,APB1是2分频,APB2是一分频

cpp 复制代码
RCC_PCLK1Config(RCC_HCLK_Div2);    //APB1二分频
RCC_PCLK2Config(RCC_HCLK_Div1);    //APB2一分频

4.配置锁相环

在stm32f10x_rcc.c中可以找到对应功能的函数RCC_PLLConfig()和RCC_PLLCmd(),RCC_PLLConfig()函数是指定锁相环的时钟来源是HSE还是HSI,并且设置倍频因子,函数RCC_PLLCmd()是将锁相环使能。这里函数RCC_PLLConfig()第一个形参选择HSE,第二个形参的倍频因子选择9,这样8乘9等于72,就将时钟倍频为72MHZ,这里可以将第二个形参设置为一个可以选择的形参x,这样要多大的时钟都可以自己设置,如果这样设置,那这整个HSE配置系统时钟函数就需要传一个对应类型的形参,函数RCC_PLLCmd()选择ENABLE将锁相环使能

cpp 复制代码
//配置PLLCLK = HSE * RCC_PLLMul_x
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_x);
		
//使能PLL
RCC_PLLCmd(ENABLE);

然后通过while循环判断函数RCC_GetFlagStatus()的返回值从而等待锁相环稳定

cpp 复制代码
while((RCC_FLAG_PLLRDY) == RESET);

5.配置系统时钟

因为系统时钟的来源有三个,分别是HSI、HSE、PLLCLK(锁相环时钟),通过函数RCC_SYSCLKConfig()选择锁相环时钟

cpp 复制代码
//选择系统时钟
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

最后通过函数RCC_GetSYSCLKSource()判断是否将系统时钟切换为锁相环时钟,通过函数原型上面的注释可以知道当返回值为0x08是说明已经将系统时钟切换为锁相环时钟

cpp 复制代码
while(RCC_GetSYSCLKSource() != 0x08);

这样我们再main函数中调用这个HSE系统时钟配置函数,然后给他一个你需要的倍频因子的参数,这样就将系统时钟配置为对应的大小。

相关推荐
晶振厂家-晶发电子2 天前
晶振在5G时代的角色:高精度时钟的核心支撑
单片机·嵌入式硬件·5g·晶振·电子元器件·晶振知识
F137298015572 天前
WD5030A 芯片,12V降5V,输出电流12A,电路设计
stm32·单片机·嵌入式硬件·汽车·51单片机
小莞尔2 天前
【51单片机】【protues仿真】基于51单片机的篮球计时计分器系统
c语言·stm32·单片机·嵌入式硬件·51单片机
三佛科技-187366133972 天前
分享机械键盘MCU解决方案
单片机·嵌入式硬件·计算机外设
李永奉2 天前
51单片机-使用IIC通信协议实现EEPROM模块教程
单片机·嵌入式硬件·51单片机
工大一只猿2 天前
51单片机学习
嵌入式硬件·学习·51单片机
小莞尔2 天前
【51单片机】【protues仿真】 基于51单片机八路抢答器系统
c语言·开发语言·单片机·嵌入式硬件·51单片机
风_峰2 天前
Ubuntu Linux SD卡分区操作
嵌入式硬件·ubuntu·fpga开发
bing_feilong2 天前
STM32精准控制水流
单片机·嵌入式硬件
Hello_Embed2 天前
STM32HAL 快速入门(二十):UART 中断改进 —— 环形缓冲区解决数据丢失
笔记·stm32·单片机·学习·嵌入式软件