OUT / 02 · 移植差异表 · 样张
移植差异表 · 样张:迁到 STM32C531,目标芯片这一侧必须重新设计的 11 处
一个电源类控制板从某国产 Cortex-M4 MCU 迁到 STM32C531。动代码之前,先把两颗芯片逐项比对:哪些能直接搬、哪些要重写、哪些会卡住。这份样张列出 STM32C531 这一侧必须重新设计的 11 处,每条附手册页码或设备头文件、迁移动作和客户要验证的内容。其中 2 处最初的差异分析漏掉了,是上板验证时才抓到的,照实写出。
这份差异表解决什么问题
- 动代码之前知道路有多长:哪些是改个寄存器名的机械替换,哪些要整块重写,哪些会被硬件卡住、需要客户改板或拍板。
- 每条都能回到出处:结论来自参考手册、数据手册或芯片的设备头文件,写到页码或文件。
- 每条都有下一步:迁移动作写清改什么;客户验证项写清要客户在板上确认什么。
- 决定移植顺序:按严重度和依赖关系排出九步:时钟 → GPIO → 时基 → 串口 → ADC → DMA → FLASH → PWM → 控制环。先打地基,后上功率。
差异表的起点是工程资源基线:老工程实际用了哪些外设、在新芯片上各落到哪里,见 OUT/01 样张。
一条差异写成什么样
以「LQFP48 第 22 脚」为例,完整格式如下:
| 现象 | 源芯片上这个脚位是普通 IO,原设计在这里接了一路输入捕获信号;STM32C531 的 LQFP48 第 22 脚是 VCAP(内部稳压器的外接电容脚),不能当 IO 用 |
| 依据 | DS15125 Rev 2 引脚表,第 41 页 |
| 影响 | 这路信号在新芯片上没有地方接,属于硬件阻断 |
| 迁移动作 | 硬件把信号改接到相邻一个有同一定时器通道的脚;软件的捕获通道随之从 CH4 改为 CH3,捕获寄存器、通道配置一起改 |
| 客户验证项 | PCB 是否确已改线;新通道能否复现原来的测量逻辑 |
| 严重度 | 高 |
目标芯片这一侧的 11 处差异
| # | 差异 | 依据 | 迁移动作 | 严重度 |
|---|---|---|---|---|
| 1 | 没有 PLL。系统时钟只有四个来源:HSIS、HSIDIV3、PSIS、HSE | RM0522 Rev 1 §9.4,第 254 页 | 时钟初始化整段重写,144 MHz 改由 PSIS 以外部 8 MHz 晶振为参考生成 | 高 |
| 2 | 所有定时器(LPTIM 除外)都走 HCLK,与各自的 APB 分频无关 | 同上,第 254 页注释 | 全部定时器的预分频、重装值按 144 MHz 重新计算,不能照搬源芯片按 APB 时钟算出来的常数 | 中 |
| 3 | 144 MHz 需要 4 个等待周期,外加编程延迟参数 WRHIGHFREQ = 10 | RM0522 §6(FLASH)Table 20,第 132 页 | 提频前先写 FLASH 等待周期并读回确认,再切时钟 | 中 |
| 4 | 只有一个 ADC。源芯片有两个 ADC,原设计用的是双 ADC 同步采样 | 设备头文件 stm32c531xx.h:只定义 ADC1 | 改为单 ADC 多通道扫描(6 通道),数据布局和中断里的取数逻辑一起改 | 高 |
| 5 | 只有 LPDMA,没有传统 DMA;LPDMA 按链表方式组织传输 | 同一头文件:只定义 LPDMA1 / LPDMA2;RM0522 §14.1,第 382 页 | ADC 搬运、串口收发的 DMA 全部重写,用 LL 库配置 | 高 |
| 6 | 没有 TIM3 / TIM4 / TIM5,只有 TIM1、2、6、7、8、12、15 | 同一头文件的定时器实例定义 | 1 ms、2 ms 两个周期任务改用 TIM6、TIM12 | 中 |
| 7 | LQFP48 第 22 脚是 VCAP | DS15125 Rev 2,第 41 页 | 见上一节的完整示例 | 高 |
| 8 | SWD 脚不能复用成串口。PA13 / PA14 除调试功能外,只有 COMP1_OUT、EVENTOUT;源芯片允许把这两个脚重映射成串口 | DS15125 Rev 2 Table 12,第 46 页 | 改用 USART1 的一对空闲引脚;删掉源工程里把 SWD 脚改成串口的那段代码 | 高 |
| 9 | ADC1_IN7 由两个引脚共用,复位默认接 PA7 | RM0522 §12.5.4,第 363 页 | 初始化时置 SBS_PMCR.ADC1_IN7_REMAP,详见 CASE/01 | 高 |
| 10 | FLASH 以 128 位为单位编程,不足 128 位要用 FW 位强制提交;每页 8 KB、每个 bank 16 页,擦除要选 bank | RM0522 §6.3.5,第 133 页;头文件 FLASH_PAGE_SIZE = 0x2000、FLASH_PAGE_NB_MAX = 0x10 | 参数存储的擦除与编程整段重写 | 高 |
| 11 | RAM 为 64 KB(SRAM1 32 KB + SRAM2 32 KB) | 头文件 SRAM1_SIZE / SRAM2_SIZE | 编译后实测静态占用约 4 KB,余量充足;顺带把只有 1 KB 的栈扩到 8 KB | 低 |
另有一类属于机械替换:寄存器名、中断向量名、启动文件不同,逐外设建对照表即可,没有设计风险,不单列。
最初漏掉、上板才抓到的 2 处
差异表是在动代码之前写的。第 9、10 两条,最初的版本没有写到这个深度:
- 第 9 条:最初只记了「IN7 = PB1」,没有注意到数据手册引脚表里 PA7 和 PB1 都写着 ADC1_IN7。结果在开发板上表现为读数卡死、过压保护误动作,完整过程见 CASE/01。
- 第 10 条:最初按「每页 2 KB」的常见页大小写了擦除寻址,也没有写强制提交。结果是参数第二次保存就会损坏参数区。
两处都在同族开发板的预验证阶段抓到并修掉了,见 OUT/03 样张。教训写回了差异表的做法:
- 数据手册里同一个通道出现在两个引脚上,就一定有选择寄存器,要追到参考手册落实默认值。
- 页大小、编程粒度这类「各系列都差不多」的参数,必须按目标芯片的手册和头文件逐项核对,不能按其他系列的经验推断。
验证边界
| 项 | 状态 |
|---|---|
| 11 处差异本身 | 手册原文 设备头文件 |
| 针对这些差异的迁移动作 | 同族开发板已验证 NUCLEO-C542RC 上逐步验证通过(见 OUT/03) |
| 功率级、真实模拟前端相关的差异影响 | 未测 留客户板 |
| 客户 STM32C531 板 | 样板未到 未测 |
结论—依据—验证状态对照
| # | 结论 | 依据 | 类型 |
|---|---|---|---|
| 1 | 没有 PLL,系统时钟四个来源 | RM0522 Rev 1 §9.4,第 254 页 | 手册原文 |
| 2 | 定时器(LPTIM 除外)都走 HCLK | 同上,第 254 页 | 手册原文 |
| 3 | 144 MHz 需 4 等待周期 + WRHIGHFREQ = 10 | RM0522 Table 20,第 132 页 | 手册原文 |
| 4 | 只有 ADC1、只有 LPDMA1/2、没有 TIM3/4/5 | STM32C5 DFP 设备头文件 stm32c531xx.h 的外设实例定义 | 设备头文件 |
| 5 | LPDMA 按链表组织传输 | RM0522 §14.1,第 382 页 | 手册原文 |
| 6 | LQFP48 第 22 脚是 VCAP | DS15125 Rev 2,第 41 页 | 手册原文 |
| 7 | PA13 / PA14 没有串口复用功能 | DS15125 Rev 2 Table 12,第 46 页 | 手册原文 |
| 8 | ADC1_IN7 双引脚,复位默认 PA7 | RM0522 §12.5.4,第 363 页 | 手册原文 |
| 9 | FLASH 128 位编程粒度,FW 位强制提交 | RM0522 §6.3.5,第 133 页 | 手册原文 |
| 10 | FLASH 每页 8 KB、每 bank 16 页 | stm32c531xx.h 的 FLASH_PAGE_SIZE / FLASH_PAGE_NB_MAX | 设备头文件 |
| 11 | 迁移动作在同族开发板上验证通过 | 见 OUT/03 | 实测 |
| 12 | 客户板上全部成立 | — | 未验证 |
「实测」指在 NUCLEO-C542RC 同族开发板上完成。
准备换料或移植
准备换料或移植、想先知道路有多长,发来这几项就能开始:源芯片与目标芯片的完整型号和封装、老工程(或至少外设使用清单)、原理图、哪些引脚和功能不能动。