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。
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号端口的输入值
}
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)
{
}
}
}