STM32入门(十二)----RCC

本文详细介绍了STM32的RCC(Reset and clock control)模块,包括HSE和HSI时钟源、时钟树配置、RTC时钟、MCO以及CSS功能。通过配置HSE和HSI,以及相应的分频和倍频设置,实现了系统时钟的切换和监控。此外,还展示了如何通过系统时钟配置函数设置不同外设的时钟频率,并通过MCO输出监控系统时钟。
摘要由CSDN通过智能技术生成

RCC: Reset and clock control 复位和时钟控制

时钟树

在这里插入图片描述
在STM32中文参考手册中6.2时钟中的时钟树图

HSE时钟

HSE:High Speed External Clock signal,即高速的外部时钟。
来源:无源晶振(4-16M),通常使用8M。(正点用的也是8M)
在这里插入图片描述

外部晶体/陶瓷谐振器(HSE晶体)
4~16Mz外部振荡器可为系统提供更为精确的主时钟。相关的硬件配置可参考图9,进一步信息可参考数据手册的电气特性部分。
在时钟控制寄存器RCC_CR中的HSERDY位用来指示高速外部振荡器是否稳定。在启动时,直到这一位被硬件置’1’,时钟才被释放出来。如果在时钟中断寄存器RCC_CIR中允许产生中断,将会产生相应中断。
HSE晶体可以通过设置时钟控制寄存器里RCC_CR中的HSEON位被启动和关闭。
正点精英板原理图

STM32中文参考手册7.3.1

HSI时钟

HSI:High Speed Internal Clock signal,高速的内部时钟。
来源:芯片内部,大小为8M,当HSE故障时,系统时钟会自动切换到HSI,直到HSE启动成功。

配置时钟

下面的一些位都是在这个寄存器里面

先找到OSC_OUT、OSC_IN ,我的板子得到HSE OSC很明显是8MHz,找到PLLXTPRE

STM32中文参考手册6.3.2
需要配置为0,即HSE不分频,HSE频率还是8MHz。
找到PLLSRC
STM32中文参考手册6.3.2
配置为1,即HSE时钟作为PLL输入时钟,HSE频率还是8MHz。
找到PLLMUL
STM32中文参考手册6.3.2
配置为0111,即PLL 9倍频输出,这时的频率已经变成了72MHz。
找到SW
STM32中文参考手册6.3.2
配置为10,即PLL输出作为系统时钟。
这时的SYSCLK频率是72MHz。
由于时钟配置需要时间,所以需要通过SWS来检测是否已经切换完毕。
STM32中文参考手册6.3.2
当读取为10时,就表示配置成功了。

下面配置AHB时钟频率
AHB总线分频
配置为0xxx,即不分频,72MHz。

HCLK时钟
HCLK:AHB高速总线时钟,速度最高为72M。为AHB总线的外设提供时钟、为Cortex系统定时器提供时钟(SysTick)、为内核提供时钟(FCLK)。
AHB:advanced high-performance bus。

下面配置APB1时钟频率
APB1总线分频
注意:APB1时钟频率最高只能配置为36MHz,所以我只能配置为100,即二分频,36MHz。
PCLK1时钟
PCLK1:APB1低速总线时钟,最高为36M。为APB1总线的外设提供时钟。2倍频之后则为APB1总线的定时器2-7提供时钟,最大为72M。

下面配置APB2时钟频率
APB2时钟频率
APB2没有限制,配置为0xx,即不分频,72MHz。
PCLK2时钟
PCLK2:APB2高速总线时钟,最高为72M。为APB1总线的外设提供时钟。为APB1总线的定时器1和8提供时钟,最大为72M。

定时器2~7时钟频率
STM32中文参考手册6.2
我APB1预分频系数设置为2,36MHz,TIMXCLK要将36MHz*2,即TIMXCLK为72MHz。

定时器1、8时钟频率
STM32中文参考手册6.2
我APB2预分频系数设置为1,72MHz,TIMXCLK频率不变,即TIMXCLK为72MHz。

ADC时钟频率
STM32中文参考手册6.2
ADCCLK最大14MHz,APB2时钟频率为72MHz,所以ADC分频器要选择/6,即ADCCLK为72/6=12MHz。

RTC时钟

RTC时钟:为芯片内部的RTC外设提供时钟。
来源:HSE_RTC(HSE分频得到)、LSE(外部32.768KHZ的晶体提供,通常选择这个)、LSI(32KHZ)。
正点精英版原理图

MCO

MCO:microcontroller clock output,微控制器时钟输出引脚,由PA8复用所得。
STM32中文参考手册6.2
STM32中文参考手册6.3.2
配置PCC_CFGR:MCO

CSS

在这里插入图片描述

在这里插入图片描述

CSSI使能了:如果HSE时钟发生故障, HSE振荡器被自动关闭,时钟失效事件将被送到高级定时器(TIM1和
TIM8)的刹车输入端,并产生时钟安全中断CSSI,允许软件完成营救操作。此CSSI中断连接到Cortex™-M3的NMI中断(不可屏蔽中断)。

刹车输入端
 STM32中文参考手册13.1
营救操作:可以紧急保存一些重要数据、开机重启、切换到HSI时钟(在PLLSRC时配置为HSI的8MHz/2,PLLMUL选择*16,SYSCLK64MHz,一些外设仍然可以工作)、

CSSI没有使能:如果HSE振荡器被直接或间接地作为系统时钟, (间接的意思是:它被作为PLL输入时钟,并且PLL时钟被作为系统时钟),时钟故障将导致系统时钟自动切换到HSI振荡器,同时外HSE振荡器被关闭。在时钟失效时,如果HSE振荡器时钟(被分频或未被分频)是用作系统时钟的PLL的输入时钟, PLL也将被关闭。这时,SYSCLK直接用HSI的8MHz。

系统时钟配置函数

static void SetSysClockTo72(void)
{
   
  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
  
  /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/    
  /* Enable HSE */    
  RCC->CR |= ((uint32_t)RCC_CR_HSEON);
 
  /* Wait till HSE is ready and if Time out is reached exit */
  do
  {
   
    HSEStatus = RCC->CR & RCC_CR_HSERDY;
    StartUpCounter++;  
  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));

  if ((RCC->CR & RCC_CR_HSERDY) != RESET)
  {
   
    HSEStatus = (uint32_t)0x01;
  }
  else
  {
   
    HSEStatus = (uint32_t)0x00;
  }

  if (HSEStatus == (uint32_t)0x01)
  {
   
    /* Enable Prefetch Buffer */
    FLASH->ACR |= FLASH_ACR_PRFTBE;

    /* Flash 2 wait state */
    FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
    FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;    

 
    /* HCLK = SYSCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
      
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值