STM32的RCC原理(复位和时钟控制)

基本概念

STM32微控制器的RCC(Reset and Clock Control)模块是一个非常重要的部分,它负责管理微控制器的时钟系统和复位系统。以下是一些基本的原理和概念:

  1. 时钟源:STM32微控制器的时钟系统有多个时钟源,包括内部的HSI(High Speed Internal)时钟,外部的HSE(High Speed External)时钟,以及PLL(Phase-Locked Loop)时钟。这些时钟源可以根据需要进行选择和配置。

  2. 时钟树:STM32微控制器的各个模块和外设都通过一个复杂的时钟树与时钟源相连。RCC模块负责管理这个时钟树,包括使能或禁止各个外设的时钟,以及配置各个外设的时钟分频。

  3. 复位系统:RCC模块还负责管理微控制器的复位系统。当微控制器发生错误或异常时,如电源故障、系统错误等,复位系统可以将微控制器重置到初始状态,以保证系统的稳定运行。

  4. 配置和控制:RCC模块提供了一系列的寄存器,用于配置和控制时钟系统和复位系统。通过编写这些寄存器,我们可以选择时钟源,配置时钟分频,使能或禁止外设的时钟,以及控制复位系统。

时钟源选择

  1. HSI(High-Speed Internal):这是一种内部高速时钟源,通常在8MHz左右。它是STM32微控制器的默认时钟源之一。

  2. HSE(High-Speed External):这是一种外部高速时钟源,通常通过外部晶体振荡器或时钟信号提供。它可以提供更高的时钟精度和稳定性。

  3. LSI(Low-Speed Internal):这是一种内部低速时钟源,通常在32kHz左右。它主要用于低功耗和低速应用

  4. LSE(Low-Speed External):这是一种外部低速时钟源,通常通过外部晶体振荡器或时钟信号提供。它主要用于低功耗和低速应用

STM32时钟树示意图

           ┌──────────────────────┐
           │       HSE (外部)      │
           └──────────────────────┘
                     │
                     ▼
           ┌──────────────────────┐
           │      PLL (锁相环)     │
           └──────────────────────┘
                     │
                     ▼
           ┌──────────────────────┐
           │      SYSCLK (系统时钟) │
           └──────────────────────┘
                     │
                     ▼
           ┌──────────────────────┐
           │      AHB (高速总线)   │
           └──────────────────────┘
                     │       |
                     ▼       │
                              ---------  ▼
           ┌──────────────────────┐      ┌──────────────────────┐
           │      APB2 (高速总线)  │      │      APB1 (低速总线)  │
           └──────────────────────┘       └──────────────────────┘
                                          
                       
    
  1. HSE (外部时钟源):HSE是一种外部高速时钟源,通常通过外部晶体振荡器或时钟信号提供。它可以提供更高的时钟精度和稳定性。

  2. PLL (锁相环):PLL是一个模块,可以通过倍频来生成高速时钟。它通常可以选择HSE或HSI作为输入时钟源,并通过配置倍频因子来生成所需的高速时钟。生成的时钟称为SYSCLK。

  3. SYSCLK (系统时钟):SYSCLK是STM32微控制器的系统时钟,它驱动整个微控制器的运行。它的频率取决于PLL的配置和倍频因子。

  4. AHB (高速总线):AHB是STM32微控制器的高速总线,用于连接主要的内部总线和外设。它的时钟频率通常等于SYSCLK,但可以通过时钟分频器进行分频。

  5. APB1 (低速总线):APB1是STM32微控制器的低速总线,用于连接一些低速外设。它的时钟频率通常是AHB时钟频率的一半,但也可以通过时钟分频器进行进一步分频。

  6. APB2 (高速总线):APB2是STM32微控制器的高速总线,用于连接一些高速外设。它的时钟频率通常等于AHB时钟频率,但也可以通过时钟分频器进行分频。

代码实例

这段代码是STM32F1系列微控制器的系统时钟配置函数,目标是将系统时钟配置为72MHz。

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); // 启动HSE(高速外部)振荡器
 
  /* Wait till HSE is ready and if Time out is reached exit */
  do
  {
    HSEStatus = RCC->CR & RCC_CR_HSERDY; // 等待HSE准备就绪
    StartUpCounter++;  
  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); // 如果HSE没有准备就绪,并且没有超时,则继续等待

  if ((RCC->CR & RCC_CR_HSERDY) != RESET)
  {
    HSEStatus = (uint32_t)0x01; // HSE准备就绪
  }
  else
  {
    HSEStatus = (uint32_t)0x00; // HSE没有准备就绪
  }  

  if (HSEStatus == (uint32_t)0x01) // 如果HSE准备就绪
  {
    /* Enable Prefetch Buffer */
    FLASH->ACR |= FLASH_ACR_PRFTBE; // 启用预取指缓冲区

    /* Flash 2 wait state */
    FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY); // 清除Flash访问延迟设置
    FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;    // 设置Flash访问延迟为2个周期

    /* HCLK = SYSCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1; // 设置AHB时钟(HCLK)分频系数为1,即HCLK=SYSCLK
      
    /* PCLK2 = HCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1; // 设置APB2时钟(PCLK2)分频系数为1,即PCLK2=HCLK
    
    /* PCLK1 = HCLK/2 */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2; // 设置APB1时钟(PCLK1)分频系数为2,即PCLK1=HCLK/2

    /*  PLL configuration: PLLCLK = HSE * 9 = 72 MHz */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL)); // 清除PLL配置
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9); // 设置PLL的输入为HSE,并设置PLL倍频系数为9,即PLLCLK=HSE*9=72MHz

    /* Enable PLL */
    RCC->CR |= RCC_CR_PLLON; // 启动PLL

    /* Wait till PLL is ready */
    while((RCC->CR & RCC_CR_PLLRDY) == 0) // 等待PLL准备就绪
    {
    }
    
    /* Select PLL as system clock source */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); // 清除系统时钟源设置
    RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;    // 设置系统时钟源为PLL

    /* Wait till PLL is used as system clock source */
    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08) // 等待PLL作为系统时钟源
    {
    }
  }
  else
  { 
    /* If HSE fails to start-up, the application will have wrong clock 
         configuration. User can add here some code to deal with this error */
    // 如果HSE启动失败,那么应用程序的时钟配置将会出    /* If HSE fails to start-up, the application will have wrong clock 
         configuration. User can add here some code to deal with this error */
    // 如果HSE启动失败,那么应用程序的时钟配置将会出错。用户可以在这里添加一些代码来处理这种错误。
  }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值