STM32F10xx时钟系统

来源:互联网 发布:知其雄而守其雌的意思 编辑:程序博客网 时间:2024/06/03 16:55

STM32F10xx时钟系统框图

STM32 有5个时钟源:HSI、HSE、LSI、LSE、PLL。

  • HSI是高速内部时钟,RC振荡器,频率为8MHz,精度不高。
  • HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。
  • LSI是低速内部时钟,RC振荡器,频率为40kHz,提供低功耗时钟。
  • LSE是低速外部时钟,接频率为32.768kHz的石英晶体。
  • PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。 倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。

系统时钟SYSCLK可来源于三个时钟源:

  • HSI振荡器时钟
  • HSE振荡器时钟
  • PLL时钟

STM32可以选择一个时钟信号输出到MCO脚(PA8)上,可以选择为PLL 输出的2分频、HSI、HSE、或者系统时钟。

任何一个外设在使用之前,必须首先使能其相应的时钟。

RCC相关配置寄存器

typedef struct
{
__IO uint32_t CR; //HSI,HSE,CSS,PLL等的使能和就绪标志位
__IO uint32_t CFGR; //PLL等的时钟源选择,分频系数设定
__IO uint32_t CIR; // 清除/使能 时钟就绪中断
__IO uint32_t APB2RSTR; //APB2线上外设复位寄存器
__IO uint32_t APB1RSTR; //APB1线上外设复位寄存器
__IO uint32_t AHBENR; //DMA,SDIO等时钟使能
__IO uint32_t APB2ENR; //APB2线上外设时钟使能
__IO uint32_t APB1ENR; //APB1线上外设时钟使能
__IO uint32_t BDCR; //备份域控制寄存器
__IO uint32_t CSR; //控制状态寄存器
} RCC_TypeDef;

RCC配置相关头文件和固件库源文件

1.时钟使能配置:
RCC_LSEConfig() 、RCC_HSEConfig()、
RCC_HSICmd() 、 RCC_LSICmd() 、 RCC_PLLCmd() ……

2.时钟源相关配置:
RCC_PLLConfig ()、 RCC_SYSCLKConfig() 、 RCC_RTCCLKConfig() …

3.分频系数选择配置:
RCC_HCLKConfig() 、 RCC_PCLK1Config() 、 RCC_PCLK2Config()…

4.外设时钟使能:
RCC_APB1PeriphClockCmd(): //APB1线上外设时钟使能
RCC_APB2PeriphClockCmd(); //APB2线上外设时钟使能
RCC_AHBPeriphClockCmd(); //AHB线上外设时钟使能

5.其他外设时钟配置:
RCC_ADCCLKConfig (); RCC_RTCCLKConfig();

6.状态参数获取参数:
RCC_GetClocksFreq();
RCC_GetSYSCLKSource();
RCC_GetFlagStatus()
7. RCC中断相关函数 :
RCC_ITConfig() 、 RCC_GetITStatus() 、 RCC_ClearITPendingBit()…

系统时钟系统初始化重要函数:

    SystemInit();     使用V3.5版本的库函数,该函数在系统启动之后会自动调用:     startup_stm32f10x_xx.s文件中:        ; Reset handler        Reset_Handler   PROC             EXPORT  Reset_Handler             [WEAK]             IMPORT  __main             IMPORT  SystemInit             LDR     R0, =SystemInit             BLX     R0                            LDR     R0, =__main             BX      R0             ENDP

初始化之前首先通过宏定义定义系统时钟频率:
#define SYSCLK_FREQ_72MHz 72000000
初始化之后的状态:
SYSCLK 72MHz
AHB 72MHz
PCLK1 36MHz
PCLK2 72MHz
PLL 72MHz
初始化之后可以通过变量SystemCoreClock获取系统变量。如果
SYSCLK=72MHz,那么变量SystemCoreClock=72000000。

配置系统时钟源以及时钟:

void RCC_PLL_Configuration(void)
{
RCC_DeInit(); /将外设RCC寄存器重设为缺省值 /
RCC_HSEConfig(RCC_HSE_ON); /设置外部高速晶振(HSE) HSE晶振打开(ON)/

if(RCC_WaitForHSEStartUp() == SUCCESS) { /等待HSE起振, SUCCESS:HSE晶振稳定且就绪/
RCC_HCLKConfig(RCC_SYSCLK_Div1); /设置AHB时钟(HCLK) RCC_SYSCLK_Div1——AHB时钟 = 系统时/
RCC_PCLK2Config(RCC_HCLK_Div1); /* 设置高速AHB时钟(PCLK2)RCC_HCLK_Div1——APB2时钟 = HCLK*/
RCC_PCLK1Config(RCC_HCLK_Div2); /设置低速AHB时钟(PCLK1)RCC_HCLK_Div2——APB1时钟 = HCLK / 2/
FLASH_SetLatency(FLASH_Latency_2); /设置FLASH存储器延时时钟周期数FLASH_Latency_2 2延时周期/
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); /选择FLASH预取指缓存的模,预取指缓存使能/
RCC_PLLConfig(RCC_PLLSource_HSE_Div2, RCC_PLLMul_3);/设置PLL时钟源及倍频系数/
RCC_PLLCmd(ENABLE); /使能PLL /
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) ; /检查指定的RCC标志位(PLL准备好标志)设置与否/
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /设置系统时钟(SYSCLK) /
while(RCC_GetSYSCLKSource() != 0x08); /0x08:PLL作为系统时钟 /
}
}

工程模板中的实例时钟分析

int main(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB| RCC_APB2Periph_GPIOE, ENABLE);

GPIO初始化代码;

while(1) //死循环
{
}
}

0 0
原创粉丝点击