首页 > 其他分享 >STM32的时钟复位控制单元(RCU/RCC)技术介绍

STM32的时钟复位控制单元(RCU/RCC)技术介绍

时间:2024-10-08 14:18:21浏览次数:8  
标签:HAL HSE 复位 RCU STM32 RCC 外设 时钟

在嵌入式系统开发中,时钟管理和复位控制是确保微控制器稳定运行的关键因素。时钟复位控制单元(Reset and Clock Control, RCU/RCC) 是 STM32 系列微控制器中的一个重要外设,负责管理系统的时钟源、分频器、外设时钟以及复位功能。本文将详细介绍 STM32 的 RCU/RCC 技术,包括其主要功能、时钟树结构、配置方法、复位机制以及实际应用中的注意事项。


一、RCU/RCC 概述

时钟复位控制单元(RCU/RCC) 是 STM32 微控制器中的一个核心外设,主要负责以下任务:

  1. 时钟源管理:选择和配置系统的主时钟源,如内部高速时钟(HSI)、外部高速时钟(HSE)、内部低速时钟(LSI)、外部低速时钟(LSE)等。
  2. 时钟分频与倍频:通过配置分频器和倍频器,调整系统时钟(SYSCLK)、外设时钟(APB1、APB2)和其他子系统的时钟频率。
  3. 外设时钟控制:为各个外设模块(如 GPIO、USART、SPI、I2C 等)提供时钟信号,并支持时钟使能和禁用以节省功耗。
  4. 复位控制:通过软件或硬件方式复位整个系统或特定外设,确保系统在异常情况下能够恢复正常运行。
  5. 时钟安全系统(CSS):监控外部时钟源的稳定性,在时钟源失效时自动切换到备用时钟源,防止系统崩溃。

二、RCU/RCC 的主要功能

1. 时钟源管理

STM32 微控制器支持多种时钟源,RCU/RCC 负责选择和配置这些时钟源:

  • 内部高速时钟(HSI):通常为 8 MHz,作为系统的默认时钟源。
  • 外部高速时钟(HSE):通过外部晶振或振荡器提供,通常用于需要高精度时钟的应用。
  • 内部低速时钟(LSI):通常为 32 kHz,用于看门狗定时器(IWDG)和实时时钟(RTC)。
  • 外部低速时钟(LSE):通常为 32.768 kHz,适用于 RTC 和低功耗应用。
2. 时钟分频与倍频

RCU/RCC 提供多种时钟分频器和倍频器,以满足不同外设和系统模块对时钟频率的需求。例如:

  • 预分频器(Prescaler):将主时钟频率降低到适合外设使用的频率。
  • 倍频器(PLL):通过相位锁定环(PLL)将主时钟频率提高,以实现更高的系统时钟(SYSCLK)。
3. 外设时钟控制

RCU/RCC 可以独立控制各个外设的时钟,使能或禁用外设时钟,以降低功耗。例如:

  • GPIO 时钟:控制 GPIOA、GPIOB 等端口的时钟。
  • 通信接口时钟:控制 USART1、SPI1、I2C1 等通信接口的时钟。
4. 复位控制

通过 RCU/RCC,可以对整个系统或单个外设进行复位操作,以确保系统在出现异常时能够恢复正常。例如:

  • 系统复位:复位整个微控制器。
  • 外设复位:复位特定的外设模块,如 USART、SPI 等。
5. 时钟安全系统(CSS)

CSS 监控外部时钟源(如 HSE)的稳定性,当外部时钟源失效时,自动切换到内部时钟源(如 HSI),确保系统持续运行。


三、RCU/RCC 的时钟树结构

理解 STM32 的时钟树结构对于正确配置 RCU/RCC 至关重要。以下是 STM32 时钟树的基本结构:

  1. 时钟源

    • HSI(内部高速时钟)
    • HSE(外部高速时钟)
    • LSI(内部低速时钟)
    • LSE(外部低速时钟)
  2. PLL(相位锁定环)

    • 输入时钟源(HSI、HSE)
    • 预分频器(PLLM)
    • 乘法器(PLLN)
    • 输出时钟(PLLCLK)
  3. 系统时钟(SYSCLK)

    • 可以选择 HSI、HSE、PLLCLK 作为 SYSCLK。
    • SYSCLK 通过 AHB 分频器(HCLK)分配给各个总线(如 APB1、APB2)。
  4. 外设时钟

    • APB1、APB2 总线时钟
    • 各外设时钟从 APB1、APB2 总线获取
  5. 实时时钟(RTC)时钟

    • 由 LSI 或 LSE 提供

四、RCU/RCC 的配置方法

STM32 的 RCU/RCC 配置可以通过标准外设库、HAL 库或 LL 库实现。以下以 STM32 的 HAL 库为例,介绍常见的时钟配置步骤。

1. 启用时钟源

首先,确保所需的时钟源已启用。例如,启用 HSE:

// 启用 HSE 时钟
__HAL_RCC_HSE_CONFIG(RCC_HSE_ON);

// 等待 HSE 稳定
while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET);
2. 配置 PLL

使用 PLL 来生成更高频率的时钟。例如,将 HSE 频率 8 MHz 通过 PLL 乘以 9,得到 72 MHz 的 SYSCLK:

RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

// 配置 PLL
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 8;
RCC_OscInitStruct.PLL.PLLN = 72;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLQ = 3;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
    // 初始化错误处理
    Error_Handler();
}

// 配置时钟分配
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK
                              | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
{
    // 初始化错误处理
    Error_Handler();
}
3. 配置外设时钟

启用需要使用的外设时钟。例如,启用 GPIOA 和 USART1 的时钟:

// 启用 GPIOA 时钟
__HAL_RCC_GPIOA_CLK_ENABLE();

// 启用 USART1 时钟
__HAL_RCC_USART1_CLK_ENABLE();
4. 配置实时时钟(RTC)

使用 LSE 作为 RTC 时钟源:

// 启用 PWR 时钟
__HAL_RCC_PWR_CLK_ENABLE();

// 允许访问备份域
HAL_PWR_EnableBkUpAccess();

// 启用 LSE 时钟
__HAL_RCC_LSE_CONFIG(RCC_LSE_ON);

// 等待 LSE 稳定
while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET);

// 配置 RTC 时钟源
__HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSE);

// 启用 RTC 时钟
__HAL_RCC_RTC_ENABLE();

五、RCU/RCC 的复位机制

RCU/RCC 提供了多种复位机制,确保系统在出现异常时能够恢复正常运行。

1. 系统复位

通过软件触发系统复位:

// 触发系统复位
__HAL_RCC_CLEAR_RESET_FLAGS();
HAL_NVIC_SystemReset();
2. 外设复位

复位特定外设,例如复位 USART1:

// 复位 USART1 外设
__HAL_RCC_USART1_FORCE_RESET();
__HAL_RCC_USART1_RELEASE_RESET();
3. 时钟安全系统复位

配置 CSS,当 HSE 时钟源失效时触发系统复位:

// 启用时钟安全系统
__HAL_RCC_CLOCKSUPPORT_ENABLE(RCC_CLOCKSUPPORT_CS);

六、常见配置示例

以下示例展示如何使用 STM32 HAL 库配置系统时钟为 72 MHz,并启用 GPIOA 和 USART1 的时钟。

#include "stm32f1xx_hal.h"

void SystemClock_Config(void)
{
    RCC_OscInitTypeDef RCC_OscInitStruct = {0};
    RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

    // 配置振荡器
    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
    RCC_OscInitStruct.HSEState = RCC_HSE_ON;
    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
    RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
    RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; // HSE 8MHz * 9 = 72MHz
    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
    {
        // 振荡器配置错误处理
        Error_Handler();
    }

    // 配置时钟分配
    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK
                                  | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; // 72 MHz
    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;       // HCLK = 72 MHz
    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;        // PCLK1 = 36 MHz
    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;        // PCLK2 = 72 MHz

    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
    {
        // 时钟分配配置错误处理
        Error_Handler();
    }
}

int main(void)
{
    // HAL 库初始化
    HAL_Init();

    // 配置系统时钟
    SystemClock_Config();

    // 启用 GPIOA 时钟
    __HAL_RCC_GPIOA_CLK_ENABLE();

    // 启用 USART1 时钟
    __HAL_RCC_USART1_CLK_ENABLE();

    // 其他应用代码
    while (1)
    {
    }
}

七、使用注意事项

  1. 时钟源稳定性:在切换或启用新的时钟源后,确保时钟源已稳定(如等待 HSE 稳定)再进行下一步配置。
  2. 时钟频率配置:根据微控制器的规格手册,确保配置的时钟频率在允许范围内,避免因过高频率导致微控制器不稳定。
  3. 外设时钟使能:仅使能实际需要使用的外设时钟,以降低功耗。
  4. 复位机制:在进行系统复位或外设复位时,确保复位后的系统能够正确重新初始化相关外设和时钟配置。
  5. 低功耗模式下的时钟配置:在进入低功耗模式前,合理配置时钟,以确保系统能够正确唤醒并恢复运行。
  6. 时钟安全系统配置:在关键应用中,启用 CSS 以提高系统的可靠性,防止主时钟源失效导致系统崩溃。

八、总结

STM32 的时钟复位控制单元(RCU/RCC)是微控制器中至关重要的外设,负责管理系统的时钟源、分频器、外设时钟以及复位功能。通过合理配置 RCU/RCC,开发者可以优化系统的时钟频率,确保外设正常运行,同时通过复位机制提高系统的可靠性。掌握 RCU/RCC 的配置方法和使用技巧,是成功开发 STM32 应用的基础。

无论是在高性能计算需求下配置 PLL,还是在低功耗应用中合理控制外设时钟,RCU/RCC 都提供了灵活的配置选项,满足各种嵌入式应用的需求。结合 STM32 的其他外设和功能,合理利用 RCU/RCC 的特性,能够设计出高效、稳定且可靠的嵌入式系统。

标签:HAL,HSE,复位,RCU,STM32,RCC,外设,时钟
From: https://blog.csdn.net/u012698191/article/details/142758797

相关文章

  • STM32的SPI技术介绍
    SPI(SerialPeripheralInterface,串行外设接口)是STM32微控制器中常用的高速同步串行通信协议之一。它广泛应用于与各种外设(如传感器、显示屏、存储器等)的数据交换。本文将详细介绍STM32的SPI技术,包括其基本概念、工作原理、配置方法及实际应用。一、SPI简介1.1什么是SPISPI......
  • STM32F1系列 HAL&LL中文注释库 适用于STM32F101 103 105等MCU 1.8.5版本
    *******下有更多展示图片********由于本汉化不改变官方文件的内容与结构,文档内的链接和官方的营销信息,很多的资源站对内容有检测无法上传,同时考虑这云盘、那博客的限速、会员、账号要求。此文档挂于淘宝,价格:19.9元(GPT回血)说明:机器人自动发货,蓝奏云不限速下载,保证图文......
  • [Javascript] Circular dependency
    Weoftenseecirculardependency,whyit'saproblem,whyweshouldavoiditandhwotoavoidit?  Let'sseeanyexamplefirst//main.jsimportAfrom"moduleA"//moduleA.jsimportBfrom"./moduleB"console.log("M......
  • STM32F407VGT6 HAL库系列——(2)点亮LED
    1、选芯片2、搜型号3、设置GPIO搜端口设置I/O类型I/O设置好后:4、RCC设置5、设置系统模式和配置6、设置时钟HCLK=SYSCLK=PLLCLK=168M(F407)180M(F429)(野火)PCLK1=HCLK/2=84M(F407)90M(F429)PCLK1=HCLK/4=42M(F407)45M(F429)7、设置项目名称、路径、开发环境类型8......
  • STM32F407VGT6 HAL库系列——(1)工具安装、环境设置
          前段时间在调试LAN8720,可以通信,但LAN8720始终不能进行中断接收数据,折腾了两天没啥进展,看到有用HAL库的说的感觉比较简单,那就试试?就安装STM32CubeMX结果点击“GENERATECODE”没反应...折腾N久后...解决...1、找到库的存放路径2、去官方下载库文件,解压后放在......
  • STM32单片机编程调试常见问题(二) Keil5软件调试中常见的配置问题
    文章目录一.概要二.‌Keil5‌调试时无法打断点并且部分代码语句执行被优化三.Keil5烧录STM32程序代码后无法自动复位四.Keil5调试时Watch界面中的变量不会实时更新五.Keil5编译后无法进行goto跳转到变量或函数六.Keil5编辑时注释输入中文显示乱码问号七.Keil5退出调试......
  • 基于STM32的智能门禁系统
    目录引言项目背景环境准备硬件准备软件安装与配置系统设计系统架构关键技术代码示例RFID数据采集与处理门禁控制实现显示与报警功能应用场景结论1.引言智能门禁系统在现代安防中占据重要地位,通常用于控制进入和离开特定区域的权限。通过基于STM32微控制器的智......
  • STM32出现HardFault_Handler故障的原因1. **内存溢出或访问越界** 2. **堆栈溢出**
    STM32出现HardFault_Handler故障的原因STM32系统中,HardFault_Handler故障主要有两个方面的原因:内存溢出或访问越界堆栈溢出最近我遇到的问题是栈溢出,情况如下:staticchardata[10000];voidfun1(unsignedchar*buf){inti=0;for(i=0;i<5000;i++)......
  • STM32
    元器件STM32F103C8T6面包板:硬件平台STLINK:下载程序与供电0.96寸OLED显示屏(4引脚)LED灯,按键(2引脚)USB转TTL串口:串口通信跳线,杜邦线,飞线蜂鸣器模块电位器:AD转换光敏模块:IO口读取、AD热敏模块对射式红外传感器:配合遮光片可计次,配合编码盘测速反射式红外传感器:循迹车-识别......
  • 【嵌入式裸机开发】基于stm32的照相机(OV7670摄像头、STM32、TFTLCD)
    基于STM32的照相机准备工作最终效果一、下位机1、主函数2、OV7670初始化二、上位机1、控制拍照2、接收图片数据准备工作一、硬件及片上资源:1,串口1(波特率:921600,PA9/PA10通过usb转ttl连接电脑,或者其他方法)上传图片数据至上位机2,串口2(波特率:115200,PA2/PA3......