STM32——关于时钟源的实际使用及解释

1、STM32内部有5个时钟源,分别为HSI、HSE、LSE、LSI、PLL。

HSE:高速外部时钟,可接石英谐振器、陶瓷谐振器,或者接外部时钟源,其频率范围为4MHZ~16MHZ。

LSE: 低速外部时钟,接频率为32.768KHZ的石英晶体。

HSI:高速内部时钟,RC振荡器,频率为8MHZ。

LSI:低速内部时钟,RC振荡器,频率为40KHZ。

PLL:锁相环倍频输出。其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频选择2~16倍,但是其输出频率最大不得超过72MHZ。

6688f0e17cb344ada371ba0fd1537cca.png

2、根据STM32F103的参考手册,我们能够看到LSE和LSI未通向AHB预分频器,即未参与挂载在AHB总线上的各种外设。

LSE是用来个RTC(实时时钟)来提供准确的时钟信号。

LSI是一种低功耗,高精度的时钟信号,是一种以内部电源为驱动的振荡器,适用于一些应用场景,尤其是对功耗要求较高的场合,用于供给独立看门狗和自动唤醒单元使用。

3、在程序中如何使用HSE和HSI?

1、LED.C
 
#include "stm32f10x.h"                  // Device header
#include "Delay.h"
 
void LED_Init(void)
{
	/*当我们直接在程序中使用RCC_APB2PeriphClockCmd时,
        其是由内部时钟控制的。它用于使能或禁用外设的时
        钟,通过控制内部时钟的分频器来控制外设的时钟。*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);	//开启APB2外设时钟
	
	GPIO_DeInit(GPIOC);	//对整个GPIOC引脚进行复位操作
	GPIO_InitTypeDef GPIO_InitStructure;	//声明结构体GPIO_InitStructure
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;		//推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOC,&GPIO_InitStructure);
 
}
 
 
void LED(void)
{
	GPIO_WriteBit(GPIOB,GPIO_Pin_7,(BitAction)0);	//BitAction为强制类型转换符
	Delay_ms(500);
	GPIO_WriteBit(GPIOB,GPIO_Pin_7,Bit_SET);
	Delay_ms(500);
}
 
void PC13_ON(void)
{
		GPIO_ResetBits(GPIOC,GPIO_Pin_13);		//低电平点亮PC13LED灯
		Delay_ms(500);
}
 
void PC13_OFF(void)
{
		GPIO_SetBits(GPIOC,GPIO_Pin_13);		//高电平点亮PC13LED灯
		Delay_ms(500);
}
 
uint8_t LED_GetNum(void)
{
	return GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13 ); //读取PC13号端口的输入值
}

feb16ef87a234f31a76cd7bf5875ced8.png

 


void HSE_Init(uint16_t PLL)
{
	ErrorStatus HSEStart_UpStatus;
	//将RCC寄存器重新设置为默认值
	RCC_DeInit();
	//打开外部高速时钟晶振HSE
	RCC_HSEConfig(RCC_HSE_ON);
	//等待外部高速时钟晶振工作
	HSEStart_UpStatus = RCC_WaitForHSEStartUp();
	
	if(HSEStart_UpStatus == SUCCESS) 	//SUCCESS:HSE晶振稳定且就绪
	{
		//设置AHB时钟
		RCC_HCLKConfig(RCC_SYSCLK_Div1);
		
		//设置高速AHB时钟
		RCC_PCLK2Config(RCC_HCLK_Div1);
		
		//设置低速AHB时钟
		RCC_PCLK1Config(RCC_HCLK_Div2);
		
		//设置FLASH存储器延时时钟周期数
		FLASH_SetLatency(FLASH_ACR_LATENCY_2);
		//选择FLASH预取指缓存的模式
		FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
		
		//设置PLL时钟源及倍频系数
		switch(PLL)
		{
			case 2:RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_2);
							break;
			case 3:RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_3);
							break;
			case 4:RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_4);
							break;
			case 5:RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_5);
							break;
			case 6:RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_6);
							break;
			case 7:RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_7);
							break;
			case 8:RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_8);
							break;
			case 9:RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);
							break;
			default:RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_2);
							break;
		}
		//使能PLL
		RCC_PLLCmd(ENABLE);
		//检查指定的RCC标志位
		while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET){}
			
		//设置系统时钟(SYSCLK)
		RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//RCC_SYSCLKSource_PLLCLK选择PLL作为系统时钟
		
		//PLL返回用作系统时钟的时钟源
	/**
  * @brief  Returns the clock source used as system clock.
  * @param  None
  * @retval The clock source used as system clock. The returned value can
  *   be one of the following:
  *     - 0x00: HSI used as system clock
  *     - 0x04: HSE used as system clock
  *     - 0x08: PLL used as system clock
  */
		while(RCC_GetSYSCLKSource()!= 0X08)
		{
			
		}
	}
}

 

 

posted @ 2023-07-06 13:18  Xa_L  阅读(445)  评论(0编辑  收藏  举报  来源