STM32之时钟配置

在这里插入图片描述

时钟控制寄存器(RCC_CR)

在这里插入图片描述
在这里插入图片描述
16位:开启HSE(高速外部时钟)
17位:判断HSE是否开启成功
24位:开启PLL(倍频器)
25位:判断PLL是否开启成功

时钟配置寄存器(RCC_CFGR)

在这里插入图片描述
21~18位:选择PLL倍频系数(一般选择九倍频,系统时钟会达到最高的72MHZ)。
16位:选择PLL输入是HSE还是经过二分的HSI(一般选择HSE输入)。
13~11位:选择APB2分频系数(一般不分频,这条线上外设频率最高72MHZ)。
10~8位:选择APB1分频系数(一般是二分频,这条线上外设频率最高为36MHZ)。
7~4位:选择AHB分频系数(一般不分频)。
3~2位:检测系统时钟是否选择成功。
1~0位:选择一个时钟源作为系统时钟(一般选择PLL)。
17位:选择给HSE二分频还是不分频(一般不分频,默认为零,所以不设置)。

闪存访问控制寄存器(LASH_ACR)

在这里插入图片描述

//------------------RCC时钟寄存器-----------------------------
#define RCC_CR			*((unsigned volatile int*)0x40021000)
#define RCC_CFGR		*((unsigned volatile int*)0x40021004)
//--------------FLASH闪存存储器接口---------------------------
#define FLASH_ACR		*((unsigned volatile int*)0x40022000)
//-------------------系统时钟配置-----------------------------
void System_clock(unsigned char PLL)
{
	unsigned int Clock_OK;
	RCC_CR|=1<<16;				//开启HSE高速外部时钟
	while(!(RCC_CR&(1<<17)));	//等待HSE开启成功
	RCC_CFGR|=4<<8;				//0x00000400 AHB不分频;APB2不分频;APB1二分频
	FLASH_ACR|=0x2;				//FLASH缓冲
	RCC_CFGR|=1<<16;			//HSE输出作为PLL输入时钟
	PLL=PLL-2;					//选择PLL倍频2--9
	RCC_CFGR|=PLL<<18;			//PLL九倍频输出
	RCC_CR|=1<<24;				//PLL使能
	while(!(RCC_CR&(1<<25)));	//等待PLL使能成功
	RCC_CFGR|=2<<0;				//选择PLL为系统时钟
	do							//等待系统时钟设置成功
	{
		Clock_OK=RCC_CFGR&0x0c;
	}
	while(Clock_OK!=0x08);
}
//---------------------------主函数----------------------------
int mian()
{
	System_clock(9);			//主函数调用系统时钟
								//括号里是倍频选择,目前是九倍频
}


或者:

//配置HSE时钟
void HSE_SetSysClk(uint32_t RCC_PLLMul_x)
{
	ErrorStatus HSEStatus;
	
	RCC_DeInit();
	
	RCC_HSEConfig(RCC_HSE_ON);
	
	HSEStatus = RCC_WaitForHSEStartUp();
	
	if(HSEStatus == SUCCESS)
	{
		FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
		FLASH_SetLatency(FLASH_Latency_2);
		
		RCC_HCLKConfig(RCC_SYSCLK_Div1);
		RCC_PCLK1Config(RCC_SYSCLK_Div2);
		RCC_PCLK2Config(RCC_SYSCLK_Div1);
		
		RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_x);
		
		RCC_PLLCmd(ENABLE);
		
		while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
		
		RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
		
		while(RCC_GetSYSCLKSource() != 0x08);
	}
	else
	{
		/*  */
	}
}

//配置HSI时钟
void HSI_SetSysClk(uint32_t RCC_PLLMul_x)
{
	__IO uint32_t HSIStatus = 0;
	
	RCC_DeInit();
	
	RCC_HSICmd(ENABLE);
	HSIStatus = RCC->CR & RCC_CR_HSIRDY;
	
	
	
	
	
	if(HSIStatus == RCC_CR_HSIRDY)
	{
		FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
		FLASH_SetLatency(FLASH_Latency_2);
		
		RCC_HCLKConfig(RCC_SYSCLK_Div1);
		RCC_PCLK1Config(RCC_SYSCLK_Div2);
		RCC_PCLK2Config(RCC_SYSCLK_Div1);
		
		RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_x);
		
		RCC_PLLCmd(ENABLE);
		
		while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
		
		RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
		
		while(RCC_GetSYSCLKSource() != 0x08);
	}
	else
	{
		/*  */
	}

使用库函数没找到是在哪里设置RCC_CFGR的16位,该位是用来选择高速外部时钟源的,复位值为高速内部时钟源的2分频。因此要用高速外部时钟源应该让该位置1。补充:这里是用库函数RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_x)中的第一个参数来选择的。
在这里插入图片描述

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值