STM32-RCC复位时钟控制

一.RCC系统时钟树

在这里插入图片描述
HSE时钟
HSE:High Speed External Clock signal,即高速的外部时钟。
来源:无源晶振(4-16M),通常使用8M。
控制:RCC_CR 时钟控制寄存器的位16:HSEON控制

HSI时钟
HSI:Low Speed Internal Clock signal,高速的内部时钟。
来源:芯片内部,大小为8M,当HSE故障时,系统时钟会自动切换到HSI,直到HSE启动成功。
控制: RCC_CR 时钟控制寄存器的位0:HSION控制

锁相环时钟
锁相环时钟:PLLCLK
来源:(HSI/2、HSE)经过倍频所得 。
控制:CFGR:PLLXTPRE、PLLMUL
注意:PLL时钟源头使用HIS/2的时候,PLLMUL最大只能是16,这个时候PLLCLK最大只能是64M,小于ST官方推荐的最大时钟72M

系统时钟
锁相环时钟:SYSCLK,最高为72M(ST官方推荐的)
来源:HSI、HSE、PLLCLK。
控制:CFGR:SW
注意:通常的配置是SYSCLK=PLLCLK=72M

HCLK时钟
HCLK:AHB高速总线时钟,速度最高为72M。为AHB总线的外设提供时钟、为Cortex系统定时器提供时钟(SysTick)、为内核提供时钟(FCLK)。
AHB:advanced high-performance bus。
来源:系统时钟分频得到,一般设置HCLK=SYSCLK=72M
控制: CFGR:HPRE

PCLK1时钟
PCLK1:APB1低速总线时钟,最高为36M。为APB1总线的外设提供时钟。2倍频之后则为APB1总线的定时器2-7提供时钟,最大为72M。
来源:HCLK分频得到,一般配置PCLK1=HCLK/2=36M
控制: RCC_CFGR 时钟配置寄存器的PPRE1位

PCLK2时钟
PCLK2:APB2高速总线时钟,最高为72M。为APB1总线的外设提供时钟。为APB1总线的定时器1和8提供时钟,最大为72M。
来源:HCLK分频得到,一般配置PCLK1=HCLK=72M
控制: RCC_CFGR 时钟配置寄存器的PPRE2位

RTC时钟
RTC时钟:为芯片内部的RTC外设提供时钟。
来源:HSE_RTC(HSE分频得到)、LSE(外部32.768KHZ的晶体提供)、LSI(32KHZ)。
控制: RCC备份域控制寄存器RCC_BDCR:RTCSEL位控制

独立看门狗时钟:IWDGCLK,由LSI提供

MCO时钟输出
MCO:microcontroller clock output,微控制器时钟输出引脚,由PA8复用所得。
来源:PLLCLK/2,HSE、HSI、SYSCLK
控制:CRGR:MCO

二.系统时钟配置

一般使用固件库函数直接配置:
用HSE作为时钟源,程序设置时钟参数流程:

01、将RCC寄存器重新设置为默认值 RCC_DeInit;

02、打开外部高速时钟晶振 HSE RCC_HSEConfig(RCC_HSE_ON);

03、等待外部高速时钟晶振工作 RCC_WaitForHSEStartUp()!=0

04、设置AHB时钟 RCC_HCLKConfig;

05、设置APB2时钟 RCC_PCLK2Config;

06、设置APB1时钟 RCC_PCLK1Config;

07、设置PLL输入时钟源 RCC_PLLConfig;

08、打开PLL RCC_PLLCmd(ENABLE);

09、等待PLL工作 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)

10、设置系统时钟 RCC_SYSCLKConfig;

11、判断是否PLL是系统时钟 while(RCC_GetSYSCLKSource() != 0x08)

12、打开要使用的外设时钟 RCC_APB2PeriphClockCmd()/RCC_APB1PeriphClockCmd()

下面是某种芯片软件固件库的程序中对RCC的配置函数:

void System_HSE_Clock_Init(u8 PLL)

{

    RCC_DeInit(); // RCC system reset
    RCC_HSEConfig(RCC_HSE_ON); // Enable HSE

HSEStartUpStatus = RCC_WaitForHSEStartUp(); // Wait till HSE is ready

 if (HSEStartUpStatus == SUCCESS)  // 当HSE准备完毕切振荡稳定后
 {
   RCC_HCLKConfig(RCC_SYSCLK_Div1); // HCLK = SYSCLK
   RCC_PCLK2Config(RCC_HCLK_Div1);   // PCLK2 = HCLK
   RCC_PCLK1Config(RCC_HCLK_Div2);  // PCLK1 = HCLK/2
   FLASH_SetLatency(FLASH_Latency_2);  // Flash 2 wait state
   FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); 
   RCC_PLLConfig(RCC_PLLSource_HSE_Div1, PLL);  //PLL is 48MHz

    RCC_PLLCmd(ENABLE);  // Enable PLL
   while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
     {

     }

  RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);  

  while (RCC_GetSYSCLKSource() != 0x08)    

{

 }

 }

}

微控制器允许输出时钟信号到外部MCO管脚,用户可通过引脚PA8输出时钟更直观的方式观察时钟系统,配置方法如下:

int RCC_OUT(void)   

{

    GPIO_InitTypeDef  GPIO_InitStructure;

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_8;   //MCO  PA8

    GPIO_InitStructure.GPIO_Speed =  GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出

    GPIO_Init(GPIOA, &GPIO_InitStructure);

    GPIO_PinAFConfig( GPIOA,GPIO_PinSource8,GPIO_AF_0);

   RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

    RCC_MCOConfig(RCC_MCO_SYSCLK);  //通过PA8观察系统频率

    }

总结

RCC时钟系统控制贯穿于整个STM32,必须要要学会看时钟树和配置流程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜鸟小小哲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值