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

相关推荐
竹照煜_ysn3 小时前
蓝桥杯51单片机设计
单片机·嵌入式硬件·51单片机
Electron-er4 小时前
汽车LIN总线通讯:从物理层到协议栈的深度解析
单片机·汽车电子·lin总线·lin总线通讯
Do vis8244 小时前
STM32第十六天蓝牙模块
stm32·单片机·嵌入式硬件
学不动CV了4 小时前
ARM单片机启动流程(二)(详细解析)
c语言·arm开发·stm32·单片机·51单片机
猫猫的小茶馆6 小时前
【STM32】通用定时器基本原理
c语言·stm32·单片机·嵌入式硬件·mcu·51单片机
jingshaoqi_ccc7 小时前
stm32的USART使用DMA配置成循环模式时发送和接收有着本质区别
stm32·单片机·嵌入式硬件
MingYue_SSS10 小时前
开关电源抄板学习
经验分享·笔记·嵌入式硬件·学习
玉树临风江流儿11 小时前
炸鸡派-定时器基础例程
单片机·嵌入式硬件
小宋同学在不断学习11 小时前
stm32-掌握SPI原理(一)
stm32·单片机·spi
is081511 小时前
STM32的 syscalls.c 和 sysmem.c
c语言·stm32·嵌入式硬件