STM32-嵌入式学习笔记1-使用HSE和HSI配置时钟

RCC主要作用:时钟

设置SYSCLK   设置AHB分频因子····配置好这些因子就能对时钟进行完整的配置。

时钟树如图:

系统时钟的选择是在启动时进行,复位时内部8MHz的RC振荡器被选为默认的CPU时钟,随后可以
选择外部的、具失效监控的4~16MHz时钟;当检测到外部时钟失效时,它将被隔离,系统自动地切
换到内部的RC振荡器,如果使能了中断,软件可以接收到相应的中断。同样,在需要时可以采取对
PLL时钟完全的中断管理(如当一个间接使用的外部振荡器失效时)。
多个预分频器用于配置AHB的频率、高速APB(APB2)和低速APB(APB1)区域。AHB和APB的最高频
率是36MHz。

编程要领:

1)开启HSE/HSI 等待HSE/HSI 稳定

2)设置AHB,APB2,APB1的预分频因子

3)设置PLL的时钟来源和PLL的倍频因子,各个频率主要在这里设置

4)开启PLL 等待PLL稳定

5)把PLLCK切换为系统时钟SYSCLK

6)读取时钟切换状态位,确保PLLCLK被选中为系统时钟

HSE配置系统时钟

#include "stm32f10x.h"
#include "bsp_rccclkconfig.h"

void HSE_SetSysClk(uint32_t RCC_PLLMul_x) //设置HSE为系统时钟
{
	//把RCC外设初始化成复位状态
	ErrorStatus HSEStatus;
	
	//把RCC寄存器复位
	RCC_DeInit();
	//使能HSE,开启外部晶振
	RCC_HSEConfig(RCC_HSE_ON);
	
	//等待HSE启动
	HSEStatus=RCC_WaitForHSEStartUp();
	
	//当HSE稳定之后继续往下执行
	if(HSEStatus== SUCCESS )
	{
		//使能预取指
		FLASH_PrefetchBufferCmd( FLASH_PrefetchBuffer_Enable);
		FLASH_SetLatency(FLASH_Latency_2);
        //LATENCY:时延
		//这些位表示SYSCLK(系统时钟)周期与闪存访问时间的比例
		//000:零等待状态,当 0 < SYSCLK ≤ 24MHz
		//001:一个等待状态,当 24MHz < SYSCLK ≤ 48MHz
		//010:两个等待状态,当 48MHz < SYSCLK ≤ 72MHz
		RCC_HCLKConfig(RCC_SYSCLK_Div1);
		RCC_PCLK1Config(RCC_HCLK_Div1);
		RCC_PCLK2Config(RCC_HCLK_Div2);

		//配置PLLCLK = HSE *RCC_PLLMul_x
		RCC_PLLConfig( RCC_PLLSource_HSE_Div1,RCC_PLLMul_x);
		
		//使能PLL
		RCC_PLLCmd(ENABLE);
		
		//等待PLL时钟稳定
		while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)== RESET )
		{
			//选择系统时钟
			RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
			
			while(RCC_GetSYSCLKSource() !=0x08);
		}
	}
	else
	{
		
	}
}

void MCO_GPIO_Config()
{
	//定义一个GPIO_InitTypeDef类型的结构体
		GPIO_InitTypeDef GPIO_InitStructure;

		//开启LED相关GPIO的外设时钟
		RCC_APB2PeriphClockCmd(  RCC_APB2Periph_GPIOA, ENABLE);
		//选择控制的引脚
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;	

		//选择输出方式为推挽输出
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   

		//设置引脚速率为50MHZ
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 

		//调用库函数,初始化GPIO
		GPIO_Init(GPIOA, &GPIO_InitStructure);	
}

使用HSI作为系统时钟

#include "stm32f10x.h"
#include "bsp_rccclkconfig.h"

void HSI_SetSysClk(uint32_t RCC_PLLMul_x) //设置HSE为系统时钟
{
	//把RCC外设初始化成复位状态
	__IO uint32_t HSIStatus=0;
	
	//把RCC寄存器复位
	RCC_DeInit();
	
	//使能HSI,开启外部晶振
	RCC_HSICmd(ENABLE);
	
	//等待HSE启动
	HSIStatus =RCC->CR & RCC_CR_HSIRDY;
	
	//当HSE稳定之后继续往下执行
	if(HSIStatus== SUCCESS )
	{
		//使能预取指
		FLASH_PrefetchBufferCmd( FLASH_PrefetchBuffer_Enable);
		FLASH_SetLatency(FLASH_Latency_2);
		//设置SYSCLK周期与flash的访问时间比例,这里为2
		//设置成2的时候,SYSCLK低于48MHz也可以工作,设置成0或者1
		RCC_HCLKConfig(RCC_SYSCLK_Div1);
		RCC_PCLK1Config(RCC_HCLK_Div1);
		RCC_PCLK2Config(RCC_HCLK_Div2);

		//配置PLLCLK = HSE *RCC_PLLMul_x
		RCC_PLLConfig( RCC_PLLSource_HSI_Div2,RCC_PLLMul_x);
		
		//使能PLL
		RCC_PLLCmd(ENABLE);
		
		//等待PLL时钟稳定
		while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)== RESET )
		{
			//选择系统时钟
			RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
			
			while(RCC_GetSYSCLKSource() !=0x08);
		}
	}
	else
	{
		
	}
}

void MCO_GPIO_Config()
{
	//定义一个GPIO_InitTypeDef类型的结构体
		GPIO_InitTypeDef GPIO_InitStructure;

		//开启LED相关GPIO的外设时钟
		RCC_APB2PeriphClockCmd(  RCC_APB2Periph_GPIOA, ENABLE);
		//选择控制的引脚
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;	

		//选择输出方式为推挽输出
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   

		//设置引脚速率为50MHZ
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 

		//调用库函数,初始化GPIO
		GPIO_Init(GPIOA, &GPIO_InitStructure);	
}

猜你喜欢

转载自blog.csdn.net/weixin_41445387/article/details/82669293