使用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打开外部高速时钟。

    //使能HSE
	RCC_HSEConfig(RCC_HSE_ON);

1.2. 等待启动

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

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。

//使能FLASH预取缓冲区
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

2.2. 设置FLASH的等待周期

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

FLASH_SetLatency(FLASH_Latency_2);     //等待两个周期

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

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

RCC_HCLKConfig(RCC_SYSCLK_Div1);   //ABH一分频

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

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将锁相环使能

//配置PLLCLK = HSE * RCC_PLLMul_x
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_x);
		
//使能PLL
RCC_PLLCmd(ENABLE);

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

while((RCC_FLAG_PLLRDY) == RESET);

 5.配置系统时钟

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

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

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

while(RCC_GetSYSCLKSource() != 0x08);

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

 

 

你可能感兴趣的:(单片机,嵌入式硬件)