前言

在 STM32 系列中,H7 系列(尤其是 STM32H743) 是性能最强的产品之一。它搭载 Cortex-M7 内核,理论主频高达 480 MHz,拥有三级 Cache、AXI 总线矩阵与双精度 FPU。
然而,在许多实际开发板(如 正点原子阿波罗 STM32H743IIT6(ATK- DNH743P V2))中,默认系统主频被配置为 400 MHz。这是出于稳定性、电源安全及兼容性方面的综合考虑。
本文介绍两种常见的开发方案,并系统说明时钟(RCC)配置的关键参数及其逻辑关系。
本文将深入解析 H743 的 时钟架构原理,并以两种常见的开发方案:STM32CubeMX + KeilSTM32CubeIDE演示如何完成主频 400 MHz 的时钟配置。

1 开发环境简介

1.1 开发环境对比

项目 方案一:STM32CubeMX + Keil MDK 方案二:STM32CubeIDE(内含 CubeMX)
环境构成 CubeMX 生成代码 → 导入 Keil 工程 CubeIDE 一体化环境,内嵌 CubeMX 配置
编译工具链 ARMCC / ARMClang GCC(arm-none-eabi-gcc)
调试接口 ST-Link / J-Link ST-Link / J-Link
配置保存方式 .ioc 文件 + Keil 工程文件 .ioc 文件 + Eclipse 工程文件
优点 工程结构清晰、便于兼容旧项目 一体化操作、自动生成初始化代码
典型用途 正式量产、对接已有 Keil 代码库 教学、快速原型、全自动代码生成

1.2 两种开发方案工作流程

(1)CubeMX + Keil

  1. 使用 CubeMX 配置时钟、外设,生成 Keil 工程
  2. 打开 Keil,编译下载程序
  3. 调试使用 ST-Link 接口

(2)CubeIDE

  1. 在 CubeIDE 中直接创建新工程(内置 CubeMX)
  2. 配置系统时钟、外设;
  3. 自动生成初始化代码并一键编译运行

2 准备工作(硬件与工具)

  • MCU/板卡:基于正点原子阿波罗 STM32H743 开发板
  • IDE:Keil MDK (版本V5.31,支持 H7 系列)
  • STM32CubeMX(用于生成初始化代码)
  • STM32CubeIDE(一体化操作、自动生成初始化代码 )

2 正点原子阿波罗开发板时钟方案

2.1 时钟源概览

正点原子阿波罗 STM32H743IIT6 的时钟系统采用 外部高速晶振HSE( 图1) 与 外部低速晶振LSE(图2) 作为主要时钟源.

在这里插入图片描述
图1 外部高速晶振HSE

在这里插入图片描述
图2 外部低速晶振LSE

根据原理图,可知该开发板主要使用以下两个外部时钟源:

时钟源 频率 连接管脚 用途
HSE(High Speed External) 25 MHz PH0(OSC_IN)、PH1(OSC_OUT) 系统主时钟来源
LSE(Low Speed External) 32.768 kHz PC14(OSC32_IN)、PC15(OSC32_OUT) RTC 实时时钟基准

除此之外,芯片还内部集成:

  • HSI(64 MHz):内部高速 RC 振荡器;
  • CSI(4 MHz):用于系统自校准与低功耗模式;
  • LSI(32 kHz):内部低速 RC 时钟。

在本方案中,系统主时钟来自外部 HSE,经 PLL1 倍频生成 400 MHz 系统时钟,而 LSE 用于 RTC 计时。

2.2 时钟系统架构

STM32H743 的时钟体系结构如下(简化示意):

在这里插入图片描述

图3 STM32H743 的时钟体系结构简化示意图

2.3 时钟配置目标(400 MHz)

本开发板时钟配置如下:

项目 参数 说明
外部高速晶振(HSE) 25 MHz 板载有源晶振
外部低速晶振(LSE) 32.768 kHz RTC 使用
主 PLL1 输入 HSE 选择外部时钟源
PLL1_M 5 除频系数
PLL1_N 160 倍频系数
PLL1_P 2 输出分频
系统主频 SYSCLK 400 MHz Cortex-M7 内核主频
AHB 时钟 HCLK 200 MHz 总线时钟
APB1 / APB2 / APB3 / APB4 100 MHz 外设时钟
电压模式 VOS1(1.2 V) 400 MHz 安全电压
Flash 延时 4 Wait States 匹配主频延时要求

计算验证:

PLL1P = (HSE / M) × N / P = (25 / 5) × 160 / 2 = 400 MHz

2.4 为何不是 480 MHz?

尽管 STM32H743 理论上支持 480 MHz,但正点原子选择 400 MHz 是基于以下考量:

对比项 400 MHz(默认) 480 MHz(极限)
电源电压要求 VOS1 模式(1.2 V) VOS0 模式(1.26 V)
系统稳定性 高,适合量产与教学 对供电、温度更敏感
功耗与发热 较低 略高约 15–20%
Flash 延时 4 WS 5 WS
外设兼容性 已优化 需重新配置时钟树
官方出厂默认

因此,400 MHz 是兼顾性能与稳定性的理想配置

3 CubeMX(CubeIDE 内含 CubeMX) 中的配置步骤

3.1 新建工程

在 CubeMX中新建工程,输入选择目标 MCU(STM32H743IIT6),暂时保留所有默认配置,点击开始工程按钮(如图4所示),进入MX设置界面。

在这里插入图片描述
图4 在 CubeMX 中新建工程

CubeIDE 中新建工程,输入选择目标 MCU(STM32H743IIT6),暂时保留所有默认配置,点击下一步按钮(如图5所示),进入工项目创建界面。
在这里插入图片描述
图5 在 CubeIDE 中新建工程

在工程创建界面输入项目名称,点击完成按钮,随后进入MX设置界面。

在这里插入图片描述
图6 CubeIDE工程创建界面

3.2 RCC(Reset and Clock Control)模式配置

在使用 STM32CubeMX 进行时钟配置之前,需要先完成 RCC(复位与时钟控制) 的基础设置。该部分定义了系统中可用的时钟源、供电方式与核心电压等级,是整个 时钟树(Clock Tree) 的根基。

(1)时钟源选择(Clock Source Selection)

项目 设置 说明
HSE(High-Speed External) Crystal/Ceramic Resonator 外部高速晶振,频率为 25 MHz,用于系统主时钟输入。
LSE(Low-Speed External) Crystal/Ceramic Resonator 外部低速晶振,频率为 32.768 kHz,用于 RTC(实时时钟)或低功耗计时。

(2)管脚定义说明(Clock Source Pin Definition)

根据正点原子阿波罗 STM32H743IIT6 开发板原理图:

时钟源 引脚 功能说明
HSE 晶振 PH0 (OSC_IN)PH1 (OSC_OUT) 接入 25 MHz 外部高速晶振,用作系统主时钟输入。
LSE 晶振 PC14 (OSC32_IN)PC15 (OSC32_OUT) 接入 32.768 kHz 外部低速晶振,为 RTC 提供时基。

💡 提示:CubeMX 在检测到启用 HSE 或 LSE 时,会自动将这些引脚锁定(灰色不可选),以防止与其他外设冲突。

在这里插入图片描述
图7 RCC模式设置:时钟源选择和管脚定义说明

(3)主要参数设置(Power & Voltage Configuration)

参数名称 推荐值 说明
Supply Source Internal Regulator (LDO) 使用内部 LDO 从 3.3V VDD 生成核心电压(VCORE),默认安全稳定。
Power Regulator Voltage Scale Scale 1 (VOS1) 设置核心电压为约 1.2 V,对应系统最高主频 400 MHz。
Flash Latency(Wait States) 4 WS Flash 访问等待周期,CubeMX 会根据主频与电压自动计算。
VCAP 电压 ≈ 1.2 V 内部 LDO 输出核心电压滤波节点,可在 VCAP1/VCAP2 引脚测量验证。

(4)参数配置说明

  • Supply Source 设为 Internal Regulator (LDO) 时,MCU 内部线性稳压器将外部 3.3V 转换为核心电压(VCORE)。
  • Power Regulator Voltage Scale 设为 VOS1 可安全支持 400 MHz 主频;若需 480 MHz,则需使用 Boost 模式(VOS0)。
  • Flash Latency 由 CubeMX 自动匹配,无需手动调整。
  • VCAP1VCAP2 是稳压输出节点,每个应接 2.2–4.7 µF 电容,以确保系统稳定。

3.3 配置时钟树

(1)配置 PLL1 参数

参数
PLL Source HSE
PLL M 5
PLL N 160
PLL P 2

PLL1 输出频率计算器 中确认:
PLL1P = 25 / 5 × 160 / 2 = 400 MHz

(2)配置主要分频参数

名称 建议值 结果频率
D1CPRE 1 CPU = 400 MHz
HPRE (AHB) 2 HCLK = 200 MHz
APB1 Prescaler 2 PCLK1 = 100 MHz
APB2 Prescaler 2 PCLK2 = 100 MHz
APB3 / APB4 2 PCLK3/4 = 100 MHz

(3)时钟树配置结果

界面切换到时钟树配置 Clock Configuration,按照PLL1 参数和其他主要分频参数,时钟树配置结果如图8所示。
在这里插入图片描述
图8 时钟树配置结果

3.4 生成代码

3.4.1 CubeMX生成Keil代码

(1)设置工程输出(生成 Keil 工程)

在这里插入图片描述图8 设置工程输出(生成 Keil 工程)

  1. 在主界面点击 「Project Manager」 标签页。
  2. 在左侧导航中选择 「Project」 子项。
  3. 按如下填写:
项目 说明 示例
Project Name 工程名称 CfgClk-Keil
Project Location 工程路径 C:\stm32-demo\Keil
Toolchain / IDE 输出工具链类型 ✅ 选择 MDK-ARM (Keil uVision)
Application Structure 代码结构 建议选 Advanced(代码更分层、清晰)
  1. 返回主界面,点击右上角 ⚙️ Generate Code 生成代码。
    CubeMX 会自动创建:

    MDK-ARM/CfgClk-Keil.uvprojx
    

    这是可直接用 Keil 打开的工程文件。

💡 提示:

  • 如果选错了 IDE 类型(例如默认是 STM32CubeIDE),可以随时回来修改为 MDK-ARM 再重新生成。
  • 修改后会保留原有配置,不会丢失你的时钟、引脚和外设设置。
(2)Keil 中验证配置

打开生成的 .uvprojx 工程后,找到:

Core/Src/main.c

main() 函数中可看到 CubeMX 自动调用的初始化流程:

int main(void)
{

  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MPU Configuration--------------------------------------------------------*/
  MPU_Config();

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

SystemClock_Config() 内容示例

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

  /** Supply configuration update enable
  */
  HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);

  /** Configure the main internal regulator output voltage
  */
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

  while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  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 = 5;
  RCC_OscInitStruct.PLL.PLLN = 160;
  RCC_OscInitStruct.PLL.PLLP = 2;
  RCC_OscInitStruct.PLL.PLLQ = 2;
  RCC_OscInitStruct.PLL.PLLR = 2;
  RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;
  RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
  RCC_OscInitStruct.PLL.PLLFRACN = 0;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
                              |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;
  RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    Error_Handler();
  }
}

3.4.2 CubeIde生成代码

(1)生成代码的基本步骤
  • 方法1 保存工程配置生成代码

    • 点击菜单栏:File → Save,或者点击工具栏上的 💾 保存图标,CubeIDE 会提示是否生成代码,点击Yes,代码会自动生成。
  • 方法2 点击顶部工具栏图标生成代码
    点击顶部工具栏的齿轮图标:
    在这里插入图片描述

(2)工程验证

代码生成后,打开 STM32CubeIDE 工程。
CubeIDE 会自动包含 CubeMX 生成的初始化代码,主要文件如下:

文件路径 说明
Core/Src/system_stm32h7xx.c 系统时钟初始化
Core/Src/main.c 主函数入口,调用 SystemClock_Config()
Drivers/STM32H7xx_HAL_Driver HAL 库底层驱动

查看函数:

void SystemClock_Config(void)

其中包含:

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

  /** Supply configuration update enable
  */
  HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);

  /** Configure the main internal regulator output voltage
  */
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

  while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  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 = 5;
  RCC_OscInitStruct.PLL.PLLN = 160;
  RCC_OscInitStruct.PLL.PLLP = 2;
  RCC_OscInitStruct.PLL.PLLQ = 2;
  RCC_OscInitStruct.PLL.PLLR = 2;
  RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;
  RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
  RCC_OscInitStruct.PLL.PLLFRACN = 0;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
                              |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;
  RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    Error_Handler();
  }
}

这段代码即是 CubeMX 在 CubeIDE 中自动生成的时钟配置逻辑。

总结

STM32H743 的时钟系统虽复杂,但掌握其逻辑后,配置就非常灵活。
良好的时钟架构不仅能发挥 M7 内核的极致性能,也能让系统稳定运行。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐