秉火429笔记之八 RCC时钟

本文详细介绍了STM32的RCC(Reset Clock Control)功能,包括RCC的作用、时钟树结构、编程要点及源码实例。重点讲解了HSE、HSI、PLL的工作原理以及系统时钟、AHB、APB总线时钟的配置,还提到了如USB、RTC等外设的时钟需求和MCO时钟输出。

目录

1. RCC 作用概述

2. RCC框图剖析—时钟树

3. 编程要点

4. 源码实例


1. RCC 作用概述

RCC :reset clock control 复位和时钟控制器。

设置系统时钟SYSCLK、设置AHB分频因子(决定HCLK等于多少)、设置APB2分频因子(决定PCLK2等于多少)、设置APB1分频因子(决定PCLK1等于多少)、设置各个外设的分频因子;控制AHB、APB2和APB1这三条总线时钟的开启、控制每个外设的时钟的开启。对于SYSCLK、HCLK、PCLK2、PCLK1这四个时钟的配置一般是:HCLK = SYSCLK=PLLCLK = 180M,PCLK1=HCLK/2 = 90M,PCLK1=HCLK/4 = 45M。如果需要使用USB,HCLK=168M为宜。

2. RCC框图剖析—时钟树

                                                          数据手册F429 时钟树

  • HSE 高速外部时钟信号

外部时钟信号,可由有源晶振或无源晶振提供,频率范围 4-26MHZ。若使用HSE作为时钟源,当HSE故障时,将会切换到HSI,直到HSE恢复正常,HSI=16MHZ.

  • 锁相环PLL

PLL的主要作用是对时钟进行倍频,然后把时钟输出到各个功能部件。PLL有两个,一个是主PLL,另外一个是专用的PLLI2S,他们均由HSE或者HSI提供时钟输入信号.

主PLL有两路的时钟输出,第一个输出时钟PLLCLK用于系统时钟,F429里面最高是180M,第二个输出用于USB OTG FS的时钟(48M)、RNG和SDIO时钟(<=48M)。专用的PLLI2S用于生成精确时钟,给I2S提供时钟。

HSE或者HSI经过PLL时钟输入分频因子M(2~63)分频后,成为VCO的时钟输入,VCO的时钟必须在1~2M之间,我们选择HSE=25M作为PLL的时钟输入,M设置为25,那么VCO输入时钟就等于1M.

VCO输入时钟经过VCO倍频因子N倍频之后,成为VCO时钟输出,VCO时钟必须在192~432M之间。我们配置N为360,则VCO的输出时钟等于360M。如果要把系统时钟超频,就得在VCO倍频系数N这里做手脚。PLLCLK_OUTMAX = VCOCLK_OUTMAX/P_MIN = 432/2=216M,即F429最高可超频到216M。

VCO输出时钟之后有三个分频因子:PLLCLK分频因子p,USB OTG FS/RNG/SDIO时钟分频因子Q,分频因子R(F446才有,F429没有)。p可以取值2、4、6、8,我们配置为2,则得到PLLCLK=180M。Q可以取值4~15,但是USB OTG FS必须使用48M,Q=VCO输出时钟360/48=7.5,出现了小数这明显是错误,权衡之策是是重新配置VCO的倍频因子N=336,VCOCLK=1M*336=336M,PLLCLK=VCOCLK/2=168M,USBCLK=336/7=48M,细心的读者应该发现了,在使用USB的时候,PLLCLK被降低到了168M,不能使用180M,这实乃ST的一个奇葩设计。因此,通常对时钟无高速需求的情况下,配置为168M为宜。

  • 系统时钟SYSCLK
<think>首先,用户的问题是:“我想理解RCC开启时钟的含义及其在嵌入式系统中的作用 请问RCC启用时钟的功能和原理是什么” 根据系统级指令,我需要: - 所有行内数学表达式使用 $...$ 格式。 - 独立公式使用 $$...$$ 格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如:[^1] - 回答结构清晰,帮助用户逐步解决问题,尽量保证回答真实可靠。 参考提供的引用: - 引用[1]:关于RCC控制外设时钟以降低功耗。 - 引用[2]:关于STM32时钟树的笔记,提到LSE、LSI等时钟。 - 引用[3]:关于SystemInit函数配置时钟的代码示例。 用户的问题是关于RCC开启时钟的含义、功能和原理。RCC是Reset and Clock Control的缩写,在STM32等微控制器中负责管理时钟系统。 关键点: - 开启时钟:意味着使能某个外设或系统模块的时钟源,使其能够工作。 - 功能:降低功耗(通过禁用未使用外设的时钟),确保系统正确运行。 - 原理:RCC模块控制时钟树,包括源时钟(如HSE、HSI、LSE、LSI)、分频器、倍频器等,为CPU、总线和外设提供时钟信号。 我需要构建一个结构清晰的回答: 1. **解释RCC开启时钟的含义**:简要说明开启时钟是什么。 2. **功能**:列出主要功能,如功耗管理、性能优化。 3. **原理**:解释时钟树的基本原理,如何配置时钟。 4. **作用**:在嵌入式系统中的作用,如确保实时性、减少能耗。 5. **代码示例**:引用提供的代码片段来展示实际配置。 6. **生成相关问题**:在回答末尾添加相关问题。 使用中文回答。 确保LaTeX语法正确:如果有数学表达式,比如分频计算,使用$...$或$$...$$。但在这个上下文中,可能没有复杂的数学,但如果有,比如计算时钟频率,可以使用。 例如,如果提到分频比,可以写:分频比 $Div$。 在引用部分,自然地添加引用标识。例如,在解释时提到引用内容。 参考用户上一次的问题:用户上次的问题是关于RCC开启时钟的含义和作用,所以我需要基于此回答。 结构: - 引言:概述RCC。 - 含义:解释开启时钟。 - 功能:详细功能。 - 原理:工作原理。 - 作用:在系统中的作用。 - 示例:引用代码。 - 相关问题。 生成相关问题:基于主题,如时钟配置、功耗优化等。</think>### RCC开启时钟的含义、功能与原理 在嵌入式系统中,RCC(Reset and Clock Control,复位与时钟控制)是微控制器(如STM32)的核心模块,负责管理整个系统的时钟源和时钟分配。用户询问的“RCC开启时钟”指的是通过RCC模块使能(enable)某个外设或系统模块的时钟源,使其能够接收时钟信号并正常工作。这类似于为电子设备“上电”,但更精确地说是提供时序控制的基础。下面我将逐步解释其含义、功能、原理及作用,确保回答基于真实可靠的嵌入式系统知识(参考STM32系列微控制器的文档和常见实践)。 #### 1. **RCC开启时钟的含义** - **基本含义**:开启时钟是指通过RCC寄存器配置,使某个外设(如GPIO、USART或ADC)或系统模块(如CPU总线)的时钟源被激活。默认情况下,许多外设时钟是禁用的,以节省功耗;开启后,该外设才能响应指令并执行操作。例如,开启GPIOA端口的时钟后,才能读写其引脚状态。 - **为什么需要开启时钟**:在嵌入式系统中,时钟是时序控制的基础。每个操作(如数据传输或中断处理)都需要时钟信号来同步。如果未开启时钟,外设将处于“冻结”状态,无法工作。这类似于关闭水龙头以停止水流:开启时钟就是“打开水龙头”,让数据流和逻辑操作得以进行[^1]。 #### 2. **RCC开启时钟的功能** RCC开启时钟的主要功能集中在功耗管理、性能优化和系统可靠性上: - **功耗管理**:RCC可以独立控制每个外设的时钟使能或禁用。当外设不使用时,禁用其时钟可以显著降低动态功耗(因为时钟树停止向该外设提供信号)。例如,在低功耗模式下,禁用未使用的USART或SPI接口时钟,可使系统功耗降低20-50%[^1]。 - **性能优化**:通过配置时钟源和分频器,RCC确保系统运行在最佳频率。例如,开启高速外部时钟(HSE)并倍频到72MHz,可提升CPU处理速度;同时,为低速外设(如I2C)配置较低分频比,避免资源浪费。 - **系统初始化与可靠性**:在启动时,RCC负责初始化时钟树(如引用[3]中的`SystemInit`函数),确保所有模块同步工作。开启时钟前,系统会检查时钟源稳定性(如等待HSE稳定),防止因时钟不稳导致的崩溃或错误[^3]。 - **模块化控制**:RCC支持细粒度控制,例如只开启GPIOB时钟而不影响GPIOA,这便于调试和维护[^1]。 #### 3. **RCC开启时钟的原理** RCC的工作原理基于“时钟树”(Clock Tree)结构,这是一个多级时钟分配网络。以下是核心原理的简化解释(涉及数学表达式时使用LaTeX格式): - **时钟源**:RCC管理多个时钟源,包括: - 高速内部时钟(HSI):默认源,频率约8MHz。 - 高速外部时钟(HSE):外部晶振提供,如8MHz。 - 低速内部时钟(LSI):用于看门狗或RTC,约40kHz。 - 低速外部时钟(LSE):外部32.768kHz晶振,用于精准计时[^2]。 - 这些源通过多路选择器(MUX)输入到时钟树中。 - **时钟分配与配置**:时钟信号经过分频(Divider)和倍频(PLL)处理,分配给不同模块。例如: - **分频计算**:如果HSE为8MHz,PLL倍频因子为9,则系统时钟频率 $f_{\text{sys}}$ 可计算为: $$ f_{\text{sys}} = f_{\text{HSE}} \times \text{PLLMul} = 8 \times 9 = 72 \, \text{MHz} $$ 然后,通过AHB分频器(如 $Div_{\text{AHB}}$)分配给总线,例如APB1分频为 $f_{\text{sys}} / 2$[^3]。 - **开启时钟的寄存器操作**:RCC通过一组寄存器(如`RCC_AHB1ENR`或`RCC_APB2ENR`)控制时钟使能。每个位对应一个外设;设为1时开启时钟,0时禁用。例如,开启USART1时钟的代码类似: ```c RCC->APB2ENR |= RCC_APB2ENR_USART1EN; // 设置USART1时钟使能位 ``` 这会在硬件层面激活时钟信号路径。 - **稳定性与同步**:开启时钟前,RCC会检查源时钟是否稳定(如引用[3]中的`RCC_WaitForHSEStartUp()`),避免系统故障。原理上,时钟信号必须满足时序要求,例如建立时间(setup time)和保持时间(hold time),以确保数据传输可靠[^2][^3]。 #### 4. **在嵌入式系统中的作用** RCC开启时钟的作用是确保系统高效、可靠运行: - **降低功耗**:在电池供电设备(如IoT传感器)中,动态禁用未用外设时钟是节能的关键策略,可延长电池寿命。 - **提升实时性**:通过精确配置时钟频率(如为定时器开启高速时钟),支持实时任务(如PWM控制)。 - **系统安全**:时钟控制防止了外设冲突;例如,在错误状态下禁用时钟可避免总线锁死。 - **启动过程**:在复位后,RCC自动初始化时钟树(参考`SystemInit`函数),使系统从默认状态快速进入工作模式[^3]。 #### 5. **实际代码示例** 以下代码片段基于引用[3],展示了如何在STM32中开启时钟(以SystemInit函数为例)。该函数在启动时调用,配置HSE并开启系统时钟: ```c void SystemInit(void) { RCC_DeInit(); // 复位RCC配置 RCC_HSEConfig(RCC_HSE_ON); // 开启HSE时钟 ErrorStatus HSEStartUpStatus = RCC_WaitForHSEStartUp(); // 等待HSE稳定 if (HSEStartUpStatus == SUCCESS) { FLASH_SetLatency(FLASH_Latency_2); // 设置Flash等待状态 RCC_HCLKConfig(RCC_SYSCLK_Div1); // 配置AHB时钟分频(不分频) RCC_PCLK2Config(RCC_HCLK_Div1); // 配置APB2时钟分频 RCC_PCLK1Config(RCC_HCLK_Div2); // 配置APB1时钟分频(分频为一半) RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); // PLL配置:8MHz * 9 = 72MHz RCC_PLLCmd(ENABLE); // 开启PLL时钟 while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); // 等待PLL就绪 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); // 切换系统时钟源到PLL while (RCC_GetSYSCLKSource() != 0x08); // 确认时钟源切换成功 } } ``` 在此代码中: - `RCC_HSEConfig(RCC_HSE_ON)` 开启HSE时钟源。 - `RCC_PLLCmd(ENABLE)` 开启PLL倍频器时钟。 - 外设时钟(如USART)通常在用户代码中单独开启,例如 `RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE)`[^3]。 #### 总结 RCC开启时钟是嵌入式系统的基础操作,它通过控制时钟树的使能状态,实现功耗优化、性能提升和系统可靠性。理解其原理(时钟源、分频/倍频和寄存器控制)有助于设计高效固件。如果您有具体微控制器型号(如STM32F4),我可以提供更针对性的细节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值