stm32学习之系统时钟

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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设置***********************************/

相关文档
最新文档