OUT / 01 · 工程资源基线 · 样张
工程资源基线 · 样张:动代码之前,先摸清老工程用了什么
一个电源类控制板要从某国产 Cortex-M4 MCU 迁到 STM32C531。第一步不改代码,先扫一遍老工程源码、目标工程骨架、硬件引脚表和芯片资料,出一份资源基线:老工程实际用了哪些定时器、ADC、DMA、中断,在新芯片上各自落到哪里,哪些还拿不准。这份样张节选外设级的部分,并照实写出基线之后被修正或补上的 4 处。
这份基线解决什么问题
扫描什么,不扫什么
| 扫描对象 | 看什么 |
|---|---|
| 老工程应用层源码 | 外设初始化、中断服务函数、DMA 通道、时钟配置,以及哪些函数实际没被调用 |
| 目标工程骨架(CubeMX 生成) | 已经规划了哪些外设,配到了什么程度 |
| 硬件团队的引脚对照表 | 48 个脚在两颗芯片上各是什么功能,逐脚对照 |
| 目标芯片的设备头文件、数据手册、参考手册 | 外设实例有没有、引脚复用功能、存储容量 |
不扫:构建产物、CubeMX 生成的初始化中间文件(其中引脚宏头文件例外,只当查阅来源)、版本库和编辑器目录。逻辑分析只基于源码和一手资料。生成文件是工具按配置产出的中间结果,不能当依据。
产出什么
| 产出 | 用途 |
|---|---|
| 工程结构图 | 应用逻辑放在哪、中断服务写在哪,决定移植时怎么拆模块 |
| 外设资源对比 | 老工程用到的和新芯片有的,逐类对比 |
| 引脚对照表 | 逐脚对照,三方交叉核对:硬件表、老工程的引脚初始化代码、目标工程骨架 |
| 中断关系表 | 每个中断负责什么,在新芯片上对应哪个 |
| DMA 通道表 | 每路 DMA 搬什么数据 |
| 时钟树 | 老工程各外设的时钟从哪来,新芯片能否复现 |
| 寄存器对照框架 | 先定外设级、中断级映射;位域留空,标「待查」 |
| 风险评估 | 9 项,其中 3 项是架构级 |
| 待客户确认清单 | 动代码之前需要客户回答的问题 |
每条结论都标可信度
| 标记 | 含义 | 例子 |
|---|---|---|
| 已确认 | 来自源码、引脚表、设备头文件或手册原文 | 目标芯片只有 ADC1(设备头文件) |
| 推断 | 有旁证,但没查到直接依据 | 老工程的 1 ms 节拍改用 TIM6(旁证是 CubeMX 骨架里已经建了 TIM6) |
| 待查 | 还没查 | 寄存器位域;时钟怎样倍频到 144 MHz |
有一条硬规矩:寄存器位域一律先标「待查」,到对应的移植步骤查过参考手册再填,不拿其他 STM32 系列的经验预填。
节选一:外设级资源汇总
| 资源 | 老工程用到的 | STM32C531 上有的 | 基线结论 | 可信度 |
|---|---|---|---|---|
| 定时器 | 5 个:1 个出 PWM,1 个输入捕获,2 个周期节拍(1 ms / 2 ms),另有 1 个只出现在一个未被调用的函数里 | TIM1、2、6、7、8、12、15,外加 LPTIM1;没有 TIM3、4、5 | PWM 和输入捕获保留原实例;3 个节拍定时器换实例 | 已确认 |
| ADC | 两个 ADC 同步采样,共 6 路 | 只有 ADC1 | 6 路并到一个 ADC 上扫描 | 已确认 |
| DMA | 3 路:ADC 搬运、串口发送、串口接收 | 只有 LPDMA1、LPDMA2 | 全部重写 | 已确认 |
| 串口 | 1 路;原设计把调试口的两个脚复用成串口 | USART1、2,UART4、5,LPUART1 | 调试口两个脚在新芯片上没有串口复用功能,要换引脚,涉及 PCB | 已确认 |
| 运放 | 1 个内部运放,输出进 ADC | OPAMP1 | 保留;引脚变动随引脚对照表处理 | 已确认 |
| 主频 | 144 MHz | 最高 144 MHz | 能达到,但所有定时常数要按新时钟重算;怎样倍频待查 | 已确认 待查 |
| Flash | 与目标相同 | 256 KB | 不构成约束 | 已确认 |
| RAM | (不列) | 64 KB | 老工程里有几个大数组,列为风险,请客户确认余量 | 待查 |
节选二:中断关系
老工程注册了 7 个外设中断服务函数;迁移后是 6 个。
| 老工程的中断 | 负责什么 | 在 STM32C531 上 |
|---|---|---|
| PWM 定时器更新中断(优先级最高) | 主控制:每个 PWM 周期内采样、保护、控制计算 | TIM1 更新中断,改名 |
| 输入捕获定时器 | 测一路外部信号 | TIM2,捕获通道随引脚改变(见 OUT/02 第 7 条) |
| 节拍定时器 A | 1 ms 周期任务 | 改用 TIM6 |
| 节拍定时器 B | 2 ms 周期任务 | 改用 TIM12 |
| 串口 | 空闲中断收帧,重启接收 DMA | 改用 USART1 |
| DMA(ADC 搬运完成) | 只清标志 | LPDMA1 通道 0;在传输完成中断里重新装载,继续下一轮 |
| ADC | 只清标志,没有实际工作 | 不再开启 |
扫描当场发现、直接改变移植方式的 3 件事
- 老工程的全部应用逻辑和中断服务都写在一个主文件里(约 1800 行),中断服务文件只是空壳。 不能按文件搬,先按外设拆模块:时钟、GPIO、定时器、串口、ADC、DMA、FLASH、PWM、控制,各成一个文件。
- 目标工程骨架只配了一半。 CubeMX 给 PWM 定时器只配了刹车输入脚,4 路 PWM 输出脚的复用功能都没配。所以骨架不能当成「已配好」,要逐个外设核对。
- RAM 只有 64 KB,老工程里有几个大数组。 基线把它列为风险。编译后实测静态占用约 4 KB,风险关闭;顺带把模板默认 1 KB 的栈扩到 8 KB。
基线之后被修正或补上的 4 处
基线是动代码之前写的,后续每一步发现的新情况都回填进来。其中 4 处改动了基线原来的结论:
| # | 基线原来怎么写 | 后来发现 | 怎么发现的 |
|---|---|---|---|
| 1 | 144 MHz 能达到;怎样倍频标「待查」 | 目标芯片没有 PLL,系统时钟只有四个来源,144 MHz 改用 PSIS 以外部晶振为参考生成 | 同一天做时钟那一步,查参考手册 |
| 2 | 移植顺序里没有「参数存储」 | 老工程会擦写 FLASH 保存校准参数,这一块必须移植 | 同一天重排移植顺序时,回到源码核对后补上 |
| 3 | 那个只在未调用函数里出现的定时器,记成「中断,疑似未启用」 | 全工程查调用点,那个函数 0 处调用;而且它是轮询标志位,不走中断 | 做控制环之前逐个查调用点。处理:原样移植、保持不调用,与老工程一致 |
| 4 | 引脚表里某个 ADC 通道只对到一个脚 | 这个通道在新芯片上由两个脚共用,复位默认接另一个脚 | 同族开发板上板时抓到,见 CASE/01 |
教训写回了做法:
- 拿不准的标「待查」,不要按经验填。第 1 处当时标的是待查,第一步就查了出来,没有把错误带到后面。
- 引脚对照要多问一句:这个功能是不是只在这个脚上。第 4 处只核对了「这个脚有没有这个功能」。
- 「疑似」要落到调用点。第 3 处如果当作死代码直接删掉,或者当作重要功能移植并启用,都会和老工程的实际行为不一致。
验证边界
| 项 | 状态 |
|---|---|
| 外设实例、存储容量、引脚复用功能 | 设备头文件 手册原文 |
| 老工程用了什么 | 源码 逐项核对:初始化代码、中断服务函数、调用点 |
| 基线里的推断(定时器替代、DMA 通道分配) | 同族开发板已验证 后续步骤已落地,在 NUCLEO-C542RC 上验证通过(见 OUT/03) |
| 客户 STM32C531 板 | 样板未到 未测 |
结论—依据—验证状态对照
| # | 结论 | 依据 | 类型 |
|---|---|---|---|
| 1 | 只有 ADC1;只有 LPDMA1、LPDMA2;定时器为 TIM1、2、6、7、8、12、15 和 LPTIM1 | STM32C5 DFP 设备头文件 stm32c531xx.h 的外设实例定义 | 设备头文件 |
| 2 | 串口实例为 USART1、2,UART4、5,LPUART1 | 同上 | 设备头文件 |
| 3 | Flash 256 KB;RAM 64 KB(SRAM1 32 KB + SRAM2 32 KB) | regions_STM32C531CCT6.h;stm32c531xx.h 的 SRAM1_SIZE、SRAM2_SIZE | 设备头文件 |
| 4 | 调试口两个脚没有串口复用功能 | DS15125 Rev 2 Table 12,第 46 页 | 手册原文 |
| 5 | 系统时钟四个来源,没有 PLL;定时器(LPTIM 除外)走 HCLK | RM0522 Rev 1 §9.4,第 254 页 | 手册原文 |
| 6 | 老工程 7 个外设中断服务、3 路 DMA、5 个定时器、2 个 ADC | 老工程源码逐项核对 | 源码 |
| 7 | 那个定时器所在的函数 0 处调用,且为轮询 | 全工程查调用点 | 源码 |
| 8 | 静态 RAM 占用约 4 KB | 编译产物的段信息 | 实测 |
| 9 | 定时器替代、DMA 通道分配可行 | 后续步骤在同族开发板上验证,见 OUT/03 | 实测 |
| 10 | 客户板上全部成立 | — | 未验证 |
第 8 条的「实测」是读编译产物;第 9 条的「实测」指在 NUCLEO-C542RC 同族开发板上完成。
准备换料或移植
准备换料或移植、想先摸清老工程,发来这几项就能开始:老工程完整源码(能编译的那份)、原理图或引脚表、目标芯片的完整型号和封装、哪些功能必须保留。