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_InitStructureGPIO_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();//打开外部高速时钟晶振HSERCC_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;}//使能PLLRCC_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){}}
}