stm32学习之系统时钟
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
stm32学习之系统时钟
STM32入门学习心得
—
系统时钟
STM32的时钟与单片机相比要复杂的多,它能够对每一个外设以及IO口进行时钟的设置,这是单片机是无法和它比拟的,所以正确的理解和灵活的运用stm32的时
钟是很重要的。
STM32有3个不同的时钟源可以用于驱动系统时钟(SYSCLK),分别为:
HSI振荡器时钟(内部高速时钟)。
HSE振荡器时钟(外部高速时钟)。
PLL时钟。
STM32还有两个二级时钟用来驱动独立的看门狗和选择性的驱动RTC。分别为:32KHZ低速内部RC振荡器(LSI RC)用来驱动独立的开门狗和选择性的驱动用于从停止/
待机模式自动唤醒的RTC。
32.768kHz低速外部晶体振荡器(LSE 晶体振荡器)用来选择性的驱动实时时钟。
注:每个时钟源在使用时都可以独立的打开/关掉,以节省功耗。
在这里我们可以通过框图来直观的理解STM32的系统时钟。系统时钟框图如图1所示。
图一系统框图
通过图一不妨来详细分析下系统各个部分的时钟。
HSI时钟
HSI时钟通过一个8MHz的内部RC振荡器产生,并且可以被直接用作系统时钟,或者经过2倍频后作为PLL的输出作为SYSCLKS时钟。在系统复位时,HSI振荡器被选择默认的系统SYSCLKS时钟。内部时钟的缺点是频率的精确度没有外部晶体振荡器的高。
程序实现(所有程序都是基于固件库):
直接作为SYSCLKS时钟:RCC_DeInit();系统默认
经过PLL输出作为SYSCLKS时钟:
RCC_DeInit();
SystemInit ();
可以在固件库中的stm32f10x_rcc.c文件中通过开放宏定义来选择系统时
钟经过倍频后的频率,固件库默认为72MHZ。如图2所示:
如图2所示
HSE时钟
高速外部时钟信号可以通过2个可能的时钟源产生。分别为:
HSE 外部晶体/陶瓷共振器。
HSE 外部时钟。
外部时钟源
在该种模式下,必须提高外部时钟源,外部时钟源可以达到25MHz,用户可以通过设置时钟控制寄存器(RCC_CR)中的HSEBYP和HSEON 位选择该模式。占空必50%的外部时钟信号(方波,正弦波,三角波)必须用来驱动OSC_IN引脚,同时OSC_OUT引脚置于高
阻态。
外部晶体振荡器/陶瓷共振器(HSE晶体)
4~16MHz的外部振荡器具有能够在主时钟上产生一个非常精确地速率的优
点。
时钟控制寄存器(RCC_CR)中的HSERDY标志指示了高速外部振荡器是否是稳定的,在启动时,时钟直到硬件设置了该标志位才释放,如果在时钟中断寄存器(RCC_CR)中打开了,
就会产生一个中断。
HSE晶体振荡器可以通过时钟控制寄存器(RCC_CR)中的HSEON位来打开或
禁止。
程序实现(所有程序都是基于固件库):
1.直接作为SYSCLKS时钟:
RCC_DeInit();
/*************************外部时钟设置
*****************************/
RCC_HSEConfig(RCC_HSE_ON);使能外部时钟
If(RCC_WaitForHSEStartUp()==SUCCESS){
/**********************FLASH设置*********************************/ FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
FLASH_SetLatency(FLASH_Latency_2);//flash读取缓冲,加速
/**********************系统时钟配置
*********************************/ RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCL
K); //将PLL设置为系统时钟源
while (RCC_GetSYSCLKSource() != 0x08); //等待系统时钟源的启动/**********************AHB设置***********************************/
RCC_HCLKConfig(RCC_SYSCLK_Div1); //AHB使用系统时钟
/***********************APB2,APB1配置
****************************/ RCC_PCLK2Config(RCC_HCLK_Div1);
//APB2(高速)为
HCLK RCC_PCLK1Config(RCC_HCLK_Div2); //APB1(低速)为HCLK
的一半
}
2.经过PLL输出作为SYSCLKS时钟:
RCC_DeInit();
/*************************外部时钟设置*****************************/
RCC_HSEConfig(RCC_HSE_ON);使能外部时钟
If(RCC_WaitForHSEStartUp()==SUCCESS){
/**************************PLL设置
********************************/
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);//PLLCLK =8MHz
* 9 = 72 MH
RCC_PLLCmd(ENABLE); //启动PLL while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //等待PLL启动
/**********************FLASH设置*********************************/ FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
FLASH_SetLatency(FLASH_Latency_2);//flash读取缓冲,加速
/**********************系统时钟配置
*********************************/ RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCL
K); //将PLL设置为系统时钟源
while (RCC_GetSYSCLKSource() != 0x08); //等待系统时钟源的启动/**********************AHB设置***********************************/