航顺 HK32 开发指南
编制日期 2026-10-14
从产品选型、环境搭建、外设开发到固件下载与 SWD 调试 —— 一份面向工程落地的主芯片开发手册
报告总结
航顺(HK32MCU)是国内出货量最大的 ARM Cortex-M 国产 MCU 之一,二十九大家族覆盖了从指甲盖大小的超低功耗入门芯片到 168MHz 工业级高性能 MCU 的全部档位。本文档把从选型到量产的完整开发链路串成一条线:先帮你判断该选 HK32 的哪一族、用哪套工具链,再逐个讲清时钟、GPIO、中断、定时器、串口、SPI/I2C、ADC、Flash 下载、SWD 调试、低功耗与启动机制,最后给出从 STM32 迁移、故障排查和设计核查清单三类「拿来即用」的速查内容。
结论:对于绝大多数 STM32F103 存量项目,HK32F103 系列可以引脚兼容(PTP)+软件兼容地直接平替 —— 沿用 Keil + STM32 标准外设库(或 CubeMX 生成代码)即可上手,真正需要修改的只有芯片型号、Flash 容量与个别外设差异。本文档的所有外设寄存器与库函数均以航顺官方数据手册 / 用户手册为最终依据,文中速查表与代码片段用于建立开发直觉,量产设计请以最新版手册为准。
1 · 范围与约定
先说清这份文档管到哪里、不管哪里,以及文中术语和数据的出处,避免后续各章产生歧义。
1.1 覆盖范围
本文档面向第一次接触航顺(HK32MCU)芯片、或准备把存量 STM32 项目平移到 HK32 的工程师,覆盖从选型到量产上线的完整开发链路:
- 选芯片:二十九大家族的内核、档位、封装与兼容性定位;
- 搭环境:Keil MDK / IAR EWARM / GCC + VS Code 三条工具链,以及官网 SDK 与设备支持包;
- 写固件:时钟、GPIO、中断、定时器、串口、SPI/I2C、ADC 等核心外设的开发范式;
- 下程序:SWD 烧录、UART ISP、IAP 与 Option Bytes(读保护);
- 调问题:SWD/JTAG 调试、低功耗、启动机制、硬件设计要点;
- 速查表:从 STM32 迁移、故障排查、设计核查清单、封装引脚与资料来源。
1.2 不覆盖什么
为避免范围失控,以下主题本文档不展开,必要时给出官方入口或相邻章节跳转:
- 具体型号寄存器的逐位定义:以对应芯片的《数据手册》《用户手册》为准,本文只在附录 C 给常用位定义索引;
- RISC-V 车规 SoC(HK32A040/A470/AUTO39A)的底层驱动:其工具链与 SDK 独立于 Cortex-M 系列,本文仅作选型提示,不展开寄存器级开发;
- RTOS、文件系统、GUI、协议栈等中间件:与 MCU 厂商无关,按通用方法接入即可;
- PCB Layout 与 EMC 完整设计:仅在第 17 章给硬件设计要点,不替代完整硬件设计规范;
- 量产烧录产线与加密授权:仅在第 13、20 章给原则,不替代产线方案。
1.3 版本与术语约定
| 术语 / 缩写 | 含义 | 本文约定 |
|---|---|---|
| HK32 / HK32MCU | 深圳市航顺芯片技术研发有限公司的 32 位 MCU 品牌 | 统称「航顺」或「HK32」 |
| PTP | Pin-To-Pin,引脚兼容 | 指可直接替换同封装同引脚定义的原厂芯片 |
| ISP | In-System Programming,系统内编程 | 指芯片内置 Bootloader 经串口等下载 |
| IAP | In-Application Programming,应用内编程 | 指用户程序自己改写 Flash |
| ICP | In-Circuit Programming,电路内编程 | 指经调试接口(SWD/JTAG)烧录 |
| SWD / JTAG | ARM 串行 / 边界扫描调试接口 | HK32 全系支持 SWD,部分支持 JTAG |
| SDK / 固件库 | 厂商提供的驱动库与外设例程 | HK32 提供「标准外设库」风格 SDK |
| Option Bytes | 芯片内部配置字节(写保护、读保护等) | 又称「选项字节」,见第 13 章 |
1.4 事实来源与免责
本文档的产品参数、寄存器位、引脚定义与命令均来自航顺官网(www.hsxp-hk.com)公开资料、对应芯片数据手册 / 用户手册,以及社区实测经验(如正点原子 / OpenEdv 的 HK32 训练营)。HK32 各家族迭代较快、子型号众多,任何用于量产设计的具体数值(Flash 容量、封装、电气参数、寄存器地址)请回到对应型号的最新版官方手册核对。文中代码片段用于建立开发直觉,未做逐型号编译验证。
来源:航顺官网产品中心(www.hsxp-hk.com/product)、OpenEdv《航顺 MCU 开发入门及常见问题汇总》、世强硬创平台 HK32F103 资料页。
2 · 产品家族与选型
HK32 二十九大家族按内核与定位分为经济型、主流型、低功耗型、高性能型、车规级与专用型。这一章帮你快速收敛到两三款候选,再进入工具链章节。
2.1 二十九大家族总览
航顺以「通用 + 专用」双线布局,内核覆盖 ARM Cortex-M0 / M3 / M4 与 RISC-V。下表按定位归类,选型时在「内核 / 主频 / Flash / 封装」四列先圈定档位:
| 定位 | 内核 | 代表家族 | 典型主频 | 特点 |
|---|---|---|---|---|
| 经济型 | M0 | HK32F030M / 0301M、HK32C030、HK32F005、HK32L010、HK32E032 | 48 MHz | 超小面积(0.6~1mm²)、超低单价 |
| 主流型 | M0 | HK32F030 / 031 / 04A、HK32F030A / 031A / 04AA、HK32F072 | 48~72 MHz | 替代 STM32F0xx,外设齐全 |
| 主流型 | M3 | HK32F103、HK32F103A | 72~120 MHz | PTP 兼容 STM32F103,可平替 |
| 低功耗型 | M0 | HK32L08x | 32~48 MHz | Sleep/Stop/Standby 多档低功耗 |
| 高性能型 | M3 | HK32F39A | 最高 120 MHz | 带浮点相关加速、丰富通信接口 |
| 高性能型 | M4 | HK32F4xx(F405/407/415/417) | 最高 168 MHz | M4F + FPU,1MB Flash / 256KB SRAM |
| 车规级 | RISC-V | HK32A040、HK32A470、HK32AUTO39A、HK32AUTO103 | — | 通过 AEC-Q100 / ISO 26262 流程 |
| 专用型 | M0/M3 | HK32M/ASPIN(电机)、HK32ASAFE010(安全)、HK32ALG31(光模块)、HK32ATCH(触摸) | — | 面向特定场景的差异化外设 |
2.2 按内核分四档
内核决定工具链、性能天花板与生态,是选型的第一道筛选:
- Cortex-M0:最低成本与功耗,适合小家电、传感器节点、替代 8/16 位 MCU;无硬件除法、中断响应慢于 M3/M4。
- Cortex-M3:HK32F103 系列是「平替 STM32F103」的主力,生态最成熟,标准外设库与 STM32 几乎一致。
- Cortex-M4(F4):带 FPU 与 DSP 指令,适合电机 FOC、数字电源、HMI 等算力敏感场景。
- RISC-V 车规:A 系列面向汽车电子,工具链与 SDK 独立,本文不展开寄存器级开发。
2.3 选型决策树
2.4 主力型号速查
下列是在 STM32 平替与通用控制场景中最常被选到的型号,Flash / SRAM 为常见子型号值,量产请以具体后缀的数据手册为准:
| 型号 | 内核 | 主频 | Flash / SRAM | 封装 | 兼容性 / 备注 |
|---|---|---|---|---|---|
| HK32F103C8T6 | M3 | 72 MHz | 64KB / 20KB | LQFP48 | Pin-to-Pin 兼容 STM32F103C8T6 |
| HK32F103RCT6 | M3 | 72 MHz | 256KB / 48KB | LQFP64 | 兼容 STM32F103RCT6 |
| HK32F103VET6 | M3 | 72 MHz | 512KB / 64KB | LQFP100 | 兼容 STM32F103VET6 |
| HK32F103A 系列 | M3 | 最高 120 MHz | 依子型号 | LQFP 多款 | 主频高于 STM32F103,注意时序余量 |
| HK32F030C8T6 | M0 | 48 MHz | 64KB / 10KB | LQFP48 | 替代 STM32F030C8T6 |
| HK32F072CBT6 | M0 | 48 MHz | 128KB / 16KB | LQFP48 | 带 USB,替代 STM32F072 |
| HK32F4xx(F407) | M4F | 168 MHz | 1MB / 256KB | LQFP100/144 | 高性能,带 FPU |
| HK32L08x | M0 | 32~48 MHz | 依子型号 | 多款 | 低功耗,替代 STM32L0 |
2.5 与 STM32F103 的兼容定位
HK32F103 在引脚定义、地址映射、外设寄存器与标准外设库 API 上与 STM32F103 高度一致,硬件可直接 PTP 替换,软件可沿用 STM32F103 工程(标准外设库 / HAL)后改芯片型号即可编译。差异集中在:① HK32F103A 主频可到 120MHz(STM32 为 72MHz),超频使用需注意外设时钟与 Flash 等待周期;② 个别外设(如部分 ADC 通道、USB)在不同子型号上有细节差异;③ 选项字节(Option Bytes)布局略有不同,详见第 13 章。具体迁移清单见第 18 章。
2.6 选型时的资源核算
选定内核与主频后,还要按实际用量核对资源,避免「Flash 够但 RAM 不够」这类后期才发现的问题:
| 资源 | 核算方法 | 注意 |
|---|---|---|
| Flash | 代码 + 固件库 + 字库/图片资源 | 字库与图片很占空间,用外部 SPI Flash 存图/字库更划算;留 20% 余量给升级 |
| SRAM | 全局变量 + 栈 + 堆 + 任务栈(若上 RTOS) | RTOS 任务栈是隐藏开销,用高水位 API 定稿(见第 24 章) |
| 引脚 | 功能引脚 + 调试口 + 余量 | 复用/重映射可缓解,但留 10%~20% 空闲 IO给产线与扩展 |
| 外设数量 | 数一数 UART/SPI/I2C/TIM/ADC 各要几个 | 同一外设的多个实例可能挂不同总线,注意 APB1 上限 |
| DMA 通道 | 需要 DMA 的外设数(见第 21 章) | 通道冲突要提前规划(尤其 USART1 只有收有通道) |
| 封装 | 引脚数 ≥ 需求 + 散热考虑 | LQFP 便于手焊与返修;小封装省空间但难手工焊 |
很多人按「Flash 大小」选芯片,结果SRAM 或引脚不够:比如要跑一个带字库显示和缓冲的 UI,代码只有 40KB,但字库 + 帧缓冲把 SRAM 撑爆;或者外设用光了 IO,连 SWD 调试口和两个按键都接不下。建议先用「资源核算表」把用量算清楚,再选型号,尤其把 RTOS 任务栈、DMA 通道、引脚余量提前算进去。
2.7 国产替代的常见顾虑
| 顾虑 | 实际情况 | 建议 |
|---|---|---|
| 生态不如 ST 完整 | 基础外设(UART/SPI/I2C/ADC/TIM)资料齐全;CubeMX 支持等需自行确认 | 标准外设库足够用;不要强依赖 CubeMX 代码生成 |
| 资料获取不便 | 官网 + 社区(OpenEdv/正点原子训练营)资料已较完整 | 见附录 D;关键参数以官方手册为准 |
| 与 ST 完全一致? | HK32F103 是 PTP + 软件兼容,但不是「零差异」:个别外设、Option Bytes、主频有别 | 平替可行;量产前对照两家手册逐项核对(见第 18 章) |
| 长期供货与生命周期 | 国产 MCU 生命周期承诺依厂商,量产前应确认 | 下单前与厂商确认供货周期与生命周期 |
来源:航顺官网产品中心、OpenEdv 航顺训练营、选型与资源核算工程经验。
3 · 开发工具链
HK32 是标准 ARM Cortex-M,生态与 STM32 高度重合:Keil MDK、IAR EWARM、GCC 三条路都能走。这一章帮你按团队现状选工具链,并说清授权与设备包两个最容易卡住新人的点。
3.1 三条工具链对比
| 工具链 | 授权 | 代码上限 | 适用场景 | 调试 |
|---|---|---|---|---|
| Keil MDK | 商业(有免费 MDK-Lite) | MDK-Lite 限制 32KB(Cortex-M0/M3/M4 同限) | 中小项目、教学、STM32 平移团队 | ULINK / CMSIS-DAP / J-Link |
| IAR EWARM | 商业(30 天试用 / Kickstart 32KB) | Kickstart 版限制 32KB | 对编译体积/性能敏感的老项目 | J-Link / I-jet |
| GCC + VS Code | 完全免费(ARM GNU Toolchain) | 无限制 | 开源、CI、跨平台团队 | OpenOCD + CMSIS-DAP/J-Link |
从 STM32 平移的项目首选 Keil MDK:改设备型号即可复用既有工程与标准外设库,上手成本最低。需要免费、可脚本化或做 CI 的团队走GCC + VS Code + OpenOCD。HK32F103C8T6 的固件通常 <32KB,MDK-Lite 可直接用,不必立刻买授权。
3.2 Keil MDK 安装与授权
- 安装 MDK:从 Keil 官网下载 MDK(含 uVision),按向导安装,建议装在默认路径。
- 装 HK32 设备包:打开 Pack Installer(工具栏小盒子图标),搜索
HK32或Hangshun安装对应 DFP;若 Pack 仓库未收录,从航顺官网下载 HK32 DFP 后手动导入(详见 3.5)。 - 授权:未授权时以 MDK-Lite 运行(32KB 限制)。超过限制需购买授权并在
File → License Management输入 LIC。 - 验证:新建工程时应能在 Device 列表里搜到
HK32F103系列,说明设备包生效。
3.3 IAR EWARM
IAR 对 HK32 的支持同样依赖设备描述文件。操作要点:
- 安装 EWARM 后,在
Project → Options → General Options → Device选择 HK32 对应型号(或借用 STM32F103 描述后微调); - 免费 Kickstart 版限制 32KB,超过需商业授权;
- 调试走 J-Link 或 I-jet,协议配置与 Keil 类似。
3.4 GCC + VS Code
完全免费的路线,适合做持续集成与跨平台开发:
- 工具链:安装 ARM GNU Toolchain(
arm-none-eabi-gcc),并把bin目录加入 PATH; - 编辑器:VS Code +
C/C++、Cortex-Debug扩展; - 调试:OpenOCD 提供 GDB Server,
launch.json里用cortex-debug连接 CMSIS-DAP / J-Link; - 构建:用 Makefile 或 CMake 管理(第 5 章给最小 Makefile 骨架)。
3.5 设备支持包(Pack / DFP)
HK32 的设备描述(启动文件、Flash 算法、SVD、头文件)由 DFP 提供。两个来源:① Keil Pack 仓库在线安装(推荐);② 航顺官网「资料下载 / 开发资料」里的 HK32 相关软件(含仿真器驱动与 DFP)离线导入。若 Pack 仓库搜不到,可直接借用 STM32F103 的 DFP(HK32F103 与其地址映射一致),再把启动文件与 Flash 算法换成航顺 SDK 中的版本即可。具体路径见第 4、13 章。
3.6 工程模板与目录组织
不论哪条工具链,把工程文件按职责分目录是长期可维护的基础。推荐结构:
Project/
├── BSP/ # 板级支持:LED/按键/传感器/屏(与业务无关的硬件封装)
├── App/ # 业务逻辑:状态机/协议/算法
├── Middleware/ # 中间件:RTOS / 协议栈 / 文件系统
├── Drivers/ # 外设驱动:UART/SPI/I2C/ADC 封装
├── Libraries/ # SDK:CMSIS + StdPeriph(官方原样,不改)
├── Startup/ # 启动文件 + 链接脚本
├── User/ # main.c 与全局配置
└── Output/ # 编译产物(应加入 .gitignore)
核心原则是「可复用」与「可修改」分离:官方 SDK(Libraries/)保持原样便于升级;板级代码(BSP/)封装硬件差异,换板子只动这里;业务(App/)不直接碰寄存器。这样从 STM32 迁到 HK32 时,只有 Libraries/ 和 Startup/ 需要换,App/ 几乎不用动(见第 18 章)。
3.7 编译选项要点
| 选项 | 建议 | 原因 |
|---|---|---|
| 优化等级 | Release 用 -O2;调试用 -O0 或 -Og | 全 -O0 会显著增大体积、拖慢代码;-Og 兼顾可调试与体积 |
| 调试信息 | 始终生成 -g3(GCC)/ Debug Info(Keil) | 没有符号表,崩溃时无法定位到源码行 |
| MicroLIB | Keil 勾选(用 printf 时) | 否则 printf 需要重定向且占用大(见第 10 章) |
| 未使用外设裁剪 | 把不用的 .c 移出工程 | 每个外设库 .c 都进编译会无谓增大体积 |
| 浮点支持 | 有 FPU 的型号开硬件 FPU | 软件浮点慢十倍以上(M3 无 FPU 时尤其明显) |
3.8 工具链常见坑位
| 现象 | 根因 | 处置 |
|---|---|---|
| Device 列表搜不到 HK32 | DFP 未安装 / 未刷新索引 | Pack Installer 装 DFP;重启 IDE 刷新 |
| 编译报 undefined symbol | 启动文件/库源文件未加入工程 | 加文件;确认 Include Paths 与宏 |
| MDK-Lite 编译超 32KB 报错 | 免费版限制 | 开优化、裁剪未用模块;或购授权 / 转 GCC |
| hex 烧进去不运行 | BOOT0 未拉低 / hex 格式与算法不符 | BOOT0 拉低复位;核对 Flash 算法与容量 |
| OpenOCD 找不到 target cfg | HK32 专用 cfg 不在社区仓库 | 借用 stm32f1x.cfg;或按手册写自定义 target 脚本 |
来源:航顺官网「开发资料汇总」、OpenEdv 航顺开发入门帖、Keil/IAR/GCC 实测。
4 · 软件开发包与固件库
HK32 提供「标准外设库」风格的 SDK,API 与 STM32 标准外设库高度一致。这一章讲清 SDK 怎么拿、目录怎么看,以及寄存器 / 标准库 / HAL 三种写法的取舍。
4.1 固件库与 HAL 怎么选
| 写法 | 上手难度 | 可读性 | 移植性 | 适用 |
|---|---|---|---|---|
| 直接寄存器 | 高 | 低 | 差 | 极致体积 / 教学底层 |
| 标准外设库(SDK 默认) | 低 | 中 | 中(同族通用) | 绝大多数 HK32 项目 |
| HAL / LL | 中 | 高 | 高(跨 ST 系列) | 复用 STM32 HAL 生态 |
新项目用航顺 SDK 里的标准外设库即可,API 与 STM32F1 标准库几乎同名,存量代码基本能直接编译。若团队已有 STM32 HAL/CubeMX 工程,HK32F103 也可借用 STM32F1 的 HAL 代码(改设备型号后微调),但需注意个别外设差异。
4.2 从官网获取 SDK
- 打开航顺官网
www.hsxp-hk.com→ 进入「资料下载 / 开发资料」; - 按芯片系列下载对应开发资料包(如
HK32F103xx 系列开发资料),通常含 SDK、例程、数据手册、用户手册、仿真器驱动; - 解压后得到「标准库 / 例程 / 文档 / 工具」等目录,SDK 与例程是后续建工程的基础;
- 将 SDK 中
CMSIS、StdPeriph_Driver、Startup拷贝到工程目录(或保持相对路径引用)。
4.3 SDK 目录结构
典型 HK32 标准库 SDK 的目录如下(以 HK32F103 为例):
HK32F103xx_StdPeriph_Lib/
├── Libraries/
│ ├── CMSIS/ # 内核头文件、启动文件、系统时钟
│ │ ├── Device/ # HK32F103.h、system_hk32f1xx.c、startup_hk32f103*.s
│ │ └── Include/ # core_cm3.h 等内核头
│ └── HK32F1xx_StdPeriph_Driver/ # 外设驱动库
│ ├── inc/ # hk32f1xx_gpio.h 等
│ └── src/ # hk32f1xx_gpio.c 等
├── Project/ # 官方例程(GPIO/UART/TIM/ADC…)
├── Utilities/ # 评估板组件(可选)
└── 文档/ # 数据手册、用户手册、应用笔记
4.4 代码形态对比
同一个「开 PC13 推挽输出」操作,三种写法对照:
/* 1) 寄存器直接写 */
RCC->APB2ENR |= (1 << 4); // 使能 GPIOC 时钟
GPIOC->CRL = (GPIOC->CRL & 0xFF0FFFFF) | 0x00100000; // PC13 推挽 50MHz
GPIOC->BSRR = (1 << 13); // 置 1(灭,低电平点亮时相反)
/* 2) 标准外设库(推荐) */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitTypeDef gi = {0};
gi.GPIO_Pin = GPIO_Pin_13;
gi.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出
gi.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &gi);
GPIO_SetBits(GPIOC, GPIO_Pin_13);
/* 3) HAL(借用 STM32F1 风格) */
__HAL_RCC_GPIOC_CLK_ENABLE();
GPIO_InitTypeDef g = {0};
g.Pin = GPIO_PIN_13;
g.Mode = GPIO_MODE_OUTPUT_PP;
g.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOC, &g);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
标准库写法在「可读性 / 上手成本 / 与 STM32 兼容」之间最均衡,是本文后续所有外设示例的默认写法。HAL 写法仅在你已依赖 STM32 Cube 生态时使用。
4.5 从 STM32 平移代码的对照
因为 HK32F103 与 STM32F103 地址映射一致,绝大多数代码只需改芯片型号宏与头文件名。下表给出常见符号的对应关系:
| STM32F103 写法 | HK32F103 写法 | 说明 |
|---|---|---|
| #include "stm32f10x.h" | #include "HK32F103.h" | 顶层头文件 |
| stm32f10x_gpio.h / .c | hk32f1xx_gpio.h / .c | 外设库文件名前缀不同 |
| stm32f10x_rcc.c | hk32f1xx_rcc.c | 驱动实现文件 |
| RCC_APB2PeriphClockCmd | 同名(保持不变) | 标准库 API 完全一致 |
| GPIO_InitTypeDef | 同名(保持不变) | 结构体与字段一致 |
| startup_stm32f10x_md.s | startup_hk32f103xx.s | 启动文件 |
| STM32F10X_MD | HK32F103xB | 容量/型号宏(按 Flash 容量选 xB~xG) |
把 STM32 工程的 StdPeriph_Driver 整个目录换成 HK32 的同名库,把 stm32f10x_*.h/c 全局替换为 hk32f1xx_*.h/c,换启动文件、改型号宏,约 90% 的应用层代码(App/、BSP/)可以原封不动保留。少数差异(个别外设细节、Flash 等待周期、Option Bytes)按第 18 章核对即可。
4.6 固件库版本管理
SDK 会随官网更新,务必在自己的工程里锁版本,否则换台电脑编译行为就变了:
- SDK 原样拷贝进工程(
Libraries/),不要在多处引用同一份全局 SDK,避免改一份影响所有工程; - 用 Git 管理,SDK 目录打 tag 标记版本(如
hk32f1xx_stdperiph_vX.Y); - 在工程根放一个
SDK_版本号 .md,记录 SDK 版本、来源(官网哪个包)、拷贝日期; - 不要直接改 SDK 源码——需要改行为时,在
BSP/或App/里包一层,而不是改Libraries/,否则升级 SDK 时冲突无穷。
来源:航顺官网 HK32F103xx 开发资料包(标准外设库例程)、STM32→HK32 平移实测。