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.系统时钟设置步骤
void RCC_HSE_Config(u32 pllm
,u32 plln
,u32 pllp
,u32 pllq
)
{
RCC_DeInit();
RCC_HSEConfig(RCC_HSE_ON
);
if(RCC_WaitForHSEStartUp()==SUCCESS
)
{
RCC_HCLKConfig(RCC_SYSCLK_Div1
);
RCC_PCLK2Config(RCC_HCLK_Div2
);
RCC_PCLK1Config(RCC_HCLK_Div4
);
RCC_PLLConfig(RCC_PLLSource_HSE
,pllm
,plln
,pllp
,pllq
);
RCC_PLLCmd(ENABLE
);
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY
)==RESET
);
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK
);
while(RCC_GetSYSCLKSource()!=0x08);
}
}
4.编程
#include "stm32f4xx.h"
#include "led.h"
void delay(u32 i
)
{
while(i
--);
}
void RCC_HSE_Config(u32 pllm
,u32 plln
,u32 pllp
,u32 pllq
)
{
RCC_DeInit();
RCC_HSEConfig(RCC_HSE_ON
);
if(RCC_WaitForHSEStartUp()==SUCCESS
)
{
RCC_HCLKConfig(RCC_SYSCLK_Div1
);
RCC_PCLK2Config(RCC_HCLK_Div2
);
RCC_PCLK1Config(RCC_HCLK_Div4
);
RCC_PLLConfig(RCC_PLLSource_HSE
,pllm
,plln
,pllp
,pllq
);
RCC_PLLCmd(ENABLE
);
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY
)==RESET
);
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK
);
while(RCC_GetSYSCLKSource()!=0x08);
}
}
int main()
{
RCC_HSE_Config(8,336,4,7);
LED_Init();
while(1)
{
GPIO_ResetBits(GPIOF
,GPIO_Pin_10
);
delay(6000000);
GPIO_SetBits(GPIOF
,GPIO_Pin_10
);
delay(6000000);
}
}