使用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系统时钟配置函数,然后给他一个你需要的倍频因子的参数,这样就将系统时钟配置为对应的大小。

相关推荐
xMathematics1 小时前
STM32嵌入式开发从入门到实战:全面指南与项目实践
stm32·单片机·嵌入式硬件
SundayBear1 小时前
嵌入式MCU常用模块
单片机·嵌入式硬件·常用模块
冻结的鱼2 小时前
在 STM32 中实现电机测速的方法介绍
stm32·单片机·嵌入式硬件
getapi2 小时前
51单片机烧录程序演示教程
stm32·单片机·51单片机
我不是程序猿儿5 小时前
【C#】一种优雅的基于winform的串口通信管理
stm32·单片机·c#
六六六六六66666 小时前
STM32中Hz和时间的转换
stm32·单片机·嵌入式硬件
南泽兆7 小时前
超低功耗MCU软件开发设计中的要点与选型推荐
单片机·mcu·iot·小华半导体·如何做好超低功耗mcu开发·超低功耗mcu设计要点·超低功耗mcu国产如何选型
龙大大L8 小时前
第五章:5.1 ESP32物联网应用 - MQTT协议深度教程
java·单片机·struts·apache
傍晚冰川8 小时前
【STM32】解读启动文件startup_stm32f10x_md.s
linux·笔记·stm32·单片机·学习
飞凌嵌入式9 小时前
飞凌嵌入式T527核心板正式发布OpenHarmony4.1系统,实现从芯片架构到操作系统的全链路国产化
人工智能·嵌入式硬件·嵌入式·飞凌嵌入式