← 返回作品区 JonTan

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、5PWM 和输入捕获保留原实例;3 个节拍定时器换实例已确认
ADC两个 ADC 同步采样,共 6 路只有 ADC16 路并到一个 ADC 上扫描已确认
DMA3 路:ADC 搬运、串口发送、串口接收只有 LPDMA1、LPDMA2全部重写已确认
串口1 路;原设计把调试口的两个脚复用成串口USART1、2,UART4、5,LPUART1调试口两个脚在新芯片上没有串口复用功能,要换引脚,涉及 PCB已确认
运放1 个内部运放,输出进 ADCOPAMP1保留;引脚变动随引脚对照表处理已确认
主频144 MHz最高 144 MHz能达到,但所有定时常数要按新时钟重算;怎样倍频待⁠查已确认 待查
Flash与目标相同256 KB不构成约束已确认
RAM(不列)64 KB老工程里有几个大数组,列为风险,请客户确认余量待查

节选二:中断关系

老工程注册了 7 个外设中断服务函数;迁移后是 6 个。

老工程的中断负责什么在 STM32C531 上
PWM 定时器更新中断(优先级最高)主控制:每个 PWM 周期内采样、保护、控制计算TIM1 更新中断,改名
输入捕获定时器测一路外部信号TIM2,捕获通道随引脚改变(见 OUT/02 第 7 条)
节拍定时器 A1 ms 周期任务改用 TIM6
节拍定时器 B2 ms 周期任务改用 TIM12
串口空闲中断收帧,重启接收 DMA改用 USART1
DMA(ADC 搬运完成)只清标志LPDMA1 通道 0;在传输完成中断里重新装载,继续下一轮
ADC只清标志,没有实际工作不再开启

扫描当场发现、直接改变移植方式的 3 件事

  1. 老工程的全部应用逻辑和中断服务都写在一个主文件里(约 1800 行),中断服务文件只是空⁠壳。 不能按文件搬,先按外设拆模块:时钟、GPIO、定时器、串口、ADC、DMA、FLASH、PWM、控制,各成一个文件。
  2. 目标工程骨架只配了一半。 CubeMX 给 PWM 定时器只配了刹车输入脚,4 路 PWM 输出脚的复用功能都没配。所以骨架不能当成「已配好」,要逐个外设核对。
  3. RAM 只有 64 KB,老工程里有几个大数组。 基线把它列为风险。编译后实测静态占用约 4 KB,风险关闭;顺带把模板默认 1 KB 的栈扩到 8 KB。

基线之后被修正或补上的 4 处

基线是动代码之前写的,后续每一步发现的新情况都回填进来。其中 4 处改动了基线原来的结论:

#基线原来怎么写后来发现怎么发现的
1144 MHz 能达到;怎样倍频标「待查」目标芯片没有 PLL,系统时钟只有四个来源,144 MHz 改用 PSIS 以外部晶振为参考生成同一天做时钟那一步,查参考手册
2移植顺序里没有「参数存储」老工程会擦写 FLASH 保存校准参数,这一块必须移植同一天重排移植顺序时,回到源码核对后补上
3那个只在未调用函数里出现的定时器,记成「中断,疑似未启用」全工程查调用点,那个函数 0 处调用;而且它是轮询标志位,不走中断做控制环之前逐个查调用点。处理:原样移植、保持不调用,与老工程一致
4引脚表里某个 ADC 通道只对到一个脚这个通道在新芯片上由两个脚共用,复位默认接另一个脚同族开发板上板时抓到,见 CASE/01

教训写回了做法:

  1. 拿不准的标「待查」,不要按经验填。第 1 处当时标的是待查,第一步就查了出来,没有把错误带到后面。
  2. 引脚对照要多问一句:这个功能是不是只在这个脚上。第 4 处只核对了「这个脚有没有这个功能」。
  3. 「疑似」要落到调用点。第 3 处如果当作死代码直接删掉,或者当作重要功能移植并启用,都会和老工程的实际行为不一致。

验证边界

项状态
外设实例、存储容量、引脚复用功能设备头文件 手册原文
老工程用了什么源码 逐项核对:初始化代码、中断服务函数、调用点
基线里的推断(定时器替代、DMA 通道分配)同族开发板已验证 后续步骤已落地,在 NUCLEO-C542RC 上验证通过(见 OUT/03)
客户 STM32C531 板样板未到 未测

结论—依据—验证状态对照

#结论依据类型
1只有 ADC1;只有 LPDMA1、LPDMA2;定时器为 TIM1、2、6、7、8、12、15 和 LPTIM1STM32C5 DFP 设备头文件 stm32c531xx.h 的外设实例定义设备头文件
2串口实例为 USART1、2,UART4、5,LPUART1同上设备头文件
3Flash 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 除外)走 HCLKRM0522 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 同族开发板上完成。

准备换料或移植

准备换料或移植、想先摸清老工程,发来这几项就能开始:老工程完整源码(能编译的那份)、原理图或引脚表、目标芯片的完整型号和封装、哪些功能必须保留。