4. C2000开发环境与工程框架搭建

储能变流器(PCS)控制器的软件不是从写 main() 开始的,而是从“环境—工程—外设—下载”这条链路开始的。C2000 的典型开发组合是 Code Composer Studio(CCS)加 SysConfig:CCS 负责编译、链接、调试与烧录,SysConfig 负责把芯片引脚、时钟、外设参数变成可编译的 C 代码。本节以 TMS320F28379D(或同系列 F2837x)为例,说明如何把这条链路搭稳。

一、CCS 与编译器、器件支持包的准备

安装 CCS 时建议选择 C2000 系列支持,并确认三件事:一是 C2000Ware 已安装(提供驱动库、例程、链接命令文件),二是编译器版本与工程匹配(TI v22.6.x 或 v21.6.x 均可,但同一工程内不要混用),三是仿真器驱动正常(XDS100v2/XDS110/XDS200 对应不同调试探针)。判断是否就绪,最直接的方法是导入一个官方例程并成功编译:在 CCS 中 Project → Import CCS Projects,选择 C2000Ware 下的 device_support/f2837xd/examples/cpu1 中的 gpio_toggle 或 sci_echoback,编译无错误即说明工具链完整。

工程属性里需要重点核对:Build → C2000 Compiler → Include Options 是否包含 C2000Ware 的 common/include 与 headers/include;File Search Path 是否包含对应的 .lib(如 driverlib.lib);Linker → File Search Path 是否指向正确的 .cmd(F2837xD 常用 2837xD_RAM_lnk_cpu1.cmd 用于 RAM 调试,F2837xD.cmd 用于 Flash 固化)。这三处错一处,现象通常是“编译过、链接报未定义符号”或“下载后不运行”。

二、SysConfig 的配置方式与生成物

SysConfig 有两种使用形态:独立 GUI 和 CCS 内嵌的 .syscfg 文件。推荐在工程内新建 empty.syscfg,双击打开图形界面。配置顺序建议按“时钟—引脚—外设—中断”推进:先在 Clock 中设定晶振频率(示例取 20 MHz 外部晶振)与 PLL 倍频,使 SYSCLK 达到 200 MHz;再在 GPIO 中分配引脚功能,例如把 GPIO0/GPIO1 配为 SCI-A 的 RX/TX,把 GPIO2 配为 EPWM1A;最后在 EPWM、ADC、SCI 模块中填写周期、分频、触发源等参数。

SysConfig 的产物是 ti_drivers_config.c/h 与 board.c/h,它们由构建过程自动生成,不要手工修改。工程中通过 #include "board.h" 和 #include "ti_drivers_config.h" 使用其中的句柄与初始化函数。一个常见误区是把 SysConfig 生成的初始化代码和手写寄存器配置混用,导致同一外设被配置两次;正确做法是:能用 SysConfig 表达的,全部交给它;SysConfig 不支持的位域,再在 main() 中补充。

C2000 工程框架与外设初始化链路(F2837x 示例) 工程目录组织 PCS_Project/ ├─ main.c(调度入口) ├─ pcs_control.c/.h(控制环) ├─ pcs_protect.c/.h(保护) ├─ empty.syscfg(图形配置) ├─ ti_drivers_config.c/h(生成) ├─ 2837xD_RAM_lnk_cpu1.cmd ├─ F2837xD.cmd(Flash 固化) ├─ C2000Ware 库(只读引用) └─ Debug/ Release/(输出) 原则:业务代码与生成代码分离 生成文件不手改,库文件不复制 SysConfig 配置顺序 ① Clock:20 MHz 晶振 → PLL SYSCLK = 200 MHz,SYSCLKOUT 分频 ② GPIO:引脚复用分配 GPIO0/1→SCI-A,GPIO2→EPWM1A ③ 外设:EPWM / ADC / SCI 周期、分频、触发源、采样窗口 ④ 中断:PIE 通道与优先级 EPWM1_INT → PIE 组 3 通道 1 生成:ti_drivers_config.c/h board.c/h,随构建自动刷新 配置即代码:图形改动 → 重新编译 禁止手改生成文件,避免被覆盖 初始化流程与调试烧录 Device_init() → 关看门狗、设 PLL Device_initGPIO() → 引脚方向/复用 Interrupt_initModule/CPU() board_init() → 调用 SysConfig 初始化 EINT / ERTM → 开全局中断 while(1) 后台循环 + ISR 实时任务 调试:RAM 运行 + 断点/实时变量 烧录:Flash 固化 + 复位自启动

三、外设初始化流程:从复位到主循环

F2837x 的初始化有固定次序,顺序错了会出现“中断进不去”或“外设不响应”。典型骨架如下:

void main(void)
{
    Device_init();              // 关看门狗、配置 PLL、使能外设时钟
    Device_initGPIO();          // 配置 GPIO 复用与方向
    Interrupt_initModule();     // 初始化 PIE 向量表
    Interrupt_initVectorTable();
    board_init();               // SysConfig 生成的外设初始化
    EINT; ERTM;                 // 使能全局中断与实时中断
    for(;;) { PCS_backgroundTask(); }
}

其中 board_init() 是 SysConfig 的入口,它会依次调用 EPWM_init()、ADC_init()、SCI_init() 等。中断服务函数用 __interrupt void epwm1_isr(void) 定义,并在 PieVectTable.EPWM1_INT 中注册,最后必须写 Interrupt_clearACKGroup() 清除应答,否则只会进一次中断。判断初始化是否成功,可在 board_init() 后翻转一个测试 GPIO,用示波器观察是否有方波;若有,说明时钟与 GPIO 已通。

四、调试与烧录:RAM 与 Flash 两条路径

调试阶段建议使用 RAM 链接文件,把程序加载到 RAM 运行,速度快、可反复下断点、可实时刷新变量(Expressions 窗口 + Continuous Refresh)。操作流程是:Run → Debug 进入调试视图,Run → Load 下载,Run → Resume 运行,Suspend 暂停后查看变量。若要在中断里观察 PWM 占空比变化,可在 ISR 中把 EPWM_setCounterCompareValue() 的入参加入 Watch 窗口,实时观察数值随负载变化。

产品验证阶段切换到 Flash 链接文件,通过 Run → Load 烧写,断电重启后程序从 Flash 自启动。烧录前需确认 F2837xD.cmd 中 Flash 段地址与芯片型号一致,且 Boot Mode 引脚(GPIO72/GPIO84)配置为 Flash 启动。若烧录后不运行,优先检查:链接文件是否误用 RAM 版本、看门狗是否被意外复位、board_init() 是否在 EINT 之前完成。一个可复现的验证方法是:烧录后让 GPIO2 输出 1 kHz 方波,用示波器测量频率与占空比,与 SysConfig 中 EPWM 的设定值比对,偏差在允许范围内即认为烧录与初始化链路正确。

建议把“RAM 调试工程”和“Flash 发布工程”做成两个 Build Configuration,共用同一套源码,只切换 .cmd 与优化等级,避免手工改链接文件带来的低级错误。
SysConfig 生成的 ti_drivers_config.c/h 会在每次构建时重新生成,任何手工修改都会在下次编译时丢失;需要补充的寄存器操作应写在独立的 pcs_hal.c 中。