本文将模仿固件库文件system_stm32f10x.c的SetSysClockTo72()函数,编写一个可以改变系统时钟大小的函数。
在固件库文件stm32f10x_rcc.h文件中可以找到.c文件定义的函数,其中就能找到使能HSE的函数RCC_HSEConfig(),然后查看这个函数的原型,注释中写道这个函数的功能是配置外部高速晶振,形参有RCC_HSE_ON、RCC_HSE_OFF、RCC_HSE_Bypass三个,Bypass就是不使用,这里选择ON打开外部高速时钟。
//使能HSE
RCC_HSEConfig(RCC_HSE_ON);
因为晶振起振需要时间达到稳定,所以还需要一个等待函数RCC_WaitForHSEStartUp(),这个函数会返回一个变量,所以需要定义一个同类型的变量,ErrorStatus HSEStatus,ErrorStatus是固件库中已经定义的数据类型声明
typedef enum {ERROR = 0, SUCCESS = !ERROR} ErrorStatus;
它有两个值,ERROR为0,SUCCESS为非零,通常为1。
然后通过一个if语句判断HSE是否启动成功,如果成功就就继续执行,如果启动失败,那用户可以在else中添加异常处理代码。
在固件库stm32f10x_flash.c中找到配置flash预取指的函数FLASH_PrefetchBufferCmd(),通过固件库中对该函数的注释,形参选择Enable。
//使能FLASH预取缓冲区
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
同样在固件库中找到对应功能的函数FLASH_SetLatency(),形参有三个,分别是0等待、1个等待、2个等待,如果设置为72MHZ的话就要设置为两个等待
FLASH_SetLatency(FLASH_Latency_2); //等待两个周期
首先是设置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一分频
在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);
因为系统时钟的来源有三个,分别是HSI、HSE、PLLCLK(锁相环时钟),通过函数RCC_SYSCLKConfig()选择锁相环时钟
//选择系统时钟
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
最后通过函数RCC_GetSYSCLKSource()判断是否将系统时钟切换为锁相环时钟,通过函数原型上面的注释可以知道当返回值为0x08是说明已经将系统时钟切换为锁相环时钟
while(RCC_GetSYSCLKSource() != 0x08);
这样我们再main函数中调用这个HSE系统时钟配置函数,然后给他一个你需要的倍频因子的参数,这样就将系统时钟配置为对应的大小。