前言

在 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 / ARMClangGCC(arm-none-eabi-gcc)
调试接口ST-Link / J-LinkST-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 MHzPH0(OSC_IN)、PH1(OSC_OUT)系统主时钟来源
LSE(Low Speed External)32.768 kHzPC14(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 kHzRTC 使用
主 PLL1 输入HSE选择外部时钟源
PLL1_M5除频系数
PLL1_N160倍频系数
PLL1_P2输出分频
系统主频 SYSCLK400 MHzCortex-M7 内核主频
AHB 时钟 HCLK200 MHz总线时钟
APB1 / APB2 / APB3 / APB4100 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 WS5 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 SourceInternal Regulator (LDO)使用内部 LDO 从 3.3V VDD 生成核心电压(VCORE),默认安全稳定。
Power Regulator Voltage ScaleScale 1 (VOS1)设置核心电压为约 1.2 V,对应系统最高主频 400 MHz。
Flash Latency(Wait States)4 WSFlash 访问等待周期,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 SourceHSE
PLL M5
PLL N160
PLL P2

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

(2)配置主要分频参数

名称建议值结果频率
D1CPRE1CPU = 400 MHz
HPRE (AHB)2HCLK = 200 MHz
APB1 Prescaler2PCLK1 = 100 MHz
APB2 Prescaler2PCLK2 = 100 MHz
APB3 / APB42PCLK3/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_DriverHAL 库底层驱动

查看函数:

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 核心人才招募,助力技术落地与开发者成长。

更多推荐