STM32学习——RCC时钟配置

使用固件库进行的RCC时钟配置。

时钟树:

由时钟配置寄存器 CFGR 的位 17:PLLXTPRE使能HSE为8M  -->  时钟配置寄存器CFGR的位16: PLLSRC 将HSE(8M)选为PLL(锁相环)的输入  -->  CFGR位 21-18:PLLMUL[3:0]倍频因子选择9M得到PLLCLK(64M)  --> CFGR 的位1-0:SW[1:0] 设置SYSTCLK选择PLLCLK作为系统时钟(72M)  -->  在系统时钟的基础上配置三条总线的时钟(1.AHB、2.APB2、3.APB1)  -->  AHB等于系统时钟的1分频(72M) ,HCLK等于72M  -->  在HCLK基础上1分频得到APB2(72M)  -->  在HCLK基础上2分频得到APB1(36M)

 

程序编写流程:

使能HSE(RCC_HSEConfig) --> 等待HSE稳定(RCC_WaitForHSEStartUp) --> HSE稳定后使能预取指(FLASH_PrefetchBufferCmd) --> 设置FLASH等待(FLASH_SetLatency) --> 设置三总线分频因子(RCC_HCLKConfig、RCC_PCLK1Config、RCC_PCLK2Config) --> 设置PLL锁相环的时钟源和倍频因子(RCC_PLLConfig) --> 使能PLL --> 等待PLL稳定 while( RCC_GetFlagStatus( RCC_FLAG_PLLRDY ) == RESET ); --> 选择系统时钟(RCC_SYSCLKConfig) --> 等待系统时钟稳定while( RCC_GetSYSCLKSource() != 0x08 );

#include "clkconfig.h"

void HSEConfig(uint32_t RCC_PLLMul_x)
{
	ErrorStatus HSEStatus;
	
	//将RCC寄存器复位为复位值
	RCC_DeInit();
	
	//使能HSE
	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_HCLK_Div2 );
		RCC_PCLK2Config( RCC_HCLK_Div1 );
		
		//配置PLL的时钟源和倍频因子
		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
	{
		/* HSE启动失败 */
	}
}

为什么要配置FLASH ? 

  • 取指令时,两条指令之间需要时间间隔,所以需要使能预取指,设置时延,72M的频率需要两个等待状态;

为什么程序编写流程跟时钟树流程不一样?

  • 选择时钟源后,分频因子不可轻易改动,需要先配置好分频因子,再配置时钟源;

总结:

使用固件库编程给我的感觉像是用积木搭房子,每块积木有各自的作用,合理的组合可以实现一定的功能,但需要事先了解步骤,任然需要对寄存器的有一定的了解。

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!对于STM32GPIO输出实验,点亮三色LED,您可以按照以下步骤进行操作: 1. 首先,您需要在STM32的开发环境中创建一个新的工程。 2. 在工程中,您需要包含相应的头文件,如"stm32f10x.h"。 3. 接下来,配置相应的引脚为输出模式。假设红色LED连接到GPIOA的Pin0引脚,绿色LED连接到GPIOA的Pin1引脚,蓝色LED连接到GPIOA的Pin2引脚,您可以使用以下代码进行配置: ``` GPIO_InitTypeDef GPIO_InitStructure; // 使能GPIOA的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 配置红色LED引脚 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置绿色LED引脚 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置蓝色LED引脚 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); ``` 4. 现在,您可以使用相应的寄存器来控制LED的点亮和熄灭。例如,要点亮红色LED,可以使用以下代码: ``` GPIO_SetBits(GPIOA, GPIO_Pin_0); // 将Pin0引脚置高,点亮红色LED ``` 要熄灭红色LED,可以使用以下代码: ``` GPIO_ResetBits(GPIOA, GPIO_Pin_0); // 将Pin0引脚置低,熄灭红色LED ``` 同样的方法,您可以控制绿色和蓝色LED的点亮和熄灭。 这就是点亮三色LED的基本步骤。希望对您有所帮助!如果您有任何其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值