Section 5

    科技2023-12-03  108

    Section 5_STM32时钟系统

    1.时钟树介绍1.可以使用三种不同的时钟源来驱动系统时钟 (SYSCLK): 2.时钟配置函数介绍(1)时钟使能配置函数:(2)时钟源和分频因子相关配置函数:(3)外设复位函数:(4)状态参数获取函数:(5)RCC中断相关函数: 3.系统时钟设置步骤4.编程

    1.时钟树介绍

    具体参考《 STM32F4xx中文参考手册》时钟章节。

    1.可以使用三种不同的时钟源来驱动系统时钟 (SYSCLK):

    ● HSI 振荡器时钟 ● HSE 振荡器时钟 ● 主 PLL (PLL) 时钟 器件具有以下两个次级时钟源: ● 32 kHz 低速内部 RC (LSI RC),该 RC 用于驱动独立看门狗,也可选择提供给 RTC 用 于停机/待机模式下的自动唤醒。 ● 32.768 kHz 低速外部晶振(LSE 晶振),用于驱动 RTC 时钟 (RTCCLK) 对于每个时钟源来说,在未使用时都可单独打开或者关闭,以降低功耗。

    SystemInit()后时钟频率大小: SYSCLK(系统时钟) =168MHz AHB 总线时钟(HCLK=SYSCLK) =168MHz APB1 总线时钟(PCLK1=SYSCLK/4) =42MHz APB2 总线时钟(PCLK2=SYSCLK/2) =84MHz PLL 主时钟 =168MHz

    2.时钟配置函数介绍

    (1)时钟使能配置函数:

    RCC_HSICmd RCC_LSICmd RCC_PLLCmd RCC_PLLI2SCmd RCC_PLLSAICmd RCC_RTCCLKCmd RCC_AHBxPeriphClockCmd RCC_APBxPeriphClockCmd

    (2)时钟源和分频因子相关配置函数:

    RCC_HSEConfig RCC_LSEConfig RCC_PLLConfig RCC_PLLI2SConfig RCC_PLLSAIConfig RCC_MCO1Config RCC_MCO2Config RCC_SYSCLKConfig RCC_HCLKConfig RCC_PCLK1Config RCC_PCLK2Config RCC_RTCCLKConfig RCC_I2SCLKConfig

    (3)外设复位函数:

    RCC_AHB1PeriphResetCmd RCC_AHB2PeriphResetCmd RCC_AHB3PeriphResetCmd RCC_APB1PeriphResetCmd RCC_APB2PeriphResetCmd

    (4)状态参数获取函数:

    RCC_GetSYSCLKSource RCC_GetClocksFreq RCC_GetFlagStatus RCC_ClearFlag

    (5)RCC中断相关函数:

    RCC_ITConfig RCC_ClearITPendingBit RCC_GetITStatus

    3.系统时钟设置步骤

    //pllm:VCO 输入时钟 分频因子,范围0-63 //plln:VCO 输出时钟 倍频因子,范围192-432 //pllp:PLLCLK 时钟分频因子,范围2, 4, 6, or 8 //pllq:OTG FS,SDIO,RNG 时钟分频因子,范围4-15 void RCC_HSE_Config(u32 pllm,u32 plln,u32 pllp,u32 pllq) { RCC_DeInit(); //将外设RCC寄存器重设为缺省值 RCC_HSEConfig(RCC_HSE_ON);//设置外部高速晶振(HSE) if(RCC_WaitForHSEStartUp()==SUCCESS) //等待HSE起振 { RCC_HCLKConfig(RCC_SYSCLK_Div1);//设置AHB时钟(HCLK) RCC_PCLK2Config(RCC_HCLK_Div2);//设置低速APB2时钟(PCLK2) RCC_PCLK1Config(RCC_HCLK_Div4);//设置低速APB1时钟(PCLK1) RCC_PLLConfig(RCC_PLLSource_HSE,pllm,plln,pllp,pllq);//设置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作为系统时钟 } }

    4.编程

    #include "stm32f4xx.h" #include "led.h" void delay(u32 i) { while(i--); } //pllm:VCO 输入时钟 分频因子,范围0-63 //plln:VCO 输出时钟 倍频因子,范围192-432 //pllp:PLLCLK 时钟分频因子,范围2, 4, 6, or 8 //pllq:OTG FS,SDIO,RNG 时钟分频因子,范围4-15 void RCC_HSE_Config(u32 pllm,u32 plln,u32 pllp,u32 pllq) { RCC_DeInit(); //将外设RCC寄存器重设为缺省值 RCC_HSEConfig(RCC_HSE_ON);//设置外部高速晶振(HSE) if(RCC_WaitForHSEStartUp()==SUCCESS) //等待HSE起振 { RCC_HCLKConfig(RCC_SYSCLK_Div1);//设置AHB时钟(HCLK) RCC_PCLK2Config(RCC_HCLK_Div2);//设置低速APB2时钟(PCLK2) RCC_PCLK1Config(RCC_HCLK_Div4);//设置低速APB1时钟(PCLK1) RCC_PLLConfig(RCC_PLLSource_HSE,pllm,plln,pllp,pllq);//设置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() { RCC_HSE_Config(8,336,4,7);//168M 84M LED_Init(); while(1) { GPIO_ResetBits(GPIOF,GPIO_Pin_10); delay(6000000); GPIO_SetBits(GPIOF,GPIO_Pin_10); delay(6000000); } }
    Processed: 0.011, SQL: 8