新唐 Nuvoton 开发指南
编制日期 2026-10-14 | 版本号 Rev 1.0
从 8051 存量项目的维护,到 Cortex-M0 / M0+ / M4F / ARM9 全线的开发、下载、调试与量产 —— 一份把「第一次上手会踩的坑」全部前置的工程手册
结论:新唐最大的特点不是某颗芯片特别强,而是它把「8 位 8051」和「Arm Cortex 全家桶」放在同一个货架上, 并且两边都有从 2 KB SRAM 到 300 MHz MPU 的完整梯度。所以新唐项目的典型形态是存量 8051 继续维护、新设计直接上 Cortex-M。 真正让人卡住的从来不是代码,而是三件小事:Nu-Link 装错固件导致调不了目标内核、下载进了错误的芯片型号、 8051 的 SFR 与 Cortex 的寄存器模型完全不同却长得很像。本文按「装环境 → 建工程 → 编译 → 下载 → 调试 → 量产」的真实流水线组织, 每一节都给出可对照的表格、以及该节最常踩的坑。
报告总结
新唐官网把资料拆得很细:产品页讲定位与选型、Data Sheet 讲电气与引脚、TRM 讲寄存器、User Manual 讲模块用法,
而工具链散落在官网工具页与 GitHub 的 OpenNuvoton/Nuvoton_Tools 仓库里。网上的中文教程绝大多数停留在
「装 IDE → 新建工程 → 点编译 → 点下载」这一步,一旦遇到连不上目标、型号不匹配、读保护、8051 事件跑飞就无解。本文档做了三件官方分散文档没有做的事:
- 把「内核选择」摆在最前面:新唐同时有 5 条内核线,选错线的成本远高于选错型号,第 2、3 章把这条讲透。
- 把坑写在坑发生的地方:不单独罗列「常见问题」,而是在讲每个环节时就把该环节的失效现象、原因、处置一起给出。
- 明确标注不确定项:凡是涉及具体数值的地方,能核实的给出数值并说明来源;把握不足的写成定性描述并指向官方手册章节,不编造寄存器地址与位域。
读者路径
本文档共 19 章 + 4 个附录,按「先跑通、再理解」的顺序组织:
- 只想尽快跑通第一个程序:第 4 章(装环境)→ 第 5 章(建工程点灯)→ 第 7 章(下载)→ 第 19 章(核查清单),四章足够。
- 老8051 项目要继续维护:第 2.2 节与第 3 章(8051 架构)→ 第 9 章(端口与 SFR)→ 第 10 章(8051 中断)→ 第 11 章(WDT 与 IRC)。
- 做产品开发 / 新选型:第 2 章选型 → 第 3 章内核差异 → 第 6 章工程结构 → 第 16 章硬件设计。
- 调不通、报错:直接翻第 18 章故障排查速查表,按现象分层定位。
- 要写驱动:第 9 章 GPIO → 第 10 章中断 → 第 11 章时钟 → 第 12 章外设 → 第 13 章定时器与 RTC。
- 从 STC 或 STM32 切过来:第 17 章是专门的移植对照,先看这一章能省两三天。
- 做电池产品:第 15 章低功耗,重点看「唤醒后必须重配时钟」这件事。
- 要量产:第 7.6~7.7 节(并发烧与读保护)→ 附录 B(Flash 与配置字)。
1 · 文档导读与阅读路径
这一章说明本文档的边界:覆盖什么、不覆盖什么,以及为什么把内容按「流水线」而不是按「功能模块」组织。
1.1 覆盖范围
本文档覆盖从拿到一块新唐最小系统板,到固件跑起来、能在断点处停下来、并能量产烧录的完整链路:
- 家族与选型:8051 线(N76 / N79 / W77 / W78 / MG51 / MS51 / ML51 / ML56)、Cortex-M0 线(NUC100 / NUC200 / M051)、Cortex-M0+ 线(M031 / M032)、Cortex-M4F 线(M451~M460 / M480)、ARM9 MPU 线(N9H / NUC970 / NUC980)与 Cortex-M23 线(M251 / M258)的定位对照。
- 内核:增强型 8051 的 1T 结构与四个存储空间、位寻址 SFR、Cortex-M0/M0+/M4F 的架构分界、NVIC 与 8051 优先级模型的差异、ARM926EJ-S 与 Cortex 的定位差别。
- 开发环境:NuEclipse(Eclipse + GNU GCC)、Keil MDK + Nuvoton DFP、IAR EWARM 的安装与配置,Nu-Link 驱动与固件选择。
- 工程与构建:BSP 目录结构、startup 与向量表、scatter 链接脚本、8051 的 code/size/idata/xdata 内存模型、编译选项、体积预算。
- 下载与量产:Nu-Link2 / Nu-Link2-Pro / Nu-Link3-Pro 硬件形态与接线、NuLink2FW 与 DAPLink 固件的取舍、ICP / ISP / IAP 三条自举通道、Nu-Link-Gang 一对四并发烧、读保护与去保护。
- 外设:端口与外部中断、中断系统、时钟/复位/电源、UART / SPI / I2C / ADC / PWM / PDMA、定时器 / RTC / 看门狗 / LVR、USB 与特色外设、低功耗。
- 硬件与迁移:最小系统电路要点、从 STC 8051 与 STM32 迁移的改动清单、量产工具链替换验证、批量排障。
1.2 不覆盖什么
以下内容超出本文档范围,需要时请查阅对应官方资料:
- 寄存器位域全集:新唐 TRM 动辄四五百页,本文档只给关键模块的常用寄存器与配置思路,写代码时仍需对着目标芯片的 TRM 核一遍。
- 每一款封装的完整管脚定义:本文档只给最常用封装的关键引脚(调试、自举、电源、USB),完整管脚表请查对应 Data Sheet。
- 安全认证与合规流程:IEC-60730 Class B STL 的具体测试项、UL / IEC 认证的送检流程、EMC 整改的量化指标。
- 加密算法的实现细节:M480 的 ECC / AES / SHA 硬件加速器的寄存器序列、密钥库的写入与生命周期管理,属于安全模块文档范畴。
- Linux BSP 与驱动移植:ARM9 线的设备树、u-boot / Linux 内核移植、NUC980 的驱动开发,属于 BSP 包自带的文档范畴。
- 音频算法与面板协议:ISD 语音芯片的录音算法、面板驱动 IC 的时序生成,本文只覆盖到「这颗 MCU 有哪些音频 / 显示接口可用」。
1.3 命名约定与术语
新唐的型号命名分两条完全不同的路子,必须先分清你在哪条线上:
| 字段 | 8051 线 | Cortex-M / ARM9 线 |
|---|---|---|
| 系列前缀 | N76 / N79 / W77 / W78 / W79 / MG51 / MS51 / ML51 / ML54 / ML56 / MINI51 | NUC1xx / NUC2xx / M0xx / M2xx / M4xx / N9H / KM1M4 |
| 系列号含义 | 同前缀下按资源递减:N76E003(18 KB / 低管脚)→ N76E616(带 LCD)→ N76E885(25 MHz) | 数字即产品线:031 低压高速 ADC、051 宽压基础、480 高性能安全、980 ARM9 网关 |
| 封装代码 | 第 10~12 位,如 T20 / Q20 / D28 / AU / AE | 同上但编码不同,必须查该系列选型表 |
| 温度等级 | 多数 8051 型号 -40 ~ 105 ℃(工业级是标配,不是选配) | 同样以 -40 ~ 105 ℃ 为主,少数料号到 85 ℃ |
8051 线里 AT20 表示 TSSOP20、AQ20 表示 QFN20;
而 Cortex-M 线里 AE 结尾基本是 LQFP、AC 结尾多是 QFN。两套编码规则各自独立,
在下单、对封装库、写 PCB 封装之前,一定对照该系列的选型表逐字核对,不要跨线套用。
本文档使用的几个术语:
| 术语 | 含义 |
|---|---|
| 1T / 4T / 6T / 12T | 8051 的机器周期数。标准 8051 是 12T(一个取指周期拆12 个时钟);新唐增强型多为 1T 或 2T,同样主频下指令快得多 |
| NuMicro | 新唐 Cortex-M / ARM9 产品的注册商标,出现在 TRM 与 BSP 的文件名里 |
| TRM | Technical Reference Manual,技术参考手册,即「寄存器手册」,对应本文档引用的 RM 角色 |
| APROM / LDROM | APROM 是跑用户应用程序的 Flash;LDROM 是放 ISP Loader 的独立小Flash 区,两者物理分开 |
| Data Flash | 与程序区共用擦除单元、独立寻址的掉电存储区,参数与校准数据放这里 |
| ICE | In-Circuit Emulator,新唐对「调试接口」的旧称;8051 侧引脚叫 ICE_DAT / ICE_CLK,与 Cortex 的 SWDIO / SWCLK 是同一组物理功能 |
| PDMA | Peripheral DMA,新唐对片上 DMA 控制器的叫法 |
| Nuvoton Studio | 并不存在这个产品。新唐官方开源 IDE 是 NuEclipse(Eclipse + GNU GCC);商业 IDE 支持 Keil MDK 与 IAR EWARM |
1.4 事实来源与免责
本文档的数值型信息来自新唐官方资料与产品页,主要来源如下:
| 资料 | 提供的内容 | 获取位置 |
|---|---|---|
| 产品页(8bit-8051 / Cortex-M0 / M0+ / M4 / ARM9) | 各系列的资源清单、特性表、选型表 | nuvoton.com 或 nuvoton.com.cn 对应系列页 |
| 各系列 Data Sheet | 电气参数、引脚定义、封装、时钟源、功耗档位 | 产品页的 Datasheet 栏(文件名形如 N76E003_..._DS、M480_..._DS) |
| 各系列 TRM / User Manual | 寄存器定义、外设模块行为、时钟树、Flash 布局 | 产品页的 TRM / Technical Reference Manual 栏 |
| M480 Product Brief | M480 六大子系的能力矩阵与外设清单 | nuvoton.com M480 系列资源页 |
OpenNuvoton/Nuvoton_Tools 仓库 | IDE / 编程器 / 驱动 / 开源工具清单与固件说明 | GitHub,含Nu-Link 固件与 NU_CFG.TXT 说明 |
| NuMaker 评估板用户手册 | 板级电路、Arduino 兼容接口、外设映射 | 评估板页面与 User Manual 下载 |
本文档对数值采取三种写法,请按需信任:
① 结构性数值(Flash 容量档位、主频档位、ADC 位数 / 采样率、外设通道数、电压范围、温度范围)——
直接给官网产品页与 Datasheet 的典型值,并注明出处。
② 寄存器与位域——只写名称、所属模块、配置顺序与判读方法,不写地址、不写位序;
因为同一模块在不同系列 / 不同 Flash 容量档位下的偏移与位宽都可能不同,写死一个数比不写更危险。
③ 把握不足的内容——写成定性描述并指向对应 TRM 章节,例如「USB 时钟须精确 48 MHz,具体分频路径见该系列 TRM 的时钟章节」。
正式立项前,请到目标料号的 Datasheet 与 TRM 复核,并确认 PCN / 停产状态。新唐同样会修订手册与改料号, 本文档引用的数值只在你读到的这一版文档里成立。
2 · 全家族全景与选型
新唐不是一个系列,而是一整张货架。这一章先把货架摆在桌子上,讲清每条线为什么存在,再给选型路径。
2.1 一句话认识新唐 Nuvoton
新唐(Nuvoton,nuvoton.com / nuvoton.com.cn)成立于 2008 年,由华邦电子逻辑 IC 事业分割而来,2010 年在台湾证券交易所上市。
它的 MCU 业务有两个明显的性格特征,理解这两点就理解了整个货架:
- 它把「8 位 8051」当成长期在营的核心产品,而不是过渡产品。 N76 / N79 / W77 / W78 / MG51 / MS51 / ML51 / ML56 这条线上有上百个在售料号, 覆盖家电、门禁、小家电、电机、照明、电表、充电器等场景,且普遍带 -40 ~ 105 ℃ 工业温度与可配Data Flash。 亚太地区存量项目里,这批8051 的装机量远超很多人的印象。
- 它的 Arm 线是「全档位覆盖」,而不是只做高端。 从 48 MHz 的 M0+ 到 192 MHz 带硬件加密与以太网的 M480,再到 300 MHz 带 MMU 的 ARM9 MPU,中间没有断档。
此外新唐有一条常被忽略但很实用的家底:ISD 语音芯片与音频 Codec、Nu-Link 全系调试器与量产编程器、 以及电容触控与 LCD COM/SEG 驱动的长期积累。做语音门锁、家电面板、电表这类产品时,这些是能把BOM 砍掉一块的能力。
2.2 8051 阵营:N76 / N79 / W78 / W25
8051 线是新唐存量最大的一条,按内核代数分三档。这三档的寄存器模型基本一致,迁移成本主要在SFR 名称与新增外设上。
| 档位 | 代表型号 | 内核 | 最高主频 | Flash / SRAM | 特色外设 | 封装 |
|---|---|---|---|---|---|---|
| 1T 低管脚 | N76E003 | 1T 8051 | 16 MHz | 18 KB / 1 KB | 12 位 8 通道 ADC(500 kSPS)、6 通道 PWM 带死区、2×UART、1×SPI(8 MHz)、1×I2C(400 kHz)、10 kHz 低速 RC | TSSOP20 / QFN20 |
| 1T 低管脚(含 LCD) | N76E616 | 1T 8051 | 16 MHz | 18 KB / 512 B | 10 位 8 通道 ADC(150 kSPS)、LCD 驱动(3×32 / 4×32 / 6×30 COM-SEG)、2×UART、1×I2C、11.059 MHz 内建 RC | LQFP48 / PQFP44 |
| 1T 中速 | N76E885 | 1T 8051 | 22 MHz 内建 RC | 18 KB / 512 B | 8 档BOR、8×12 位 + 10×10 位双 ADC | TSSOP28 / TSSOP20 |
| 超小容量 | N79E822 ~ N79E825 | 1T 8051 | 6 MHz 内建 RC | 2 / 4 / 8 / 16 KB / 256 B | 基础 UART / SPI / I2C / PWM,功能极简,面向成本极限场景 | SOP20 / PDIP20 |
| 标准兼容 | W78E058D / W78E516D / W77 系列 | 4T / 6T / 12T 8051 | 40 MHz | 32 / 64 / 128 KB / 至多 2 KB | 管脚兼容传统 12T 8051、10 位 8 通道 ADC(96 kSPS)、1×SPI(1.25 MHz)、2×I2C(400 kHz)、2×UART、ISP | DIP40 / PLCC44 / LQFP48 / PQFP44 |
| 早期兼容 | W925 系列(如 W925E240FG) | 8051 | 3.6 MHz | 256 KB / 8 KB | 已停产(Obsolete / EOL),仅供存量维修参考,不建议新设计选用 | QFP100 |
| 工业 / 触控 | MS51 / MG51 / ML51 / ML56 | 1T 8051 衍生 | 24 MHz 档 | 8 ~ 128 KB 档 | 面向智能家电,通过 IEC-60730 Class B STL 认证;ML56 带电容触控按键;ML51 为低功耗系列 | TSSOP20 ~ LQFP64 |
民间与部分旧资料里把新唐 8051 里的 W77 / W78 / W79 / W925 一族笼统叫作「W25 系列」,
这不是一个官方系列名。官方选型页上的分区是 Low Pin Count 8051 Series(低管脚)、
Standard 8051 Series(标准兼容)、Industrial 8051 Series(工业,MS51)、
Low Power(ML51 / ML54 / ML56)、MG51 等。
下单与查手册请以官方选型页的系列归属为准,不要按「W25」这个标签去找资料。
选8051 线时真正要看的三件事:
- 内核代数:1T 与 12T 在同样的主频下性能差一个量级。存量 W78E516D(12T / 40 MHz)迁到 N76E003(1T / 16 MHz), 实际算力是上升的,不要被主频数字变小误导。
- ADC 分辨率与采样率:N76E003 是 12 位 500 kSPS,N76E616 是 10 位 150 kSPS,W78E 是 10 位 96 kSPS。 电表、传感器采集类项目必须看这一项。
- 要不要 LCD / 触控:带 COM-SEG LCD 驱动与电容触控的型号(
N76E616/ML56)能省掉一颗驱动芯片。
2.3 Cortex-M0 阵营:NUC100 / NUC200 / M051
M0 线是新唐「用 32 位替代 8 位」的主力,价格与 8051 接近,但资源明显上一个台阶。
| 型号 | 内核 | 最高主频 | Flash / SRAM | 供电 | 关键外设 | 封装 |
|---|---|---|---|---|---|---|
| NUC100 | Cortex-M0 | 50 MHz | 32 / 64 / 128 KB / 8 / 16 KB | 2.5 ~ 5.5 V | 12 位 8 通道 ADC(760 kSPS)、≤8 通道 PWM、≤4×SPI(36 MHz)、≤2×I2C、≤3×UART、≤3×ISO-7816-3、EBI、PDMA、±1 ℃ 温度传感器 | LQFP48 / LQFP64 / LQFP100 |
| NUC200 | Cortex-M0 | 50 MHz | 32 / 64 / 128 KB / 8 / 16 KB | 2.5 ~ 5.5 V | 与 NUC100 同架构,Advanced Line;4 KB ISP Loader ROM、512 字节页擦除、9 通道 PDMA、CRC 四种多项式(CCITT / 8 / 16 / 32) | LQFP48 / LQFP64 / LQFP100 |
| NUC220 | Cortex-M0 | 50 MHz | 32 / 64 / 128 KB / 8 / 16 KB | 2.5 ~ 5.5 V | USB 2.0 Full-Speed Device(片上收发器)、6 个可配端点、512 B USB 缓冲、3 ms 自动挂起、远程唤醒;不需要外置晶振即可做 Device | LQFP48 / LQFP64 / LQFP100 |
| M051 | Cortex-M0 | 50 MHz | 32 / 64 KB / 4 KB | 2.5 ~ 5.5 V | 8 通道 12 位 ADC、8 通道 16 位 PWM 带死区、2×SPI(36 MHz)、2×I2C、2×UART、EBI、4 档 BOD、ISP/ICP/IAP | LQFP48 / QFN33 |
虽然都是 Cortex-M0 + 类似外设命名,但寄存器基址、位域排列、库函数前缀都不一样。
新唐 BSP 的函数前缀是 NU_ / GPIO_(挂在 NuMicro 头文件下),
而 STM32 是 __HAL_。从 STM32 迁过来最省事的做法是直接拿官方 BSP 的示例工程改,而不是逐个函数替换。
详见第 17.4 节。
2.4 Cortex-M0+ 阵营:M031 / M032
M031 是新唐近年主推的低压高速线,特色非常鲜明:1.8 V 起跑、支持 5 V 容差 I/O、ADC 采样率 2 MSPS、掉电 12 μA。
| 特性 | M031(M0+) | M032(M0+) |
|---|---|---|
| 内核 / 主频 | Cortex-M0(部分资料标注 M0+,下单前请以官网系列页为准),48 / 72 MHz | 同 M031 |
| 供电 | 1.8 V ~ 3.6 V,GIO 支持 5 V 容差 | 同 M031 |
| Flash / SRAM | 16 KB ~ 512 KB / 2 KB ~ 96 KB | 同 M031 |
| ADC | 最多 16 通道 12 位 2 MSPS | 同M031 |
| PWM | 96 / 144 MHz 时钟源,最多 24 路 16 位 PWM,支持捕获与 PDMA | 同 M031 |
| 通信 | 最多 10 组 UART、4 组 SPI(主机 24 MHz / 从机 16 MHz)、4 组 I2C、1-wire UART、USCI(可配 UART / SPI / I2C)、1 组 Quad SPI、EBI(最大 1 MB 地址空间) | 同 M031 |
| 低功耗 | 正常运行 180 μA/MHz,掉电 12 μA;唤醒源含 ACMP / GPIO / WDT / TIMER / UART / USCI / I2C / SPI / WWDT / ADC / PDMA / PWM / USBD | 同 M031 |
| 安全 | 96 位 UID、128 位 UCID、512 B / 2 KB SPROM | 同 M031 |
| USB | 无 | 无晶振 USB 2.0 Full-Speed Device(在 M031 基础上增强) |
| OTA | M031xI 系列支持双 Bank 固件升级 | 同 M031xI |
| 封装 | TSSOP20 / TSSOP28 / QFN33 / LQFP48 / LQFP64 / LQFP128,同封装不同型号管脚兼容 | 同 M031 |
① 2 MSPS 的 12 位 ADC——这是电机控制、传感器融合类应用的核心指标,
同价位里很难见到;官方还提供 PWM 触发 ADC、PWM 周期/时间触发 ADC、以及 PDMA 直接把脉宽计数值搬进 SRAM(最小可测 0.5 μs 脉宽)。
② 掉电模式下 UART 还能收——内部 38.4 kHz LIRC 支撑 9600 bps,配合 16 字节 FIFO,掉电中最多可收 15 字节再唤醒。
做「待机时监听上位机命令」的产品时这一条极其有用,详见第 15.5 节。
2.5 Cortex-M4 阵营:M480 与 M460 旗舰
M4 线是Nuvoton 的高性能主力。M480 有六个子系列,最值得关注的差异在接口组合而不是主频:
| 子系列 | USB FS | USB HS | CAN 2.0B | 硬件加密 | 以太网 | 定位 |
|---|---|---|---|---|---|---|
| M481 | — | — | — | — | — | 基础线:高速 UART / SPI / I2C / PWM,数据采集 |
| M482 | √ | — | — | — | — | USB FS OTG(片上 PHY) |
| M483 | √ | √ | √ | — | — | CAN + 双 USB,车载与工控 |
| M484 | √ | √ | — | — | — | USB HS OTG + FS OTG 双 PHY,USB 传感器数据集中器 |
| M485 | √ | √ | — | √ | — | 硬件加密 + TRNG,指纹模组 / 智能支付 / 安全 USB |
| M487 | √ | √ | √ | √ | √ | 10/100M 以太网 MAC(RMII / MDC / MDIO),串口转以太网、工业 IoT 网关 |
M480 平台共同的硬指标(M48xIDAE 为例,官网 Product Brief):
- 192 MHz Cortex-M4F(1.8 V ~ 3.3 V;1.62 V 时 160 MHz),内置 MPU、IEEE-754 单精度 FPU、DSP 指令扩展、单周期 32 位硬件乘法器。
- Flash 至 2.5 MB(双Bank)、SRAM 至 160 KB(含 32 KB cache)、4 KB LDROM、8 KB KPROM(不可读,用于固件保护)、4 KB SPROM(IP 保护)、2~3 KB OTP。全部片上 Flash 支持 4 KB 页擦除。
- 功耗:动态 175 / 130 μA/MHz(外设关断 / 动态功耗调频),待机可低至 1 μA,仅 RTC 保持时 1.2 μA。
- 安全启动(Secure Boot):开机时校验 Flash 数字签名;硬件加密引擎支持 ECC-192/256、AES-128/192/256、DES / 3DES、SHA-160/224/256/384/512、HMAC、随机数发生器;最多 6 路防篡改检测引脚;96 位 UID + 128 位 UCID。
- BOD 八档(3.0 / 2.8 / 2.6 / 2.4 / 2.2 / 2.0 / 1.8 / 1.6 V,可选中断或复位)+ LVR 1.5 V;内置 1 ℃ 分辨率温度传感器。
- 外设:最多 16 通道 12 位 5 MSPS SAR ADC、2 路 12 位 1 MSPS DAC、2 路轨到轨比较器、最多 3 个运放、QSPI(支持 XIP)、SPI Flash 接口(支持四线与 XIP)、最多 3 路 I2C(SMBus / PMBus)、最多 6 路 UART(LIN / IrDA)、最多 3 路 ISO-7816-3、最多 4 路 SPI/I2S、2 路 SD Host、16 通道 PDMA、80 字节电池保持备份寄存器。
- M480 目录里有 Cortex-M7 吗?没有。新唐的高性能档由 M4F(192 MHz) 与 ARM9(300 MHz) 承担; 真要更高性能、更强的生态(大量中间件、RTOS 现成移植),通常直接上ARM9 或换别家M7。
与之并列的 M460 线(M463 / M467)把主频提到 200 MHz,
Flash 至 1024 KB 双Bank、SRAM 至 512 KB,M467 集成 10/100M 以太网、4 路 CAN FD、硬件加密、TRNG、Key Store、USB HS/FS OTG、HyperBus 接口与可编程音频 PLL —— 是工业网关、通信设备、数据中心方向的答案。
2.6 ARM9 MPU 阵营:N9H / N9K 与 NUC970 / NUC980
这条线严格说是 MPU(微处理器)而不是 MCU:ARM926EJ-S 内核,自带 MMU 与 Cache,可以跑 Linux。
| 型号 | 内核 | 最高主频 | 存储 | 关键资源 | 典型用途 |
|---|---|---|---|---|---|
| N9H20 / N9H30 | ARM926EJ-S | 300 MHz 档 | MCP 封装可内置 DRAM(降低硬件设计难度)、支持 DDR2 | 10/100M 以太网 MAC、高速 USB(Device / Host)、LCD 控制器、配套 emWin GUI 方案 | HMI 人机界面、面板控制、数据采集终端 |
| NUC970 | ARM926EJ-S | 300 MHz 档 | 内置 DRAM颗粒(MCP 封装) | 10/100M 以太网 MAC、USB、LCD、内置通讯加解密引擎 | 工业自动化、通信设备、工业级 HMI 与 RTU |
| NUC980 | ARM926EJ-S | 300 MHz | 板级最高 64 MB DDR2、16 KB I-Cache + 16 KB D-Cache、MMU、16 KB 片内 SRAM、16.5 KB IBR 内部 Boot ROM | 10/100M 以太网 MAC、高速 USB(Device / HOST)、EBI、LCD、音频控制器、JTAG;IBR 支持从 USB / SPI NAND / SD / eMMC 启动 | IoT 网关、串口转以太网、Chili Board 预装 Linux 开发平台 |
新唐 ARM9 线里,N9H20 / N9H30 是 HMI 平台,NUC970 / NUC980 是 工业控制与IoT 网关平台, 工程圈里常把这一族统称为「N9K 系列」或「N9K 线」,指的是这批 ARM926EJ-S 处理器。 官方资料里并没有一个叫「N9K」的产品族页面,查资料请按 N9H / NUC97x / NUC98x 三个前缀去找。
2.7 触控、加密与安全特色机型
把「触控」「加密」「安规」这三件事单独拎出来,是因为它们是新唐相对通用 MCU 最容易做出差异的地方:
| 方向 | 代表型号 | 提供的能力 | 省掉了什么 |
|---|---|---|---|
| 电容触控(8051) | ML56 系列(Low Power Touch Key) | 多路电容式触控按键,内建 IIR 滤波与去抖、Trace Baseline 环境补偿,官方给出防水与抗噪参数集 | 外挂触摸芯片与其外围RC 网络 |
| 触控与 LCD(M23) | M254 / M256 / M258(Cortex-M23) | COM/SEG LCD 驱动 + 电容式触控按键,低功耗 | LCD 与触摸两颗驱动芯片 |
| 8051 工业 / 安规 | MS51 / MG51 / ML51 | 基于 8051,通过 IEC-60730 Class B 软件测试库(STL)认证 | 自己写安全状态机与自检代码 |
| 硬件加密与安全启动 | M485 / M487 / M467 | ECC、AES、DES/3DES、SHA、HMAC、TRNG、Key Store、OTP / KPROM / SPROM、Secure Boot、最多 6 路防篡改引脚 | 软件加密库与密钥保护方案 |
| 芯片级 IoT 安全 | M2354 系列(Cortex-M23) | 面向 IoT 安全规范的芯片级物理安全机制 | 外挂安全芯片(如 SE) |
| 超声 / 雷达 / 光模块专用 | KM1M4BF 系列 | 面向毫米波雷达、高速光模块的 M4 内核型号 | 外挂信号处理与高速接口芯片 |
硬件加密引擎解决的是运算速度与密钥不被软件读走两件事, 但它不替你解决:密钥从哪来(产线注入流程)、固件怎么签(签名私钥的管理)、 调试口怎么封(读保护与安全启动的配合)。这三件事是产品级的安全设计,不在本文档的寄存器层面能解决的范围, 第 16 章与附录 B 给出硬件与流程层面的配合点。
2.8 全家族规格速查表
下表把主流料线的核心资源拉平对比。数字取自官网产品页与 Product Brief 的特性清单;同一系列不同料号的差异以该系列选型表为准。
| 料线 | 内核 | 主频档 | Flash 档 | SRAM 档 | ADC | 供电范围 | 温度 |
|---|---|---|---|---|---|---|---|
| N76E003 | 1T 8051 | 16 MHz | 18 KB | 1 KB | 12 位 / 8 通道 / 500 kSPS | 2.4 ~ 5.5 V | -40 ~ 105 ℃ |
| W78E516D | 12T 8051 | 40 MHz | 64 KB | ≤2 KB | 10 位 / 8 通道 / 96 kSPS | 2.4 ~ 5.5 V | -40 ~ 85 ℃ |
| NUC200 | Cortex-M0 | 50 MHz | 32 ~ 128 KB | 8 ~ 16 KB | 12 位 / 8 通道 / 760 kSPS | 2.5 ~ 5.5 V | -40 ~ 85 ℃ |
| NUC220 | Cortex-M0 | 50 MHz | 32 ~ 128 KB | 8 ~ 16 KB | 12 位 / 8 通道 / 760 kSPS | 2.5 ~ 5.5 V | -40 ~ 85 ℃ |
| M031 / M032 | Cortex-M0+ | 48 / 72 MHz | 16 ~ 512 KB | 2 ~ 96 KB | 12 位 / 至 16 通道 / 2 MSPS | 1.8 ~ 3.6 V | -40 ~ 105 ℃ |
| M0516 | Cortex-M0 | 50 MHz | 32 ~ 64 KB | 4 KB | 12 位 / 至 8 通道 | 2.5 ~ 5.5 V | -40 ~ 85 ℃(DE 到 105 ℃) |
| M451 / M452 | Cortex-M4F | 72 MHz(144 MHz PWM) | 至 256 KB | 至 32 KB | 12 位 / 1 MSPS | 2.5 ~ 5.5 V 或 1.8 ~ 3.6 V | -40 ~ 105 ℃ |
| M471 | Cortex-M4F | 72 / 120 MHz | 64 ~ 512 KB | 32 ~ 64 KB | 12 位 / 1~2 MSPS | 2.5 ~ 5.5 V | -40 ~ 105 ℃ |
| M480(M481~M487) | Cortex-M4F | 192 MHz | 至 2.5 MB 双 Bank | 至 160 KB | 12 位 / 至 16 通道 / 5 MSPS | 1.8 ~ 3.6 V(1.62 V 到 160 MHz) | -40 ~ 105 ℃ |
| M467 | Cortex-M4F | 200 MHz | 至 1024 KB 双 Bank | 至 512 KB | 12 位 / 5 MSPS ×3 | 1.7 ~ 3.6 V | -40 ~ 85 / 105 ℃ |
| NUC980 | ARM926EJ-S | 300 MHz | IBR 16.5 KB | 片内 16 KB + 板级 DDR2 | —(以 MPU 集成外设为主) | 内核 1.8 V 级 / IO 3.3 V 级 | -40 ~ 85 ℃ |
2.9 料号怎么读
以 N76E003AT20 与 M031LD2AE 为例,拆解规则如下。两条线的编码规则不同,必须分别记:
| 字段 | 8051 示例:N76E003AT20 | Cortex-M 示例:M031LD2AE |
|---|---|---|
| 系列前缀 | N76 —— 低管脚 1T 8051 | M031 —— Cortex-M0+ 低压高速线 |
| 资源代号 | E003 —— 该系列里 Flash / SRAM / ADC 的具体配置档 | (无单独字段,配置档编在后续字母里) |
| 引脚 / 封装代码 | A —— 本系列内该封装档的编号;T20 = TSSOP20,Q20 = QFN20 | LD2 —— L 表示 LQFP、D2 表示 48 引脚档;不能跨线套用 |
| 封装 / 等级 | T20 的 T = TSSOP、20 = 20 引脚 | AE —— A 常指 LQFP / QFN 族,E 指该系列的温度/配置档 |
| — | — | 另有 AN(LQFP)、AC(QFN)等后缀,以选型表为准 |
2.10 选型决策路径
把上面这些收敛成六个问题的决策树,从上往下问,命中即停:
来源:nuvoton.com 产品页 + M480 Product Brief
补充四条不成文经验:
- 老设备维护优先用同内核的新唐料:STC 的 STC8 / STC15 体系迁移到新唐 8051(
N76/MG51/MS51), 比迁到 Cortex-M 简单得多——至少 SFR 模型与 Keil C51 工具链都不变。详见第 17 章。 - 新设计除非有硬性理由,不要选 12T 内核。W78E/W77E 这类 12T 兼容料的意义是管脚兼容与替换,不是性能。
- 做 USB 就不要在 M480 里纠结 FS 与 HS:需要 HS 就直接上 M484/M483/M487(片上 PHY,省一颗 USB 模拟芯片); 只需要 FS 就 M032 或 NUC220(无晶振方案省一颗晶振)。
- 面板类产品的关键是「有没有 COM/SEG 驱动」和「有没有 ST L」,不是主频。
2.11 按应用域选型速查
| 应用域 | 首选料 | 备选料 | 选它的决定性理由 |
|---|---|---|---|
| 智能门锁 / 指纹模组 | M485 | M487 / N76E003 | 硬件加密引擎 + TRNG + OTP,指纹算法与密钥保护在同一颗里 |
| 小家电 / 白色家电 | MS51 / ML51 | ML56 / M258 | IEC-60730 Class B STL 已认证,省掉自写安全状态机 |
| 温控器 / 温控屏 | N76E616 / ML56 | M254 / M256 | 内置 COM/SEG LCD 驱动与电容触控 |
| 电表 / 采集终端 | M031 | NUC200 / M480 | 2 MSPS ADC + SPROM 掉电保存 + 宽压 |
| 电机 / 变频 | M031(低压)或 M460 | M451 / M480 | 24 路 96/144 MHz PWM + PWM 触发 ADC + 脉宽计数值 PDMA 直搬 |
| USB 转串口 / 读卡器 | NUC220 | M032 / M452 | 片上 USB 收发器 + 无晶振 Device 模式 |
| 串口转以太网 / IoT 网关 | M487 | NUC980 / M467 | 10/100M RMII + 硬件加密;需要 Linux 时上 NUC980 |
| HMI / 上位机面板 | N9H30 / NUC970 | NUC980 | ARM926EJ + MMU + emWin 生态 |
| 电池供电传感节点 | M031 / M251 | ML51 / M031 | 掉电 12 μA + UART 掉电唤醒 + 五种功率模式(M251) |
| 老 STC 项目改造 | MG51 / N76E003 | MS51 | Keil C51 工具链不变、SFR 模型相近、货源与工业温度稳定 |
先确认停产与供货状态,再谈性能。例如 W925 系列在主流分销渠道已标Obsolete / EOL,
N79E822 这类超小容量料的生命周期也远短于 N76E003。
新唐的 8051 线里,同封装不同型号的管脚兼容是常态 —— 这意味着你可以先用主力料打通设计,量产前再按供货情况平替,
但必须逐字核对目标料号的 Datasheet 管脚表,不能凭「同封装」想当然。
3 · 内核与架构差异
新唐同时在售 8051 与 Arm 全线,所以「这颗芯片怎么写代码」有两个完全不同的答案。这一章把两种模型讲透,让你拿到料号就知道该按哪套想问题。
3.1 增强型 8051(1T 单周期)结构
标准 8051 的一个机器周期是 12 个时钟周期(因此叫 12T),绝大多数指令要 1~2 个机器周期。新唐的「增强型 8051」把这个比例压缩了:
| 内核代数 | 代表型号 | 机器周期 | 同样 16 MHz 下的相对速度 | 说明 |
|---|---|---|---|---|
| 1T | N76E003 / N76E616 / N76E885 / MG51 / MS51 | 1 个时钟 / 机器周期 | 基准 | 绝大多数指令单周期完成,仅乘除法等少数需多周期 |
| 4T / 6T | W78E / W79E 系列部分型号 | 4 或 6 个时钟 | 约1/4 ~ 1/6 于 1T | 为兼容既有 8051 设计、平衡漏电流与 EMI |
| 12T | W78E516D / W77E / N78E | 12 个时钟 | 约 1/12 于 1T | 管脚兼容传统 12T 8051,为替换而存在 |
由此得出第一条工程结论:主频数字变小不等于性能变差。把一个跑在 W78E516D(12T / 40 MHz)上的项目
迁到 N76E003(1T / 16 MHz),算力反而是大约翻倍的。
但反过来,如果原项目里用了 12T 时序写死的延时循环或串口分频假设,迁到 1T 料后时序会全部错掉 —— 这是第 17 章要重点处理的。
8051 内核的寄存器模型也要记住三条特性,它们在移植时会咬人:
- 四组寄存器靠 PSW 切换:
R0~R7有 4 组(0~3组),当前用哪组由程序状态字PSW的 RS1/RS0 决定。 写中断服务程序时若忘记保护PSW,主循环用的寄存器组会在中断里被换掉。 - 位寻址空间只有 128 位(内部 RAM
20H~2FH)。经典位寻址变量声明:sbit LED = P1^0;。 这条在新唐的增强型里仍然是核心习惯 —— 它比读改写 SFR 更省时间也更安全。 - 进栈 / 出栈只有 1~2 个机器周期,这是 8051 中断响应快的传统优势;但栈开在内部 RAM 里, 所以中断嵌套深度直接吃掉你的 SRAM,这是 8051 项目最常见的 OOM 原因。
3.2 位寻址 SFR 与 8051 的四个空间
经典 8051 有四个互不重叠的存储空间,这是它和所有现代 MCU 最不一样的地方:
| 空间 | 关键字 | 寻址范围(经典 8051) | 访问宽度 | 典型用途 |
|---|---|---|---|---|
| 程序空间 | code | 程序 Flash(新唐多为 8 ~ 128 KB) | 按字节 | 指令、常量表、还常兼作xdata 的地址空间 |
| 外部数据 | xdata | 片外 RAM(并行总线 / EBI 挂的存储器) | 按字节 | 外扩 SRAM、并行 LCD、Flash |
| 内部数据 | data | 片内 128 B 或 256 B(新唐常标 256 B / 512 B) | 按字节或按位 | 低地址区是寄存器区与位寻址区,速度最快 |
| 间接数据 | idata | 只有内部 RAM 的高 128 B,用 @Ri 间接寻址 | 按字节 | C51 编译器把 函数局部变量与栈默认放这里 |
Keil C51 默认 small 模型:data 区只有 128~256 B,超了就自动溢出到 idata。
一旦你写了几个大数组、或递归函数、或库的缓冲,就会莫名其妙地报 memory model error。
解决顺序是:① 把缓冲区显式声明成 idata 或 xdata;② 仍不够就切 large 模型(用 32 位指针,慢但地址空间大)。
详见第 6.4 节。
新唐增强型 8051 的 SFR 相比经典多了几组关键寄存器(具体地址与位定义以该型号 TRM 为准):
| SFR 组 | 代表名称 | 作用 |
|---|---|---|
| 端口数据 | PxDAT / PxDATH | 端口数据寄存器,高低字节分开;8051 的 SFR 直接可位寻址 |
| 上拉控制 | PxPULL / PxPULLEN | 端口内部上拉的强度选择与使能,见第 9.2 节 |
| 掉电屏蔽 | PxBOD | 端口级的施密特 / 输入缓冲控制,用在需要省电或抗扰的特殊引脚上 |
| 模式与锁定 | PMOD / LOCK | 端口输入 / 输出方向与配置锁定,防止运行中被误改 |
| 端口中断 | PxAIF / PxEIE / PxEIP / PxITPOL | 端口 A 的中断标志、使能、优先级与触发极性,见第 9.5 节 |
| 看门狗 / 时钟 | WDT / WDT_CLKCTL / CLKCTL | 看门狗与系统时钟切换,见第 11 章 |
| 中断优先级 | IP / IPH | 中断优先级(IPH 提供高位,构成两级自然优先级) |
Cortex-M 上把 GPIO 的一个 bit 写成 PA->DATA |= (1<<0),8051 上写 P1 |= 0x01 或 LED = 1;。
两者都是「读改写端口寄存器」的直觉写法,但 8051 有位寻址而 Cortex-M 没有:
8051 上 LED = 1 编译成一条对位地址的写指令,是原子的;
Cortex-M 上 PA->DATA |= bit 会编译成「读 → 改 → 写」三条指令,在中断里同时改同一位就可能丢事件。
这正是新唐 Cortex-M 侧提供 SET / CLR 类寄存器的原因 —— 详见第 9.1 节。
3.3 8051 与 Cortex-M 的中断模型差异
| 对比项 | 增强型 8051 | Cortex-M0 / M0+ | Cortex-M4F |
|---|---|---|---|
| 向量表位置 | 程序空间起始地址 0x0000,每个向量 2~4 字节(依型号) | Flash 起始 0x0000 0(向量表头是初始栈顶,Reset 在 0x0000 04) | 同M0 |
| 向量数量 | 传统 8 个(含 Timer2、串口中断等扩展) | 内核异常 16个 + 外部中断数十个,数量随型号变化很大 | 同 M0,外设更多 |
| 优先级机制 | IP / IPH 构成自然优先级(2 级 × 位);同级轮转仲裁 | NVIC:抢占优先级 + 子优先级,位数由 PRIGROUP 分组决定 | 同 M0 |
| 可配置嵌套 | 只有 2 级(高 / 低),同级不能互相打断 | 抢占级数由实现的优先级位数决定(常见 4 / 2 / 2 / 1 的分配) | 同 M0 |
| 中断向量写法 | void int0_isr(void) interrupt 0(编号写死) | void IRQHandler(void),函数名必须与向量表名字一致 | 同 M0 |
| 开关中断 | EA = 0/1 全局 + EX0 等分源使能 | __disable_irq() / NVIC_EnableIRQ() 分源 | 同 M0 |
| 栈 | 单栈,在内部 RAM,深度有限 | MSP / PSP 双栈,8 字节对齐由 STKALIGN 保证 | 同 M0 |
Cortex-M 的向量表是一张函数指针表,
startup_xxx.c 里写的是 UART0_IRQHandler,你在别处写成了 UART0IrqHandler ——
编译零错误、链接零错误、烧录成功、运行就是不进中断。
而 8051 用的是中断号,函数名随便起,只要 interrupt 3 里的数字对就行。
这个差异是Cortex-M 移植时最高频的「程序就是不跑」根因,见第 10.4 与 18.4 节。
3.4 Cortex-M0+ / M0 / M4F / M7 的分界
| 特性 | Cortex-M0 | Cortex-M0+ | Cortex-M4F | Cortex-M7 |
|---|---|---|---|---|
| 架构 | Armv6-M | Armv6-M | Armv7-M | Armv7-M |
| 指令集 | Thumb-2(无乘法器,32 位乘法走库函数) | Thumb-2(单周期 32 位硬件乘法器与除法器) | Thumb-2 + DSP 指令 | Thumb-2 + DSP |
| 浮点 | 无 | 无 | 单精度 FPU(IEEE-754) | 单精度 + 双精度 |
| 位操作 | 无(用 GPIO 的 SET/CLR 寄存器) | 无 | 无 | 无 |
| 中断 | NVIC | NVIC | NVIC | NVIC |
| 典型新唐料 | NUC100 / NUC200 / NUC220 / M051 | M031 / M032 | M451 / M452 / M453 / M471 / M480 / M460 | 新唐目录里没有 M7 MCU |
| 选它的理由 | 成本最低,够用就好 | 同价位多一个硬件除法器,做 FFT / 协议校验很值 | 要浮点或 DSP:控制算法、音频、图像 | 新唐这边用 ARM9 代替 |
如果你的算法里有大量除法(比例控制、单位换算、CRC 分块长度计算), M0 上的除法是一个库函数调用 + 软件循环,可能几十个周期;M0+ 的硬件除法器是单周期。 M031 还有 32 位硬件除法器,主频只48/72 MHz 却能跑 2 MSPS 的 ADC 采样链路 —— 这就是「够用」和「很够用」的区别。
3.5 ARM9 N9H 与 Cortex 的定位差异
ARM926EJ-S 与 Cortex-M 的差别不是快慢,而是有没有 MMU 与 Cache。这一个差别决定了两条完全不同的产品形态:
| 维度 | Cortex-M(MCU) | ARM9 N9H / NUC9xx(MPU) |
|---|---|---|
| MMU | M4/M7 有 MPU(不是 MMU,不做虚拟内存) | 有 MMU,能做虚拟地址转换与页表管理 |
| Cache | M7 有;M480 只有 32 KB SRAM cache 作为「cache-like」用途,不是 CPU Cache | 16 KB I-Cache + 16 KB D-Cache |
| 启动 | 从 Flash 的APROM 直接开始执行 | IBR(Internal Boot ROM) 从 USB / SPI NAND / SD / eMMC 引导;或从外部 DDR2 启动 |
| 操作系统 | 裸机 / RTOS(FreeRTOS / RT-Thread) | 可跑 Linux(官方 Chili Board 预装 Linux 环境) |
| 外部存储 | 片上 Flash 为主 | 板级 DDR2(最高 64 MB)+ MCP 封装内置 DRAM,SOC 式设计 |
| 开发方式 | IDE 里编译 → 下载 → 调试 | BSP 包 + 交叉编译链 + 烧写镜像 + 串口/网络调试 |
| 为什么用它 | 成本、实时性、简单 | 需要 GUI、网络协议栈、大存储、多任务、现有 Linux 生态 |
两条线的官方开发资源也是完全独立的:
- Cortex-M 线:官方提供 BSP(C 源码 + 库 + 启动文件 + 链接脚本)+ 各系列 EVT 例程,IDE 里直接编译下载。
- ARM9 线:官方提供 Linux BSP(内核 + u-boot + 设备树 + 交叉编译工具链)与 Non-OS / FreeRTOS 例程, 开发流程是「编译镜像 → 烧到 SD/eMMC/USB → 串口起 shell」。新唐还提供了预装 Linux 的 Chili Board,据官方说法可在 VMware 里跑 BSP 后15 分钟内开始写应用。
3.6 Cortex-M23(M251 / M258)这条中间路线
虽然本文档的重点是 8051 与 M0/M4,但必须提到 Cortex-M23 这条线,因为它是新唐近两年最重要的新布局:
| 特性 | M251 / M252(M23) | M254 / M256 / M258(M23) | 相对 M0+ / M4F 的位置 |
|---|---|---|---|
| 内核 | Cortex-M23(含 TrustZone 安全扩展的可选版本) | Cortex-M23 | 介于 M0+ 与 M4F 之间 |
| 供电 | 全系列 5 V 供电,高抗扰(7 kV ESD / 4.4 kV EFT) | 5 V 级 | 与 8051 的 5 V 系统兼容,省电平转换 |
| 低功耗 | 五种功率模式延长电池寿命 | 低功耗 + LCD | M031 只有三档(见第 15 章) |
| 安全 | 三种芯片保护机制,可防止调试器读出与仿制 | 同类 | M4F 的安全能力是软件侧为主,M23 起有硬件侧 |
| 显示 / 触控 | 无LCD | COM/SEG LCD 驱动 + 电容式触控按键 | 把 8051 的面板能力带进了 32 位 |
| 外设 | PSIO(可编程串行 I/O)、USB、SPI with XIP | 同类 + LCD / TouchKey | 接口数量少于 M4F |
| 生态 | Keil MDK(Nuvoton Edition 免费用于 M23 工程)、IAR、NuEclipse、VS Code 扩展 | 同左 | Keil 的免费授权让 M23 的入门成本很低 |
如果你的产品既需要 5 V 系统直连(不想做电平转换)、 又想脱离 8051 换到 32 位内核、并且对面板/家电安规有要求,M23 是新唐目前最对口的平台。 官方明确提到 M23 工程可免费使用 Keil MDK(Nuvoton Edition) —— 这解决了「想换32 位但不想买 Keil」的矛盾。 详见官网 M251/M252 系列页与 M254/M256/M258 系列页。
3.7 8051 存量项目为何仍值得维护
「新唐做 32 位了,8051 是不是就该淘汰」是个常见误判。从工程角度看,8051 存量项目继续维护往往比迁移更划算:
| 维度 | 继续维护 8051 | 迁移到 Cortex-M |
|---|---|---|
| 工具链 | Keil C51 已经在用,零迁移成本 | 换 IDE / 换编译器 / 换库,C51 与 ARM 编译器语法与库都不同 |
| 代码资产 | 寄存器级代码可大量复用 | 驱动层基本要重写(GPIO / 定时器 / 串口 / 中断全变) |
| 认证 | MS51 / MG51 / ML56 已有 IEC-60730 Class B STL,可直接引用 | 需要为新平台重新做安全测试库认证 |
| 供应链 | N76E003 等料号供货稳定、价格极低,且同封装可平替 | 新平台料号生命周期需重新评估 |
| 性能天花板 | 做面板、门禁、电表、充电控制、小家电完全够用 | 只有算法密集或高速通信才真正需要 |
| 什么时候该迁 | — | 需要浮点 / DSP、需要 USB HS 或以太网、需要大存储、要跑 RTOS 协议栈、需要 5 V 以下低压与低功耗指标 |
结论很直接:存量 8051 项目在「功能没超边界」的前提下,最划算的动作是换新唐的 1T 料号原地替换, 而不是跨内核迁移。真要迁,也应该迁到新唐的 Cortex-M,而不是回到 STC —— 因为 STC 没有 Cortex-M 线, 而新唐同一个供应商、同一个 Nu-Link 调试器就能覆盖 8051 与 Cortex-M 两条线, 这是「换供应商」和「换内核」两个风险叠加时更优的组合。
4 · 开发环境:NuEclipse / Keil MDK / IAR
这一章把名字先厘清:新唐没有名为「Nuvoton Studio」的产品。官方开源 IDE 是 NuEclipse(Eclipse + GNU GCC), 商业 IDE 支持 Keil MDK 与 IAR EWARM,另外还有官方的 VS Code 扩展。选错了名字会一路搜到别人的东西。
4.1 三条工具链的真实分工
| 工具 | 内核覆盖 | 调试器 | 授权成本 | 官方定位 |
|---|---|---|---|---|
| NuEclipse | Cortex-M(M0 / M0+ / M4F)、部分 ARM9 | Nu-Link 全系 / CMSIS-DAP | 免费开源(EPL) | 官方开源 IDE,新项目默认推荐 |
| Keil MDK | 8051(C51) + Cortex-M(M 编译器) | Nu-Link 官方驱动 + 各类 CMSIS-DAP | 商业授权;M23 工程可用 Nuvoton Edition 免费 | 存量 8051 项目的唯一现实选择 |
| IAR EWARM | Cortex-M / ARM9 | IAR 官方 Nu-Link 驱动 | 商业授权(成本最高) | 追求编译产物质量的企业项目 |
| VS Code 扩展 | Cortex-M | CMSIS-DAP / pyOCD | 免费 | NuMicro Cortex-M Pack,适合已经用 VS Code 的团队 |
| Keil Studio / Keil Studio for VS Code | Cortex-M | CMSIS-DAP(Nu-Link2-Pro 可用 WebUSB 接) | 免费版够用 | 把 Nu-Link2-Pro 当标准 CMSIS-DAP 用的官方路径 |
补充三条来自官方 OpenNuvoton/Nuvoton_Tools 仓库的信息:
- 新唐提供 Nu-Link 官方开源替代栈:
pyOCD(Windows/Linux/macOS,Apache-2.0)与OpenOCD(CMSIS-DAP 版,GPL-2.0), 都是新唐定制过的分支,能直接驱动 Nu-Link2。这是 CI 流水线上做自动化烧录的可行方案。 - Nu-Link2-Pro 支持拖放烧录(按住按键插 USB 出现虚拟盘,把固件拖进去即可)与I2C 接口的 In-Line Programming, 适合产线不做治具的场景。
- Nu-Link3-Pro 是更新的型号,除调试编程外还集成了 PulseView / sigrok 逻辑分析仪功能与 ETM 指令跟踪, 做协议抓时序分析很有用。
4.2 NuEclipse 安装与配置
NuEclipse 官方以 Eclipse + GNU GCC 的形式分发,安装后基本可用,重点是三件事:
- 安装路径务必用纯英文、无空格、无中文的短路径。Eclipse 的 workspace 与工具链路径一旦包含空格或非 ASCII 字符, 编译命令行会静默失败(表现为「明明配对了却找不到头文件」)。
- 在 preferences 里指定 workspace。默认 workspace 在用户目录下,建议改成
D:/NuvotonWS这类短路径。 新唐 BSP 里有大量相对路径依赖,workspace 挪太深会让 Eclipse 的索引变慢。 - 通过「Install New Software / CMSIS Pack」装目标系列的设备支持包。
新唐的 DFP(Device Family Pack)在
OpenNuvoton/Nuvoton_Tools仓库与官网均可获取, 装上后新建工程向导里才会出现对应的系列与料号。
装完之后还要确认三件事:
- 工具链路径指向安装目录下的
arm-none-eabi-gcc,执行-v能打印版本。 Debugger里选 Nu-Link(不是 CMSIS-DAP,也不是 J-Link)。- 窗口布局:建议打开 Console(编译输出)、Memory、Expressions 三个视图,第 8 章调试全靠它们。
NuEclipse 是为 Arm 核设计的 Eclipse 发行版, 不含 C51 编译器,也不含 8051 的烧录与调试支持。 如果你维护的是 8051 线(N76 / W78 / MG51),请直接用 Keil MDK(C51 编译器), 8051 的下载与调试用 Nu-Link2 或新唐的 ICP/ISP 工具,两条链路可以并存于同一个工程目录。
4.3 Keil MDK 支持与 DFP 安装
Keil MDK 对新唐的支持分两层,务必分清:
| 层 | 对象 | 安装什么 | 注意 |
|---|---|---|---|
| DFP / Pack 层 | Cortex-M 系列 | Nuvoton CMSIS Device Family Pack(开源,Apache-2.0) | 提供 startup、system 分组、寄存器定义、SVD;装上后 µVision 里才有对应器件 |
| C51 编译器 | 8051 系列 | Keil C51(随 MDK 安装或单独授权) | 与 Nuvoton 的 8051 芯片是「编译器兼容」而非「官方包」:SFR 定义靠官方提供的头文件 / 示例工程 |
| Flash 算法(FLM) | 全部 | 新唐提供的 FLM 或 Nu-Link 的通用驱动 | 型号不匹配时会报「没有可用的 Flash Download Algorithm」 |
| 调试器驱动 | 全部 | Nu-Link driver for Keil MDK | 官方提供;装完在 Debug 设置里选 Nu-Link |
新建工程的实际步骤(对照 CH32 那套流程,新唐的差别在器件名与 FLM):
- Pack Installer 里安装 Nuvoton 的 DFP;或从官网下载
.pack后双击安装。 - µVision 里
Project → New → New Project,选正确的器件(料号必须与芯片丝印一致)。 - 选 CMSIS 风格的工程模板,让 µVision 自动带入 startup 与系统初始化。
Options for Target → Utilities → Settings → Flash Download, 选对应的 Flash 算法,并勾上Reset and Run。Options → Debug里选 Nu-Link,点右侧Settings确认 SWD 模式与主频。Options → Target里把 Xtal (MHz) 填成实际晶振频率 —— 这个值只影响调试时的时序计算,但填错会让断点位置与单步步数看起来「莫名其妙」。
4.4 IAR EWARM 与第三方 IDE
- IAR EWARM:官方提供 Nu-Link driver for IAR。流程与 Keil 类似:装驱动 → IAR 里配调试器插件 → 工程的 linker script 换成新唐 BSP 提供的
.icf。 IAR 的优势在代码优化与调试体验,代价是授权成本。 - VS Code:官方提供 NuMicro Cortex-M Pack 扩展与 NuCodeGen(代码生成)扩展,
适合已经标准化到 VS Code 的团队;调试走 CMSIS-DAP(
pyOCD)。 - 命令行 / CI:用 arm-none-eabi-gcc + 新唐定制 OpenOCD 或 pyOCD, 配合 ISPTool 或 ISPLib 做批量烧录,这是唯一能进 CI 的路径。详见第 7.6 节。
- 8051 的命令行选项:Keil C51 可以命令行编译(
C51.exe/LX51.exe/OH51.exe), 再用 NuLink Command Tool 烧录。这条链路在量产时比 GUI 稳定。
4.5 Nu-Link 驱动与固件选择
这是新唐上手第一号坑:同一个 Nu-Link2,装不同固件就是完全不同的设备。官方仓库对两种固件的描述如下:
| 固件 | 协议 / 接口 | 支持对象 | 适用场景 |
|---|---|---|---|
NuLink2FW.bin | 私有协议(MSC / VCOM / HID_ICE)或 CMSIS-DAP | 支持新唐 8051、离线烧录、用户代码读出保护、不受限的 Flash 断点、芯片特有功能(CONFIG0 / CONFIG1、Data Flash 设置、KPROM 等) | 调 8051 必须用它;需要离线量产烧录、需要读保护、需要无限 Flash 断点时用它 |
NuLink2_DAPLink.bin | 标准 CMSIS-DAP(WinUSB + WebUSB) | 通用 ARM 芯片(第三方板子、非新唐器件) | 把 Nu-Link2 当通用 CMSIS-DAP 用;接 Keil Studio;调试第三方开发板 |
官方还给出了 NU_CFG.TXT 的配置项(仅 v3.09.7380 及以后的 NuLink2FW.bin 支持这些选项):
| 选项 | 取值 | 含义 |
|---|---|---|
POWER-MODE | 由使用者设定 | SWD 输出电压等级,主要给 CMSIS-DAP 接口用。目标板是 1.8 V 时必须改,否则调试器输出 3.3 V 打坏 IO |
CMSIS-DAP | 1(默认)/ 0 | 1 = WebUSB 形态的 CMSIS-DAP,可连 Keil Studio;0 = 关掉 CMSIS-DAP,改用 USB BULK_ICE(比 HID_ICE 快) |
BRIDGE-MODE | 0(默认)/ 1 / 2 | 0 = 仅 CMSIS-DAP;1 = 启用 Nu-Link2-Bridge(VCOM 与 I2C / SPI / RS485 / CAN 透传,设备管理器里会出现虚拟串口);2 = 启用 USB HID 的 ISPTool 接口 + 透传注意:只有 BRIDGE-MODE=0 才有 CMSIS-DAP |
绝大多数情况是固件装错了:装了 NuLink2_DAPLink.bin(只支持 ARM 的标准 CMSIS-DAP),
然后去调一颗 N76E003(8051)。这类现象在设备管理器里看一切正常,
IDE 里也能看到调试器,但一 Connect 就超时。处置:换回 NuLink2FW.bin。
官方给出的固件升级方式:按住 Nu-Link2-Pro 上的按键并插 USB 线,会弹出一个虚拟盘
(如果盘名是「NuMicro MCU」,那说明你在升级目标设备固件而不是适配器固件),把 .bin 拖进盘里,重新插拔 USB 即完成。
量产与并行阶段建议直接上 Nu-Link-Gang 系列,官方定位是一对四编程, 配套 NuLink Command Tool 做批量作业。
4.6 常见安装故障
| 现象 | 原因 | 处置 |
|---|---|---|
| NuEclipse 编译报「找不到头文件」,但文件存在 | workspace 或工程路径含空格 / 中文 | 把 workspace 与工程都挪到纯英文短路径,如 D:/NuvotonWS |
| NuEclipse 卡在索引重建 | workspace 里有大量工程或放在网络盘 | 工程放本地盘;必要时 Project → Clean 后重建索引 |
| µVision 新建工程里找不到目标器件 | DFP 未安装或版本不匹配 | Pack Installer 里装 / 升级 Nuvoton DFP |
No Flash Download Algorithm | 器件型号选错,或未指定 FLM | 按芯片丝印重选器件;在 Utilities 里指定对应 Flash 算法 |
下载时提示 chip type mismatch | 工具里选的型号与实际芯片不符 | 按丝印与料号逐字核对(含封装后缀) |
| Nu-Link 在设备管理器里是未知设备 | 驱动未装或被 Windows 更新替换 | 装官方 Nu-Link 驱动;必要时手动指定 libwinusb 驱动 |
| 能识别 Nu-Link 但连不上目标 | 固件不匹配(装了 DAPLink 却要调 8051) | 换 NuLink2FW.bin,见 4.5 节 |
| Keil 调试提示 目标电压异常 | POWER-MODE 与目标板 IO 电压不匹配(1.8 V 板最常见) | 改 NU_CFG.TXT 的 POWER-MODE 后重新插拔 |
Trace 面板无输出 | 用的是 USB BULK_ICE 模式,ITM 通道不匹配 | 切回 CMSIS-DAP,或把 ITM 端口改到与 HID_ICE 匹配的通道 |
8051 工程的 C51 编译报 memory model error | data 区溢出 | 把缓冲区改到 idata / xdata,见第 6.4 节 |
| Nu-Link 能连但 ISP 模式进不去 | 自举引脚状态不对、复位时序不对 | BOOT / LD2 / CONFIG0 见第 7.5 节 |
| 杀毒软件隔离了工具 | 部分安全软件会误报编程器工具 | 把工具目录与下载目录加白名单 |
5 · 第一个工程:从新建到点亮 LED
本章的目标很具体:从零到有一个 LED 在闪,全程不超过半小时,并且每一步都有可验收的现象。 Cortex-M 与 8051 各演示一遍。
5.1 官方 BSP / EVT 例程包结构
不要从空工程开始 —— 官方 BSP 与 EVT 包已经把最容易踩的坑(时钟初始化、向量表、Flash 等待周期)都处理好了。 先跑通官方例程,再改成自己的功能,是效率最高也最不容易出错的做法。
| 包名 | 内容 | 什么时候用 |
|---|---|---|
| BSP(Cortex-M) | CMSIS 头文件、system_*.c(时钟与向量表初始化)、startup_*.c、链接脚本、Board 板级配置、外设库、驱动模板(PDMA / UART / SPI / I2C / ADC / PWM / TIMER / WDT / RTC)、NuTool 配置脚本 | 新项目一律从这里起步 |
| EVT / 例程包 | 评估板说明 + 几十个外设例程(每个外设一个最小可编译工程) | 要快速确认某个外设怎么用;官方页面按外设分类下载 |
| 8051 例程 | Keil C51 工程 + SFR 头文件 + 各外设驱动 + 官方 Nu-Link/ICP 烧录说明 | 8051 线的新项目与移植 |
| NuMaker 板资料 | 原理图 / PCB / Gerber、引脚映射、Arduino 兼容接口定义 | 画板与外设接线核对 |
官方 BSP 的典型目录(不同系列略有差异,文件名以实际包为准):
Nuvoton_BSP_<Family>/
├── BSP/ 库与驱动(按内核分目录)
│ ├── _CMSIS_/ 内核头文件与启动汇编
│ ├── _Compiler_/ 编译器相关(Keil / GCC / IAR)
│ ├── _Lib_/ 外设库源码
│ └── <Series>/ 该系列专属(链接脚本、system 文件、板级配置)
├── DevelopBoard/ 板级初始化与 Arduino 兼容接口
├── NuEclipse/ Eclipse 工程模板(.project 等)
├── MDK-IAR/ Keil 与 IAR 的工程模板
├── Pack/ CMSIS Device Family Pack(.pack)
└── Samples/
├── <Peripheral>/ 逐外设例程(每个一个独立工程)
└── Template/ 工程模板
这两样东西把「芯片内部地址布局」编码进去了:向量表在哪、APROM 从哪开始、SRAM 有多大、堆栈从哪往下长、 SRAM 的哪一块是特殊用途(如 Ethernet / USB 的 DMA 缓冲)。 自己写一份「看起来差不多」的,症状往往是「下载成功但跑飞」或者「链接报的 RAM 大小和实际不符」。 直接用 BSP 的,只改 Memory Layout 的数字。
5.2 NuEclipse 路径:新建 Cortex-M 工程
- 导入:
File → Import → Existing Projects into Workspace,选 BSP 或 EVT 里最接近你目标的例程工程。 - 改器件:如果例程是别的型号,在
Project Properties → C/C++ Build → Settings → Device里换成你的料号; Keil 工程则是Options for Target → Device。 - 改晶振:
system_*.c里的SystemCoreClock与时钟初始化要按你的实际晶振改。 这一步在 BSP 里通常被封装成宏(例如CLK_HXT/HXT_VALUE这类定义),改定义比改代码安全。 - 构建:
Ctrl+B。产物在Debug/或Output/下:.elf(含调试符号)、.hex/.bin(给烧录工具)。 - 下载:
Run → Debug,或用Download按钮只烧不调试。 - 验证:断点应停在
main()第一行;若直接跑飞,看第 8 章「调试失效定位」。
5.3 Keil MDK 路径:新建工程要点
Keil 路径与 NuEclipse 的差别集中在 「谁来生成工程结构」:
| 项目 | NuEclipse | Keil MDK |
|---|---|---|
| 新建方式 | 导入 BSP 自带工程,改器件 | New Project → 选器件 → 选 CMSIS 模板,或直接打开 BSP 的 .uvprojx |
| 器件与定义 | Properties 里改 | Options → Target → Device + Define(系列宏必须加,否则头文件里的条件编译全走错分支) |
| 包含路径 | Properties 里加 -I | Options → C51/CMSIS → Include Paths |
| 分散加载 | 链接脚本 .ld / .icf | .sct(scatter),或直接用 BSP 提供的 |
| Flash 算法 | 由 Nu-Link 固件处理 | Utilities 里显式选 FLM |
| 命令行编译 | arm-none-eabi-gcc + make | UV4.exe -b project.uvprojx -j0(量产脚本常用) |
新唐 BSP 的头文件大量用条件编译区分系列与Flash 容量档,典型形态是 #if defined(M031)、
#if (CHIP_M031)、#if __LDROM_SIZE__ 之类。
宏没定义时不会报错,而是悄悄走进另一条分支,症状是「编译通过了但寄存器配置看起来完全不对」。
迁移工程时的第一件事就是核对 Target → Define 与官方示例工程是否一致。
5.4 8051 路径:N76E003 点灯
8051 的入门链路比 Cortex-M 更短:Keil C51 + 官方 SFR 头文件 + Nu-Link2 或 ICP。下面是完整流程。
- 建立 Keil 工程:
Project → New → New Project→ 选择8051工具链 → 选一个Blank模板 → 保存为.uvproj。 - 选择设备:在
Options → Target → Device里选你手上的 8051 器件(若列表里没有,说明该器件的 pack 支持需要单独安装)。 - 加入官方 SFR 头文件与启动文件:把 BSP / 例程包里的 SFR 头文件加入工程,并确认
STARTUP.A51(或对应型号的启动文件)在列表里。 - 写代码:
#include官方头文件后,用sbit声明位变量,直接对引脚赋值。 - 配置 Flash 下载:
Utilities选 Nu-Link 或 ICP 通道;8051 侧还可以用 ISP(见第 7.5 节)。 - 验证:LED 应当按预期闪烁。若不闪,先量引脚电压(配置是否生效),再看是否进了低功耗。
5.5 点灯代码与验证现象
下面三段是「能跑起来」的最小代码。关键点不在代码本身,而在于每一步都能被观察到。
/* ================= Cortex-M:Nuvoton BSP 风格 ================= */
#include <stdio.h>
#include "NuMicro.h"
#define LED_PIN PA15
#define LED_ON 0 /* 该系列板载LED 低电平点亮 */
int main(void)
{
/* 官方 SystemInit 已在 startup 中调用:时钟 / 向量表 / Flash 等待周期都配好了 */
GPIO_SetMode(GPIOA, BIT15, GPIO_PMD_OUTPUT); /* 配置为推挽输出 */
while (1) {
GPIO_SetBits(GPIOA, BIT15); /* 亮 */
delay_ms(500); /* 用 BSP 提供的延时函数 */
GPIO_ClearBits(GPIOA, BIT15); /* 灭 */
delay_ms(500);
}
}
对应的 8051 版本 —— 注意它比 Cortex 短得多,而且位变量声明本身就完成了引脚配置:
/* ================= 8051:N76E003 等 ================= */
#include <N76E003.H> /* 官方 SFR 头文件 */
#include "Delay.h"
/* sbit 让 LED 落在可位寻址区,赋值是一条指令,且是原子的 */
sbit LED = P1^3;
void main(void)
{
/* 端口方向:把 P1.3 配成推挽输出 */
P1 |=0x08; /* 或用官方要求的 P1MOD / PxPMOD 配置寄存器写法 */
while (1) {
LED = 0;Delay_ms(500);
LED = 1; Delay_ms(500);
}
}
① 能编译出.elf 与 .hex,无 warning 级别的型号相关警告;
② 下载工具提示校验通过 / Verify OK;
③ 断点能停在 main() 第一行;
④ LED 以肉眼可见的节奏闪烁;
⑤ 用示波器或逻辑分析仪量到引脚上的方波;
⑥ 单步执行时串口能打印出内容(第 8.3 节的重定向)。
六条里有任何一条做不到,不要往下走 —— 每一层都有自己的典型故障(见第 18 章)。
5.6 三条路径的验收清单
| 路径 | 创建工程 | 编译产物 | 烧录工具 | 调试 | 最易错的一步 |
|---|---|---|---|---|---|
| NuEclipse + Nu-Link2 | 导入 BSP 工程 → 改器件 | .elf / .hex | IDE 内一键 | CMSIS-DAP 或私有协议 | 路径含中文/空格 |
| Keil MDK + Nu-Link | New Project → 选器件 → CMSIS 模板 | .axf / .hex | Debug → Download(需选 FLM) | Nu-Link 驱动 | 缺系列宏导致条件编译走错分支 |
| Keil C51 + Nu-Link2 | New Project → 8051 → Blank | .hex / .bin | Nu-Link2(必须 NuLink2FW.bin)或 ICP / ISP | C51 调试器 | 固件装成 DAPLink,导致连不上 |
| 命令行 + CI | 沿用 BSP 目录结构 | .hex / .bin | ISPTool / ISPLib / OpenOCD / pyOCD | 按需 | Nu-Link 被 GUI 工具独占 |