只读分享解决方案文档原理方案设计📅 2026-10-14🔖 Rev1.42⏳ 还有3日到期
🔧解决方案&应用市场分析 -> 原理方案设计 -> 主芯片方案调试开发 -> 小华HC32_开发指南

小华HC32_开发指南

同系列 · 原理方案设计
扫码打开本页
微信扫码

小华半导体 HC32 开发指南

编制日期 2026-10-14

从 DDL 包装不起来、启动文件 missing、时钟配不到目标频率、SWD 被占用锁死,一路到量产烧录、QSPI 外挂存储与三相 FOC —— 一份把「第一次上手会踩的坑」全部前置的工程手册

14 条
产品子线 / 四大类别
F 通用 · L 低功耗 · M 电机 · A 车规
240 MHz
F4A0 旗舰主频
2MB Dual-bank / 516KB SRAM
2MB
最大片上 Flash
双 Bank,支持运行中编程
0.5 µA
L136 深度休眠电流
+ RTC 时 0.9µA,唤醒 4µs
无 CubeMX
没有官方图形化配置器
工程配置靠手工改代码
2 线
调试口只需 SWD
SWDIO / SWCLK 两根信号

结论:HC32 是国产 MCU 里模拟外设密度与电机 PWM 能力最突出的一支—— 小华把大量资源压在 PGA / OPA / CMP / 高 MSPS ADC 与互补 PWM 上,空调室外机、洗衣机、变频电机、数字电源这类场景的性价比明显优于同主频竞品。 但上手门槛有三个真实的坎:① 官方 DDL 包只给工程容器不给启动文件,Keil 新工程必然报 missing startup file;② 没有 CubeMX 式配置器,时钟树得照着 CMU 手册一格格算;③ GPIO 必须 PORT_Init() 与 PORT_SetFunc() 成对调用,只调前者引脚完全没反应。 本文按「装环境 → 建工程 → 编译 → 下载 → 调试 → 跑业务 → 量产」的真实顺序组织,每一段都给出可复制的命令、可对照的表格、以及该段最常踩的坑。

报告总结

小华的资料在官网分得很细:数据手册(DS)讲电气与引脚、参考手册(RM)讲寄存器、DDL 驱动库含几十个外设模块与例程,而 Keil DFP 又是独立的 .pack 安装包。网上的中文教程绝大多数停留在「装 DFP → 新建工程 → 点编译 → 点下载」,一旦遇到启动文件找不到、引脚没反应、时钟配不出 200MHz、串口 DMA 收不到数据就无解。本文档做了三件官方分散文档没有做的事:

  • 把分散在官网、DS、RM、DDL、社区博客里的事实合并成一份可检索清单,并逐条标注「已核实 / 社区口径 / 待核」,避免把博客里的猜测当规格书用。
  • 把「症状 → 原因 → 处置」写成可查的表:22 条高频故障按编译期 / 烧录期 / 运行期分层,每条给根因与最小验证动作。
  • 专门补齐外挂存储与电机控制两条实战线:QSPI 接 SPI NOR 的引脚落点与 XIP 窗口、SDIO 挂 SD NAND / eMMC 的资源预算、三相 FOC 对定时器与模拟通道的占用清单。

读者路径

本指南按「你现在卡在哪一步」组织,不必从头读:

HC32 开发的五段式流水线 —— 每一段做完都要有一个「能验收的标志」上一段没配对,下一段的症状一定伪装成别的东西① 硬件最小系统 / 评估板SWD 两根线 + 电源验收标志 ↓② 环境DDL 包 + Keil DFP能建空工程并编译验收标志 ↓③ 构建启动文件 / 链接脚本产出 .axf / .hex验收标志 ↓④ 下载J-Link / CMSIS-DAP提示下载成功验收标志 ↓⑤ 调试断点 / printf能停在 main()验收标志 ↓本指南的写法:每一段都给「症状 → 原因 → 处置」三元组第 6~7 章走完流水线的中段;第 8~15 章是跑起来之后的外设与系统细节;第 16~20 章是安全、硬件、移植与方案。
图 1 · HC32 开发的五段式流水线与本文档的组织逻辑
HC32 与 STM32 的兼容边界:内核兼容,外设与命名必须重写兼容的是指令集与 CMSIS 规范,不是寄存器与启动文件✓ 可以直接复用Cortex-M 指令集与 CMSIS 规范应用层算法与业务逻辑FreeRTOS / 第三方中间件移植层USB / 以太网协议栈同一系列内换料(Flash 档位)✗ 必须重写(否则跑不起来)RCC → CMU 时钟树与配置流程GPIO 两步走:PORT_Init + PORT_SetFunc启动文件与 144 路私有向量表DMA → DMAC 通道与触发源映射时钟门控 PWC_FCG + AOS 依赖△ 结构性差异没有 CubeMX 式配置器只有三种低功耗模式定时器分 4 个家族 8 类POER / POTR 专属寄存器QSPI 不支持外部启动
图 2 · HC32 与 STM32 的兼容边界:内核兼容、外设重写
路径 A
第一次用这家的芯片
第 2 章选型 → 第 4 章环境 → 第 5 章第一个工程 → 第 6 章下载。目标是一小时内看到 LED 亮且能断点。
对应对象:评估板首用、工程评审前
从 STM32 迁过来
第 3 章命名逻辑 → 第 8 章 GPIO 两步法 → 第 10 章 CMU 时钟树 → 第 18 章完整移植清单。目标是让老 BSP 重新编译并跑到主循环。
对应对象:国产替代立项
做电机或数字电源
第 11 章定时器家族与互补死区 → 第 12 章模拟外设 → 第 17.5 节布线要点 → 第 20.4 节 FOC 资源预算。
对应对象:空调外机、洗衣机、变频板
外挂存储芯片
第 14 章 QSPI 与 XIP → 第 20 章方案章节(NOR / SD NAND / eMMC 接法与验证清单)。
对应对象:SPI NOR、SD NAND、eMMC 应用
赶产线出不来货
第 6.3 节脱机烧录 → 第 6.4 节读保护 → 第 17.3 节 SWD 量产保护 → 附录 E 核查清单。
对应对象:量产与工艺评审
做低功耗电池产品
第 15 章三种低功耗模式 → 第 15.4 节 PD1~PD4 → 第 15.5 节实战清单。注意没有 Standby 档。
对应对象:表计、传感器节点
本文档编写日期 2026-10-08。所有参数以小华半导体官方数据手册为准,表格中标注「社区」的内容来自工程师实践帖,仅作参考,不作为设计依据。

1 · 文档导读与阅读路径

先说清楚这份文档管什么、不管什么,避免你在第 6 章卡住时回头翻第 20 章。

1.1 覆盖范围

覆盖以下型号与内容:

范围具体内容
通用控制 MCUHC32F0 / F1 / F334 / F4 全系列,重点 HC32F460(200MHz)与 HC32F4A0(240MHz)
超低功耗 MCUHC32L0 / L1,重点 HC32L136(M0+@48MHz,深度休眠 0.5µA)
电机与电源 MCUHC32M1 / M4 / HC32F334,含三相互补 PWM、编码器接口与霍尔捕获
汽车电子 MCUHC32A1 / A4 的定位与命名,仅作选型参考
软件体系DDL 驱动库结构、启动文件、链接脚本、CMU 时钟配置、GPIO 两步法、DMAC、中断向量表
工具链Keil MDK + HDSC.HC32F4xx_DFP、GCC + openEuler drv-frame、SWD 调试与量产脱机烧录
实战专题QSPI 外挂 SPI NOR 的 XIP、SDIO 挂载 SD NAND / eMMC、三相 FOC 资源预算、家电主变一体方案
怎么用这份文档

每章末尾的「本章要点」是可压缩成 3 条的结论;如果你是赶项目,直接看第 19 章故障排查速查表和附录 E 上手核查清单,其余按需检索。

1.2 不覆盖什么

为了避免误导,以下内容明确不在本文档范围内:

  • 寄存器位级参考。本文只列「哪个模块有哪些资源、配置顺序是什么」,具体位定义请查对应型号的参考手册(RM)。
  • 电气认证与安规。EMC/ESD 等级引用 DS 数值,但整机认证不在讨论范围。
  • 官方图形化配置工具。截至本文编写日期,本次核查未发现小华官方提供类似 STM32CubeMX 的配置与代码生成工具;若后续官网下载中心上线离线工具,以官方为准。
  • 车规 AEC-Q100 认证细节与 ISO 26262 功能安全流程。
  • 具体型号的完整料号表。本文只列代表性型号,量产选型请以官网选型表为准。

1.3 版本与命名约定

文中出现的三类词严格区分,别混用:

标注含义可信度使用建议
已核实来自官方 DS / RM / 官网产品页高可直接作为设计依据
社区来自工程师实践帖或开源仓库中参考即可,关键值必须回官方文档复核
待核本次未能证实低不要写进设计文档,先查 RM/UM

另外,厂商标识有个历史遗留:资料包、器件头文件与 Keil 器件包里的厂商前缀仍是 HDSC(华大半导体),而品牌已改为「小华半导体 / XHSC」。下载时不要因为 HDSC. 前缀而以为下错了厂商。

1.4 事实来源与免责

本文事实来源按优先级排序:

  1. 小华半导体官网产品线页与型号页(产品特性表、选型表);
  2. 官方数据手册:HC32F460 DS 版本号 Rev1.42/Rev1.60、HC32F4A0 DS Rev1.50/Rev1.60、HC32L13x DS Rev2.1;
  3. Keil MDK 官方器件页;
  4. openEuler drv-frame 开源仓库中的 HC32F460 平台移植层源码(DDL 版本宏、启动文件、链接脚本段名);
  5. 工程师实践帖(标记为「社区」,只用于补充工程经验)。
本文档的使用边界

数据手册会改版。本文引用的多为 Rev1.5~Rev1.6;量产前请到官网下载中心核对最新版 DS,重点核对:时钟精度表、电气电流表、封装引脚表、选型表中的 GPIO 数量。这几张表最容易在改版中变动。

本文不构成设计建议。量产项目请以你手上型号的最新版数据手册、参考手册与官方例程为唯一依据。

2 · HC32 家族全景与选型

先把「HC32 到底有多少个系列」这件事搞清楚,再谈型号选择。这一章的表是全文引用的基础。

2.1 一句话认识小华 HC32

小华半导体(XHSC)是中国的 32 位 MCU 供应商,产品线覆盖 Cortex-M0 / M0+ / M4 三个档次。它最有辨识度的地方不是主频,而是把大量模拟资源与电机 PWM 能力做进了中低端型号:

  • HC32F448(200MHz M4)能同时提供三相互补 PWM、3 单元 12bit 2.5MSps ADC、2 路 DAC 与 4 路比较器,实现「压缩机 + 风机 + 高频 PFC」三合一单芯片控制;
  • HC32L136(M0+@48MHz)在 64KB Flash / 8KB SRAM 的体量上放了 3 个运放、2 路带 6bit DAC 的电压比较器、LCD 驱动与 2 路可在深度休眠下工作的 LPUART,深度休眠 0.5µA;
  • HC32F4A0(240MHz M4)更极端:4 个 15MSPS DAC、4 个 PGA、8 个 DCU 协处理单元、数学协处理器 MAU 与 16 阶 FIR 滤波器。

理解了这个取向,选型逻辑就简单了:凡是「电机 + 模拟采样 + 成本敏感」的场景,先看小华有没有对口型号,往往比先看主频更有效。

2.2 命名规则怎么读

型号不是随机编码,拆开看基本能推出定位:

片段含义例子
HC32固定前缀HC32F460
第 4 位字母类别:F 通用 / L 超低功耗 / M 电机与电源 / A 汽车电子 / D 显示专用F / L / M / A
数字段性能档次:0 M0+ 超低成本 / 1 M0+ 主流 / 3 电机电源特色 / 4 M4 高性能HC32F4A0
尾部数字通常指 Flash 容量档:60 = 512KB;容量更大者另加后缀 A0(2MB)F460 → 512KB
引脚/温度码P=100 脚、K=64/60 脚、J=48/32 脚;T=LQFP 薄型、U=QFN、B=BGA;末位 A=工业温度扩展(-40~105℃)HC32F460PETB
容量与引脚码不要跨系列套用

「子系列别数字 ↔ Flash」「引脚码 ↔ 脚数」的映射在不同子系列之间并不一致。例如 F4A0 的尾号编码与 F460 不是同一套规则,跨系列套用会选错料。量产选型一律以对应型号 DS 的 Part numbering 表与官网选型表为准。

2.3 产品线总览

官网产品线页把 MCU 分成四大类共 14 条子线。选型时先定类别,再定档次:

官网分类子线内核 / 主频典型定位
通用控制HC32F0M0+ / 48MHz超低成本,小封装(QFN20/32)
通用控制HC32F1M0+ / 48MHz家电主控主力,型号最多
通用控制HC32F4M0+/M4 / 48~240MHz高性能通用平台,F460 与 F4A0 在此
通用控制HC32D3待核显示 / 专用方向,定位待官网确认
电机与电源HC32M1M0+ / 48MHz通用电机控制
电机与电源HC32M4M0+ / 120MHz带 Cache 与电机加速单元,高端电机
电机与电源HC32F334M4 / 84MHz数字电源专用,高分辨率 PWM + 运放/CMP
电机与电源HCM3043待核独立命名的电机/电源器件,不在 HC32 体系内
超低能耗HC32L0M0+ / 48MHz超低功耗入门
超低能耗HC32L1M0+ / 48MHz低功耗主流,LCD + LPUART + OPA
汽车电子HC32A1M4 / 48MHz车规入门,功能安全
汽车电子HC32A4M4 / 200~240MHz车规旗舰,对标 F4A0
选型的第一性问题

先问三件事:① 系统主频下限多少(决定 F1 还是 F4);② 需要几个高速 ADC 与互补 PWM(决定 F448 还是 F4A0);③ 生命周期与供货要求。前两问决定能不能用,第三问决定敢不敢用。

2.4 旗舰 F4A0:240MHz 与 2MB Dual-bank

HC32F4A0 是小华当前的性能天花板,2024 年获 AspenCore/IIC Shanghai 中国 IC 设计成就奖「年度最佳 MCU」,累计出货近 3000 万颗。关键特性(官方 DS Rev1.60):

项目参数
内核Cortex-M4 + FPU + MPU + SIMD DSP + 全指令跟踪 ETM + CoreSight
主频与算力240MHz,300DMIPS / 825 CoreMark
Flash最大 2048KB dual bank
SRAM最大 516KB,含 128KB 单周期访问高速 RAM
供电1.8~3.6V
模拟3×12bit 2.5MSPS ADC(三通道同时采样)+ 4×12bit 15MSPS DAC + 4 PGA + 4 CMP + 1 OTS
定时器32 个:8 Timer6 + 16 路 50ps HRPWM + 3 Timer4 + 12 TimerA + 4 Timer2 + 2 Timer0 + RTC + 2 WDT
通信最多 32 个接口:10 USART / 6 SPI / 6 I²C / 4 I²S / 2 SDIO / 1 QSPI / 2 CAN(含FD) / USB HS + FS / 1× 10-100M 以太网 MAC
协处理8 DCU + MAU(Sin/Sqrt)+ FMAC(16 阶 FIR)+ AOS 事件互触发
外部存储EXMC(静态 + 动态存储控制器)、DVP
GPIO最多 142 个,其中最多 134 个 5V 容忍;单端口支持多达 64 种外设功能
温度-40~105℃
多电机能力多通道模拟 + 高性能 PWM,可支撑 5 个电机 FOC
什么时候上 F4A0

需要以太网、CAN FD、USB HS、EXMC 挂外部 SRAM/SDRAM,或者需要 5 台以上电机 FOC 时,F4A0 几乎是唯一选择。如果只是单相或三相单电机 + 少量通信,F460 + 外挂一颗栅极驱动就能完成,BOM 更低。

2.5 通用主力 F460:200MHz 的均衡之选

HC32F460 是出货面最广的通用 M4,官方 DS Rev1.42 的特性:

项目F460对比 F4A0
主频 / 算力200MHz,250DMIPS / 680 CoreMark240MHz,300DMIPS / 825 CoreMark
Flash最大 512KB(另有 256KB 档)最大 2048KB 双 Bank
SRAM最大 192KB(32KB 高速 + 4KB Retention)最大 516KB(128KB 高速)
ADC2×12bit 2MSPS3×12bit 2.5MSPS(可同时采样)
DAC2×8bit4×12bit 15MSPS
PGA / CMP1 PGA / 3 CMP4 PGA / 4 CMP
定时器14 个(含 3 Timer6 + 3 Timer4 + 6 TimerA + 2 Timer0)32 个(另加 Timer2 与 16 路 HRPWM)
CAN1 个 CAN 2.0B(ISO11898-1)2 个,含 CAN FD
USB1× USB 2.0 FS OTG(内置 PHY)USB HS + USB FS
以太网无1× 10/100M MAC(MII/RMII + PTP)
GPIO最多 83 个,最多 81 个 5V 容忍最多 142 个,最多 134 个 5V 容忍
DMAC8 通道双主机 + USBFS 专用16 通道双主机 + USBHS/FS/ETH 专用
F460 没有 CAN FD

这是最容易搞错的点之一:HC32F460 的 CAN 只支持 CAN 2.0B + TTCAN,不支持 CAN FD。CAN FD 需求必须上 F4A0。同时注意 F460 没有 Timer8(有些资料罗列了 8 类定时器,那是 F4A0 才有 Timer2 与 HRPWM)。

F460 官方选型表覆盖 5 种封装,脚数从 48 到 100,Flash 从 256KB 到 512KB,全部 200MHz / 192KB SRAM:

型号FlashGPIOADC 通道温度封装
HC32F460PETB-LQFP100512KB8316-40~105℃LQFP100 (14×14)
HC32F460PEHB-VFBGA100512KB8316-40~105℃VFBGA100 (7×7)
HC32F460KETA-LQFP64512KB5216-40~85℃LQFP64 (10×10)
HC32F460KEUA-QFN60TR512KB5015-40~85℃QFN60 (7×7)
HC32F460JETA-LQFP48512KB3810-40~85℃LQFP48 (7×7)
HC32F460JEUA-QFN48TR512KB3810-40~85℃QFN48 (5×5)
HC32F460PCTB-LQFP100256KB8316-40~105℃LQFP100
HC32F460KCTA-LQFP64256KB5216-40~85℃LQFP64
HC32F460JCTA-LQFP48256KB3810-40~85℃LQFP48
脚数不是线性缩水的

从 100 脚降到 64 脚,GPIO 只从 83 掉到 52(少 31 个),但 ADC 通道数从 16 掉到 10、定时器可能也减少。选封装时别只看 GPIO 总数,把 ADC 通道、USART 数量、定时器通道一起数一遍,这是最常见的「选完才发现模拟不够用」的原因。

2.6 超低功耗 L 系列:0.5µA 深度休眠

HC32L13x 是低功耗主力(官方 DS Rev2.1)。它最反直觉的地方是在 8KB RAM 的体量上塞了 3 个运放和 2 路带 6bit DAC 的比较器——这是为电池供电的传感器节点准备的:

项目HC32L130 / L136
内核 / 主频Cortex-M0+ / 48MHz
Flash / RAM64KB Flash(带擦写保护)/ 8KB RAM(带奇偶校验)
供电范围1.8~5.5V,耐压范围比 F 系列宽得多
GPIO56IO/64pin、40IO/48pin、26IO/32pin、23IO/28pin
时钟外部高速 4~32MHz;外部低速 32.768kHz;内部高速 4/8/16/22.12/24MHz;内部低速 32.8/38.4kHz;PLL 8~48MHz;硬件支持内外时钟校准与监控
深度休眠0.5µA@3V:所有时钟关闭,POR 有效,IO 状态保持,IO 中断有效,寄存器/RAM/CPU 数据保持
深度休眠 + RTC0.9µA@3V
低速工作7µA@32.768kHz:CPU 与外设运行,从 Flash 执行
休眠 / 工作35µA/MHz@3V@24MHz / 130µA/MHz@3V@24MHz
唤醒时间4µs 超低功耗唤醒
LCD 驱动4×40 / 6×38 / 8×36 段
模拟12bit 1Msps SAR ADC(内置运放可测微弱信号)+ 3×OPA + 2 路 VC(集成 6bit DAC + 可编程参考)+ 16 档 LVD
安全AES-128 协处理器、TRNG、全球唯一 10 字节 ID
封装QFN32/48、LQFP64/48、TSSOP28
官方案例:额温枪

小华官网的额温枪方案以 HC32L136 为核心,指标是 0.5µA 待机功耗、1µA LCD 显示功耗、4µs 高速唤醒,靠 MCU 内置 LCD 驱动 / 12 位 ADC / SPI / I²C / 模拟传感器降低 BOM。

参考型号:HC32L136K8TA、HC32L136J8TA、HC32L130F8UA、HC32L130E8PA、HC32L130J8TA、HC32L130J8UA。

2.7 电机与家电特色型号

这是小华最有竞争力的部分,官方与公开报道口径:

型号内核 / 主频定位关键能力
HC32F448M4 / 200MHz空调室外变频主控电机专用定时器输出三相互补 PWM + 硬件死区;3 单元 12bit 2.5Msps ADC;2 路 DAC;4 路比较器;支持压缩机 + 风机 + 高频 PFC 三合一;已在头部客户大规模出货
HC32F115 / HC32F155M0+ / 48MHz空调内机、冰箱、洗衣机主控通讯接口丰富、高性价比
HC32L180M0+ / 48MHz空调室内机单芯片集成主控与风机变频
HC32M413M0+ / 120MHz洗衣机主变一体、高端空调内机主变一体带 Cache + 电机加速单元;3.6Msps 高速 ADC、高精度 CMP、高性能 OPA;UART 等接口丰富
HC32M120 / HC32M140M0+ / 48MHz通用电机控制LQFP32/48/64
HC32F334M4 / 84MHz数字电源高分辨率 PWM + 运放/CMP
「三合一」架构的工程含义

HC32F448 能在一颗芯片里同时跑压缩机的矢量控制、风机的变频调速和高频 PFC 的功率级闭环。这意味着原来需要「一颗 MCU + 一颗 PFC 专用芯片」的两芯片方案可以合并,BOM 与 PCB 面积都会下降。代价是软件复杂度上升:三套控制回路共享 ADC 采样资源与定时器 PWM,必须在第 20.4 节的资源预算表上逐项核对,不能拍脑袋。

2.8 选型决策路径

把上面这些收敛成五个问题,从上往下问,命中即停:

选型决策树:先定类别字母,再数资源类别字母一步砍掉一半候选;资源数量决定封装,别只看 GPIO 总数起点:这条产品线对主频与算力的要求是什么?电池供电 / 表计 / 传感器节点→ L 系列(L0 / L1)关注深度休眠电流与 LCD 驱动电机 / 数字电源→ M1 / M4 / F334关注互补 PWM 通道与死区能力车规→ A1 / A4关注 AEC-Q100 与功能安全等级通用 + 高算力 + 高速采样→ F4(F460 / F4A0)关注 ADC 通道与 DMAC 通道通用 + 家电主控 / 成本敏感→ F0 / F1关注接口数与耐压范围定完类别后必须数的三样资源ADC 通道数(脚数一少就掉) · 定时器 PWM 通道 · 通信接口数 —— 选封装前逐项核对
图 3 · HC32 选型决策树:类别字母优先,资源数量定封装
  • 先用类别字母筛掉一半:电池供电 → L;电机/电源 → M 或 F334;车规 → A;其余 → F。类别定了再看具体子线,能省 80% 的比对时间。
  • 同系列内优先选大 Flash 那一档。F460 的 512KB 与 256KB 差价极小,而后期发现 Flash 不够的成本(改板、加外部器件、重做认证)远高于差价。
  • 数完 ADC 通道和定时器通道再定封装。100 脚降到 48 脚时 ADC 从 16 通道掉到 10 通道,模拟项目最容易在这里翻车。
  • 需要 CAN FD / 以太网 / USB HS / EXMC,直接上 F4A0,F460 没有这些。
  • 量产前确认脱机烧录与 SWD 保护方案,别等到产线上才发现只有调试器直烧这条路。

3 · 内核与架构:Cortex-M 加上小华自有外设体系

HC32 的内核就是标准 ARM Cortex-M,所以「算力」和「生态」这两件事不用担心。真正需要重新理解的是外面那一层小华自研的外设体系。

3.1 Cortex-M0+ 与 M4F 的取舍

两个档次的选择非常清晰,选错了后面会很难受:

维度Cortex-M0+(F0/F1/L1/M1/M4 子线)Cortex-M4F(F4 子线、F334)
典型主频48MHz84 / 200 / 240MHz
FPU无有(单精度)
指令集Thumb-2(ARMv6-M)Thumb-2 + DSP + SIMD(ARMv7-M)
单周期乘法有硬件乘法器(更快)有,且饱和指令可选
典型算力约 55 DMIPS 量级250DMIPS(F460)~ 300DMIPS(F4A0)
适合表计、家电主控、传感器节点、电机辅助控制电机 FOC、数字电源、以太网、网关
典型 RAM 瓶颈8~24KB,要精打细算192~516KB,可放开用
算术与浮点:先确认再动手

没有 FPU 时做 FOC 的三角函数与浮点运算会非常吃 CPU。M0+ 型号的做法有两种:一是把控制放在定点/查表(常见于 HC32M120/M140 这类通用电机),二是像 HC32M413 这样用 M0+ @120MHz 并集成电机加速单元来补。选型时要明确你的算法跑在哪,别指望 M0+ 能扛 200MHz M4 上的算法直接搬过来。

3.2 小华外设体系的命名逻辑

小华的模块前缀不是随机取的,有一条自己的规则。理解它之后,看手册目录就知道大概有哪些东西:

HC32F460 外设体系:四层结构与模块命名对照模块名与 STM32 的差异是迁移时最容易踩的坑 —— RCC 在这里是 CMU,GPIO 在这里是 PORT应用层main() / RTOS / 协议栈 / 算法唯一与厂商无关的一层 —— 迁移时通常整体保留DDL 驱动层(hc32_ddl.h 统一入口)PORT / CLK / PWC / MO(ADC,OPA,CMP) / USART / SPI / I2C / CAN / USB / QSPI / SDIO / ETH约 30+ 外设模块,由 ddl_config.h 条件编译裁剪 —— 按需裁剪可显著减小代码体积寄存器层(PORT 章 / CMU 章 / PWC 章 …)含小华特色寄存器:POERx 输出许可 / POTRx 翻转 / RC 校准 / AOS 事件路由迁移 STM32 代码时,这一层几乎 100% 需要重写命名对照速查STM32 RCC → HC32 CMU(时钟)STM32 GPIO → HC32 PORT(引脚)STM32 TIM → HC32 Timer0/A/4/6(分家族)STM32 DMA → HC32 DMAC(通道映射不同)
图 4 · HC32F460 四层外设体系与 STM32 命名对照

这张图要记住的核心是三件事:

  1. 时钟管理叫 CMU,不是 RCC。你在 STM32 里所有 RCC_ 开头的调用,迁移时都要换成 CLK_ 系列。
  2. 引脚模块叫 PORT,不是 GPIO。而且它不只管 GPIO,还管复用功能的选择 —— 这就是两步法的根源。
  3. 模拟外设归在 MO 模块(ADC / OPA / CMP / DAC 相关的寄存器与 API 常以 MO 开头或归在 MO 章),不分散在各个外设里。
为什么这件事值得单独讲

因为迁移时最容易「编译通过、运行不通」。把 STM32 的 GPIO_Init() 换成小华的 PORT_Init() 之后,代码能编译、下载也成功,但外设一点反应都没有 —— 而最常见的原因就是漏了 PORT_SetFunc()。这类「静默失败」不报错,最耗调试时间。

3.3 CMU 时钟管理模块

CMU 负责六件事:

  1. 时钟源选择:六个源(见 10.1 节)里选一个作为 PLL 输入或系统时钟源;
  2. PLL 控制:输入分频、倍频、输出分频,以及专用音频 PLL(供 I²S);
  3. 系统时钟切换:把选定的时钟源切到系统时钟(SWT),切换期间 CPU 会短暂停顿;
  4. 总线分频:HCLK 与各 PCLK 的分频系数;
  5. Flash 等待周期:主频升高后要插入等待周期,否则 Flash 读出错;
  6. 时钟监控:CSS 时钟失效检测(时钟挂了能检测到)、时钟输出 MCO。

3.4 PWC 电源与时钟门控

PWC 是电源与时钟的门控枢纽,有三类职责:

  • 外设时钟门控(FCG):每个外设有一组 FCG 位,关掉就省电。移植时最常见的一类错误就是忘了开某个 FCG —— 写寄存器全无效果。
  • 电源模式控制:进入 Sleep / Stop / Power down,以及唤醒后恢复。
  • VBAT 与备份域:F4A0 有 VBAT 独立供电 + 128Byte 备份寄存器 + 4KB 备份 SRAM。
PWC_FCG 是「静默失败」的第二个高发区

典型症状:USART_Init() 成功、波特率算对、TX 也配了,但串口一个字节都不发。八成是漏了对应的 PWC_FCG0 外设时钟使能。判定方法很简单:寄存器值写进去后读回来,如果还是复位值 0,就是时钟没开。这条判定适用于所有外设,值得养成习惯。

3.5 AOS 外设事件互触发

AOS(Analog to Digital / Event routing)是一个事件路由矩阵,让外设之间可以互相触发而不经过 CPU。典型用法:

  • 定时器触发 ADC 采样 → 采样率由定时器节拍精确决定,抖动远小于软件触发;
  • ADC 采样完成触发 DMA 传输 → 数据不落 CPU;
  • ADC 转换完成触发定时器更新 → PWM 与采样严格同步,这对电机 FOC 的电流采样对齐是刚需。
AOS 也要先开时钟

用 AOS 之前必须先打开 PWC_FCG0_PERIPH_AOS 时钟。很多「串口 DMA 收不到数据」的问题根源就在这里:代码里写了 IDLE/DMA 的接收逻辑,但 AOS 时钟没开。

3.6 协处理单元 DCU / MAU / FMAC

这是 F4A0 相对 F460 最明显的算力增量,做算法时可以省很多 CPU:

单元功能典型用途
DCU8 个数据计算单元(F4A0)/ F460 有 DCU乘累加、移位、饱和等基本算术,替代软件循环
MAU数学协处理单元,支持 Sin / SqrtFOC 的 sin/cos 表、电机角度计算
FMAC16 阶 FIR 数字滤波器Sinc 插值、采样滤波、音视频处理
ETM全指令跟踪单元(F4A0)指令级 trace,配合高端调试器做疑难问题定位

如果你的算法里大量是三角函数,F4A0 的 MAU 能直接吃下来;F460 只能用查表 + 插值。注意 F460 的 DAC 只有 2×8bit,做波形输出要谨慎。

3.7 与 STM32 的兼容边界

这是全章最实用的一节。按「能复用」和「必须重写」分开看:

HC32 与 STM32 的兼容边界:内核兼容,外设与命名必须重写兼容的是指令集与 CMSIS 规范,不是寄存器与启动文件✓ 可以直接复用Cortex-M 指令集与 CMSIS 规范应用层算法与业务逻辑FreeRTOS / 第三方中间件移植层USB / 以太网协议栈同一系列内换料(Flash 档位)✗ 必须重写(否则跑不起来)RCC → CMU 时钟树与配置流程GPIO 两步走:PORT_Init + PORT_SetFunc启动文件与 144 路私有向量表DMA → DMAC 通道与触发源映射时钟门控 PWC_FCG + AOS 依赖△ 结构性差异没有 CubeMX 式配置器只有三种低功耗模式定时器分 4 个家族 8 类POER / POTR 专属寄存器QSPI 不支持外部启动
图 5 · HC32 与 STM32 的兼容边界:可复用与必须重写

换句话说,HC32 与 STM32 的兼容只到「指令集 + CMSIS 规范」这一层,往下全部要重写。把它当成「新建一个工程,只是 MCU 换了」,比当成「移植」来做,心态会好很多,成功率也高很多。

不要试图做二进制兼容

启动文件、向量表偏移、时钟初始化、Flash 算法四项全不同。直接复用 STM32 的 .axf / .hex 烧进 HC32 芯片,绝不会工作,而且现象往往不是「跑不起来」,而是跑出一个完全无关的错误行为,比直接失败更难查。

4 · 开发环境:DDL 驱动库与 Keil / GCC

这一章解决「装不起来」的问题。HC32 的环境安装有两个独立的包,加上一个历史遗留的坑。

4.1 官方资料包与版本

需要准备两样东西,缺一不可:

包作用获取备注
DDL 驱动库外设驱动源码 + 头文件 + 启动文件 + 链接脚本 + 例程官网下载中心 / GitHub 官方仓库文件名形如 hc32f460_ddl_RevX.Y.Z.zip
Keil DFP器件描述包(.pack)Keil Pack Installer厂商前缀 HDSC,器件树形如 HDSC::HC32F460

DDL 库内的版本宏定义在 hc32_ddl.h 中(社区移植源码实测):

宏值含义
HC32_DDL_VERSION_MAIN0x02主版本
HC32_DDL_VERSION_SUB10x02次版本 1
HC32_DDL_VERSION_SUB20x00次版本 2
HC32_DDL_VERSION_RC0x00发布候选标记
HC32_DDL_VERSION0x02020000合并版本值 = Rev 2.2.0
DFP 与 DDL 版本要对齐

两个版本不匹配会出现「底层寄存器定义差异」导致的怪异问题 —— 比如明明按文档写了却没生效,或者结构体字段名对不上。做项目时在 README 里记一笔两个包的确切版本号,将来复现问题时这条信息至关重要。

4.2 DDL 目录结构(两套并存)

这是最让人困惑的一点:不同来源拿到的 DDL 包,目录结构不一样,但说的是同一套东西。

来源结构特点
官方 DDL 包
(Keil / 资料中心)
driver/(inc + src)、mcu/common/、example/、project/MDK-ARM/、utilities/;启动文件实际在 DDL_Driver/Source/Startup/ARM/大小写混用(startup_HC32F460.s),project/MDK-ARM 只有 .uvprojx 不含源码
openEuler drv-frame
(开源社区移植)
platform/mcu/hc32f460/driver/inc/、mcu/GCC/Startup/、mcu/GCC/LinkerScript/、mcu/common/路径全小写,结构规范,带 CMSIS 接口与 HAL 层,GCC 路线最省力的参考
核心头文件与统一入口

无论哪套结构,核心都一样:hc32_ddl.h 是统一 include 入口,它按 ddl_config.h 的宏条件包含各外设头文件;器件主头是 hc32f460.h;系统头 system_hc32f460.h 定义时钟常量与 SystemCoreClock。

4.3 启动文件与向量表

启动文件是第一个会绊住你的地方。官方包里它不在你以为的路径:

项目内容
文件位置(官方包)DDL_Driver/Source/Startup/ARM/startup_HC32F460.s
文件位置(drv-frame)platform/mcu/hc32f460/mcu/GCC/Startup/startup_hc32f460.s
命名差异官方包大小写混写(startup_HC32F460.s),drv-frame 全小写。部分工程另有分型号版本如 startup_HC32F460PITB.s
栈 / 堆Stack 0x1000(4KB)、Heap 0xC00(3KB)
中断总数144(IRQ000_Handler ~ IRQ143_Handler)
向量表内容ARM 标准 16 个系统异常 + 128 个外部 IRQ,含 HC32 私有中断(ADC1_IRQHandler、USARTx_IRQHandler、QSPI_IRQHandler、XTAL32K_ERR_IRQHandler 等)
启动流程向量表 → SystemInit() → __main → main()
第一个必踩的坑:missing startup file

在 Keil 里打开官方示例工程直接编译,几乎必然报:

Error: #5: cannot open source input file "startup_HC32F460.s"

原因是官方 DDL 包的 project/MDK-ARM/ 只提供工程容器(.uvprojx),不包含源文件实体,启动文件深埋在 DDL_Driver/Source/Startup/ARM/ 子目录且未登记到工程里。修复四步:

  1. 建一个名为 Startup 的工程分组;
  2. 把 startup_*.s 手动 Add Existing Files 进这个组;
  3. Options → Target → Startup 中取消勾选「Use default startup file」,手动填精确文件名;
  4. 若使用分型号启动文件,文件名后缀必须与 Keil 里选的 Part Number 严格一致(区分大小写)。

千万不要用 startup_ARMCMx.s 这类 ARM 通用启动文件代替:它没有 HC32 的私有中断向量,也没有 SystemInit(),运行时会直接进 HardFault_Handler 死循环。

4.4 链接脚本与内存映射

链接脚本决定 Flash 与 SRAM 怎么划分。HC32F460 的链接脚本(社区移植版命名 hc32f460xe_flash.ld.s,x 是容量档代号)里有两个特殊段值得记住:

段名内存区用途为什么重要
.ret_ram_dataRET_RAM已初始化的保持 RAM 数据这 4KB Retention RAM 在 Power down 下仍保持内容,是低功耗产品存关键状态的地方
.ret_ram_bssRET_RAM未初始化的保持 RAM 数据同上,省掉每次唤醒后重新初始化
.high_speed_sramRAMH32KB @200MHz 单周期高速 RAM把中断向量、栈、热点数据放这里,性能差别明显

链接脚本还支持 bootloader / application 双模式宏切换,做 IAP 时必需 —— 用它把 BootLoader 与 App 的地址空间隔开。具体宏名请查你所用版本的链接脚本注释,本文不硬写版本相关的宏名。

Keil 用户的对应关系

Keil 用 .sct 分散加载文件而不是 .ld。官方包若未提供 .sct,可以先用默认的 Flash/RAM 布局跑通,再按需补做分区。建议先用默认布局打通编译与下载,不要一上来就抠链接脚本。

4.5 Keil MDK 配置全流程

按这个顺序配,每一步都有验收标志:

  1. 安装编译器组件。勾选 ARM Compiler 6(ARMCLANG) —— 官方示例工程默认用它。验收:Pack Installer 里能看到 ARMCC/ARMCLANG。
  2. 安装 DFP。Pack Installer 搜索 HDSC.HC32F4xx_DFP 安装(社区包名,确切名称与版本以官网为准)。验收:器件树里能看到 HDSC 厂商与 HC32F460 系列。
  3. 新建工程并选对器件。Project → New uVision Project,选 HDSC::HC32F460 对应型号。询问是否添加启动文件时选「否」,用 DDL 自带的。验收:工程树里出现设备名。
  4. 加入源码与头文件路径。Include Paths 加:./driver/inc、./driver/src、./mcu、./CMSIS/Core/Include;Asm 的 Include Path 要加同样的路径,否则汇编找不到符号。
  5. 定义全局宏。加 HC32F460;部分库版本还需 USE_DDL_DRIVER。验收:编译不报未定义宏。
  6. 配置 Target。Xtal(MHz) 填实际外部晶振频率(默认 8);必要时启用 MicroLIB。
  7. 加载 Flash 算法。Flash Download 里添加 HC32F460 对应 .FLM(DFP 自带)。验收:没有 No Algorithm found 报错。
  8. 加启动文件。按 4.3 节的四步做。验收:编译日志里能看到 assembling startup_*.s 与 __Vectors defined in startup_*.o。
Xtal 是最隐蔽的一个配置

Keil 里 Xtal 只是给 IDE 用于换算调试符号地址的参考值,但如果你的代码用 XTAL_VALUE 宏做 PLL 计算,两边不一致就会得到错误的系统频率。改法:system_hc32f460.h 里的 XTAL_VALUE 改成实际晶振频率,然后确认 SystemCoreClockUpdate() 被调用。

4.6 GCC / openEuler drv-frame 路线

如果你偏好 GCC(免费、可进 CI、或需要 openEuler 这类上游社区支持),可行路径有两条:

路径做法优点代价
直接用 DDL 的 GCC 目录用 DDL 里的 startup_hc32f460.s + hc32f460xe_flash.ld.s,配 arm-none-eabi-gcc最贴近官方,示例代码可直接编译启动脚本与 CMake/Make 需要自己写
openEuler drv-frame用其 platform/mcu/hc32f460 平台层自带 CMSIS 接口 + HAL + 低功耗管理,结构清晰,有维护者跟随上游版本,非官方支持

drv-frame 的 DDL 版本宏、启动文件参数、链接脚本段名(见 4.3 / 4.4 节)就是从官方 DDL 抄过来的,可以作为交叉验证。

4.7 没有 CubeMX 该怎么办

重要:截至本文编写日期,未发现小华官方提供图形化配置工具

本次核查没有找到类似 STM32CubeMX 或 AT32 Work Bench 的官方配置与代码生成器。这意味着时钟树、外设初始化、引脚复用都得自己写代码。实际影响:

  • 好处:不会有「工具生成的代码把外设配错」这类问题,每一行的来源都可查;
  • 代价:没有现成时钟配置生成器,第 10 章的 CMU 流程必须自己走一遍;多引脚工程(100 脚)配置工作量不小。

如果官网下载中心后续上线离线工具,以官方为准。

没有生成器的情况下,把「可复用样板」自己攒起来是最划算的投资:把时钟配置、GPIO 初始化、串口重定向、Flash 封装这四段做成自己项目里的 bsp/ 模块,后面所有项目直接拷贝改,比每次重查手册快得多。本文第 5 章与附录 C 就是这套样板。

5 · 第一个工程:从新建到点亮 LED

目标:一小时内让 LED 亮、能下断点、并能通过串口打印。这一章的每一步都给出验收标志,卡住就停在那一步别往下走。

5.1 硬件前提

调试期最小系统只要四样东西:

项要求说明
供电VCC 按型号给(F460/F4A0 为 1.8~3.6V,L13x 为 1.8~5.5V)每个电源引脚都要就近去耦
调试器J-Link 或 CMSIS-DAP(两者都可以)只需 SWD 两根信号 + GND
BOOT确保复位后从主 Flash 启动接可靠下拉,不要悬空
LEDGPIO 驱动,或直接用开发板自带 LED先确认 LED 接在哪个引脚
用官方评估板还是自制板

第一次上手建议买官方 EVB(如 EVB-HC32F4A0)。板载调试器电路、排针、晶振、Flash 芯片都配好,能省掉一半接线类故障。等自制板跑通后再回来做量产板。

5.2 工程目录组织

建议按下面组织,核心原则是DDL 当第三方库引用而不是搬进自己源码改:

推荐的工程目录组织(以 Keil 工程为例)把 DDL 当第三方库引用,不要把源码搬进自己的 src/ 里改 —— 版本升级会很痛MyProject/├── Startup/startup_hc32f460.s —— 从 DDL 的 Source/Startup/ARM 复制├── mcu/hc32_ddl.h、system_hc32f460.h、ddl_config.h├── driver/inc/各外设头文件(引用 DDL,不改)├── driver/src/各外设源文件├── linker/hc32f460xe_flash.ld.s 或 .sct├── bsp/board.c/h —— 时钟、GPIO、串口、Flash 封装├── app/main.c 与业务模块├── project/MDK-ARM/xxx.uvprojx└── output/axf / hex / bin / map —— 全部加入 .gitignore
图 6 · HC32 工程目录组织建议

这个结构的好处:升级 DDL 版本时只需替换库目录,不用解冲突;自己的业务代码与驱动代码边界清楚,出问题好定位。

5.3 点亮 LED 的六步

  1. 确认时钟能跑对。上电后先读 SystemCoreClock,或用 MCO 示波器测输出频率。验收:数值与目标一致。时钟不对就不要往下走 —— 后面所有现象都会失真。
  2. 配置 LED 引脚。两步都要写:PORT_SetFunc() 选功能 + PORT_Init() 配电气属性。验收:读回寄存器值符合预期。
  3. 配好 SysTick 或定时器时基。SysTick_Init() 之后 SysTick_GetTick() 能返回递增的毫秒数。
  4. 配置串口并重定向 printf(见 5.4 节)。验收:串口助手能看到 printf 输出。
  5. 在 main() 里下第一个断点。验收:能停在 main() 入口,能单步走过时钟初始化而不跑飞。
  6. 翻灯并加断言。用 GPIO_SetPins / GPIO_ClearPins(注意不是 STM32 的 SetBits/ResetBits)翻转,同时开 __DEBUG 断言。
为什么「只调 PORT_Init 引脚没反应」:两步配置法小华把「电气属性」与「复用功能」拆成两个步骤,STM32 是一步 Init 完成的✗ 只调 PORT_Init()PORT_Init() 配置的是方向 / 上下拉 / 驱动能力但复用功能仍是 Func0(GPIO)外设功能根本没被选中结果:串口 / SPI / ADC 引脚完全无输出,寄存器写对了也没有任何波形 —— 且不报错✓ 成对调用第 1 步 PORT_SetFunc()复用功能:Func0 ~ Func63第 2 步 PORT_Init() 配电气属性顺序可换,但两步都要写调换顺序不报错,但漏掉任一步都不会报错 —— 这是最难查的一类静默失败
图 7 · GPIO 两步配置法:PORT_SetFunc 与 PORT_Init 必须成对
图 8 · GPIO 两步配置法:PORT_SetFunc 与 PORT_Init 必须成对

LED 那一段代码的要点就三句:

/* 1. 复用功能与电气属性分开配置 —— 顺序可换,但两步都不能少 */
PORT_SetFunc(GPIOA, GPIO_PIN_05, Func_GPIO_Port);   /* 第 1 步:选功能 */
stc_port_init_t stcPortInit;
PORT_Init(GPIOA, &stcPortInit);                     /* 第 2 步:配电气属性 */

/* 2. 输出翻转:命名与 STM32 不同 */
GPIO_SetPins(GPIOA, GPIO_PIN_05);    /* 不是 GPIO_SetBits */
GPIO_ClearPins(GPIOA, GPIO_PIN_05);  /* 不是 GPIO_ResetBits */
寄存器读回验证法值得固化成习惯

凡是「写完没反应」的故障,第一步不是查代码逻辑,而是把寄存器读回来:值是 0 说明外设时钟没开(FCG 未使能);值与预期不符说明配置顺序或宏用错了;值对了还没反应,才去查引脚电气与接线。这个判定顺序能砍掉大量无效搜索。

5.4 printf 与串口重定向

DDL 自带 printf 支持,启用方式很简洁:

/* 1) 让能 printf:ddl_config.h 或编译宏里定义 */
#define DDL_PRINT_ENABLE    DDL_ON

/* 2) 初始化串口后调用一次 */
UART_PrintfInit();      /* 宏别名 DDL_PrintfInit */

/* 3) 之后直接用 printf 即可 */
printf("SystemCoreClock = %lu Hz\n", SystemCoreClock);

相关工具函数都在 hc32f460_utility.h:

函数实现方式适用场景
Ddl_Delay1ms() / Ddl_Delay1us()软件估算延时短延时,不要求精确
SysTick_Init() / SysTick_Delay() / SysTick_GetTick()硬件精确延时与毫秒计数需要精确时序与超时管理
断言系统

DDL 还有一套受 __DEBUG 宏控制的断言系统。开发期务必打开:参数越界、非法状态这些在正式版本里会静默出问题,在断言下会立刻停在现场。量产固件再关掉以省体积。

5.5 编译产物与体积核算

第一次跑通后要做一次体积体检,把结论写进项目 README:

产物用途关注点
.axf调试镜像带完整符号,供调试器使用
.hex通用烧录格式含地址信息,绝大多数烧录工具吃这个
.bin裸机镜像无地址,烧到固定地址;某些脱机烧录器要这个
.map链接映射报告看 SRAM 占用与函数体积的唯一依据

具体核对的三个数:

  • Flash 占用 vs 型号容量(注意 F460 有 256KB 与 512KB 两档,选型时就该留余量);
  • SRAM 静态占用(data + bss)加上栈预留 vs 可用 SRAM。M0+ 型号尤其紧张,8KB SRAM 用掉 6KB 就该考虑换型号了;
  • 哪些模块被链接进去了。ddl_config.h 里那些没关掉的模块会自动编译进来,白占体积 —— 靠 map 文件逐个确认。
M0+ 型号的 RAM 要格外小心

HC32L136 只有 8KB RAM。官方 DDL 默认栈 4KB + 堆 3KB 就占掉 87%。这类型号一定要在链接脚本或工程选项里把栈堆调小,并认真评估是否需要动态内存 —— 小 RAM 型号上 malloc 往往是崩溃根源。

相关报告 · 交叉引用 3 器件全部展开收起 ▾
点开类目即可展开:具体文档 / 章节(点章直接跳转到该章)
eMMC
电路设计指南
软件设计规范
Linux 驱动开发
样机问题排查
量产问题排查
SPI NOR
电路设计指南
软件设计规范
Linux 驱动开发
样机问题排查
量产问题排查2
系统设计指南
SD NAND
电路设计指南
软件设计规范
Linux 驱动开发
量产问题排查
其他提及器件(共 3)
SPI NAND
电路设计指南
软件设计规范
Linux 驱动开发
样机问题排查
量产问题排查4
全志平台 SPI NAND NOR
章节(点章跳转,共 11 章)
海思平台 SPI NAND 量产常见失败
章节(点章跳转,共 11 章)
烧录成功但不开机 SPI NAND
章节(点章跳转,共 12 章)
瑞芯微平台 SPI NAND eMMC
章节(点章跳转,共 11 章)
系统设计指南3
DDR/LPDDR(DRAM)
电路设计指南4
软件设计规范4
DDR2
章节(点章跳转,共 16 章)
DDR3
章节(点章跳转,共 16 章)
DDR4
章节(点章跳转,共 17 章)
DDR5
章节(点章跳转,共 17 章)