参考大佬的文章:TMS320F280039系列文章之第一章 新建工程_280039新建工程-CSDN博客TMS320F280049系列文章之第二章 新建工程(注意:代码移植时,索引路径需要重新设置(绝对地址))_ccs 开发 tms320f280049-CSDN博客参考大佬的文章:TMS320F280049系列文章之第二章 新建工程(注意:代码移植时,索引路径需要重新设置(绝对地址))_ccs 开发 tms320f280049-CSDN博客

在此基础上 搭建属于自己的工程:

第一步:我在workspace下新建一个工程:

第二步:配置选项

在此F280039C_Template_Project里面新建CCS Project;命名为F280039C_Template_M2

是选eabi还是COFF;我们选择eabi,好像跟输出有关的;

先初步看一下大概长这个样子:

类似于这种;下面 我们就要新建文件,注入灵魂;

第三步:新建文件夹:

f28003x_common文件夹:

f28003x_driverlib文件夹:

就是把SDK里面的CCS东西全都copy过来!

include包含:

source里面包含:

f28003x_headers文件夹:

include包含:

source包含:

lib文件夹:

source文件夹:

用来存放自己的东西 和自己写的外设驱动

Application 用来存在main 和 上层应用

Drivers 用来存放自己写的驱动

FlashAPI_F28003x

注意加入:两个头文件:

第四步 包含路径:

第五步 调试:

不让一些东西编译 ,因为我们分了没有操作系统 有操作系统 刷到flash 还是刷到RAM中 

比如:

刷到flash 还是刷到RAM中

没有操作系统 有操作系统  是eabi还是coff

其实对于 28003x_generic_flash_lnk.cmd和28003x_generic_ram_lnk.cmd,我们这样操作 

Debug模式下

这一块在改一下 加入这个lib的路径 ,为烧入FLASH

  • flash_lnk.cmd​仅定义代码在 Flash 中的存放位置​​,而 FAPI_F28003x_EABI_v1.58.10.lib​提供实际写入 Flash 的函数​​。

  • 两者需配合使用:链接文件告诉编译器“代码放哪”,库文件告诉烧录工具“怎么放”。(第七步有详细解释)

为什么需要加入这一行呢:

在device.c里面:

#ifdef _FLASH
#ifndef CMDTOOL
    //
    // Copy time critical code and flash setup code to RAM. This includes the
    // following functions: InitFlash();
    //
    // The RamfuncsLoadStart, RamfuncsLoadSize, and RamfuncsRunStart symbols
    // are created by the linker. Refer to the device .cmd file.
    //
    memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (size_t)&RamfuncsLoadSize);
#endif
    //
    // Call Flash Initialization to setup flash waitstates. This function must
    // reside in RAM.
    //
    Flash_initModule(FLASH0CTRL_BASE, FLASH0ECC_BASE, DEVICE_FLASH_WAITSTATES);
#endif

这里可以看到 如果不定义_FLASH 就跳过FLSH的操作了


Relase模式下

同理 在Relase模式下 我不编译28003x_generic_flash_lnk.cmd:请看下图:

注意 : 两种模式下都要包含头文件路径啊

如果你使用 28003x_generic_ram_lnk.cmd(RAM 链接文件),就不需要定义 _FLASH宏​​,因为此时所有代码都直接在 RAM 中运行,不需要处理 Flash 相关的初始化逻辑。以下是详细解释:


​1. 为什么 RAM 模式下不需要 _FLASH?​
​(1) 代码直接在 RAM 中运行​
  • 28003x_generic_ram_lnk.cmd​ 会将所有代码(.text)、常量数据(.cinit.const)直接分配到 ​​RAM 地址空间​​(如 RAMLS0RAML0)。

  • ​CPU 直接从 RAM 取指执行​​,无需配置 Flash 等待周期或复制代码到 RAM。

​(2) 不需要 Flash 初始化​
  • InitFlash()Flash_initModule()​ 是专门为 Flash 运行模式设计的,在 RAM 模式下不会被调用(即使定义了 _FLASH也不会生效)。

  • memcpy复制 ramfuncs段的操作​​ 在 RAM 模式下是多余的,因为代码本身就在 RAM 中。

​(3) 启动流程更简单​
  • 芯片上电后,仿真器(如 XDS100)会直接将程序下载到 RAM,并跳转到 RAM 中的入口地址执行。

  • ​不需要依赖 BootROM 从 Flash 加载代码​​,因此无需 _FLASH宏来适配启动流程。


​2. 对比 Flash 模式 vs. RAM 模式​

​特性​

​Flash 模式(28003x_generic_flash_lnk.cmd)​

​RAM 模式(28003x_generic_ram_lnk.cmd)​

​代码存放位置​

Flash(需初始化等待周期)

RAM(直接运行)

​是否需要 _FLASH

​必须定义​​(否则跳过关键初始化)

​不需要定义​

​执行速度​

较慢(受 Flash 读取速度限制)

最快(CPU 直接访问 RAM)

​掉电后程序是否保留​

保留(非易失性)

丢失(RAM 是易失性存储器)

​适用场景​

最终产品固化程序

调试阶段快速迭代


​3. 验证 RAM 模式是否正常工作​

如果你使用 28003x_generic_ram_lnk.cmd,可以通过以下方式确认:

  1. ​检查 .map文件​​:

    • 所有代码段(如 .text.cinit)的加载地址和运行地址都应在 RAM 范围内(如 0x00800000开始的地址)。

    • 不应出现 FLASHAFLASHD等 Flash 段。

  2. ​调试观察​​:

    • 程序应能直接运行,无需等待 InitFlash()memcpy操作。

    • 如果定义了 _FLASH,相关代码会被编译器忽略(因为 #ifdef _FLASH不成立)。

  3. ​仿真器下载行为​​:

    • 点击 CCS 的 ​​Debug​​ 按钮时,程序会直接下载到 RAM,而不是烧录到 Flash。


​4. 常见问题​

​Q1:如果我在 RAM 模式下定义了 _FLASH,会怎样?​

  • ​不会有直接影响​​,因为 #ifdef _FLASH包裹的代码(如 InitFlash())不会被执行。

  • ​但可能会引发混淆​​,建议在 RAM 模式下移除 _FLASH宏,保持工程配置清晰。

​Q2:RAM 模式能否调用 Flash API 函数(如擦除/编程 Flash)?​

  • ​可以​​,但需要满足:

    1. 工程中链接了 FAPI_F28003x_EABI_v1.58.10.lib

    2. 调用 Flash 操作函数时,代码必须在 RAM 中运行(因为 Flash 编程期间无法从 Flash 取指)。

​Q3:如何切换回 Flash 模式?​

  1. 将链接文件改为 28003x_generic_flash_lnk.cmd

  2. 在工程中定义 _FLASH宏。

  3. 重新编译并使用 ​​Flash 烧录工具​​(如 F28xx On-Chip Flash Programmer)下载程序

第六步 :编译



七 :F28002X/F28003X 的Flash_API_LIB

关于C2000的 libraries\flash_api\f28003x\lib    libraries\flash_api\f280023x\lib的疑惑跟配置项目工程的时候有关

因为我是参考的F280025的工程来搭建F280039C的工程:

C:\ti\c2000\C2000Ware_4_03_00_00\libraries\flash_api\f28002x\lib

F280025 的两个库 FlashAPI_F28002x_FPU32.lib和 FlashAPI_F28002x_FPU32_ROM_EABI.lib都是针对 EABI(Embedded Application Binary Interface)编译器的​

C:\ti\c2000\C2000Ware_4_03_00_00\libraries\flash_api\f28003x\lib

以下是针对 ​​TMS320F280025​​ 和 ​​TMS320F280039C​​ 两款芯片的 Flash API 库文件的详细解析,包括它们的区别和适用场景:

先说一下这东西都是干啥的:

FAPI_F28003x_EABI_v1.58.10.lib是 ​​TI C2000 系列 DSP(如 TMS320F28003x)的 Flash API 库​​,全称是 ​​Flash Application Programming Interface Library​​。它是 TI 官方提供的、专门用于对 F28003x 芯片的 ​​片上 Flash 存储器进行编程(擦除、写入、校验)​​ 的核心库文件。


​7.1 这个库的核心作用​

  1. ​提供 Flash 操作函数​​:

    • 包含擦除(Flash_Erase())、编程(Flash_Program())、校验(Flash_Verify())等关键操作。

    • 支持对 Flash 扇区(Sector)或整个 Flash 进行编程。

  2. ​处理 Flash 时序和安全性​​:

    • Flash 存储器有严格的​​时序要求​​(如等待周期、电压控制),这个库封装了底层硬件细节,确保 Flash 操作符合芯片规范。

    • 防止误操作(如意外擦除关键代码)。

  3. ​支持 EABI(Embedded Application Binary Interface)​​:

    • EABI表示该库适用于 TI 的 EABI 编译工具链(如 TI Clang 编译器),与 C2000 的代码生成工具兼容。


7.2 ​​为什么需要这个库?​

当你编译一个程序并希望将其​​烧录到 Flash 中​​(而非仅在 RAM 中调试)时,普通的编译链接过程只会生成一个 .out文件,但​​不会自动将代码写入 Flash​​。你需要:

  1. ​通过仿真器(如 XDS100/200)调用 Flash API 函数​​,才能将代码真正写入 Flash。

  2. ​在工程中链接 FAPI_F28003x_EABI_v1.58.10.lib​,这样 CCS 的 Flash 烧录工具(如 F28xx On-Chip Flash Programmer)才能正确操作 Flash。


​7.3 典型使用场景​

1. ​​通过 CCS 烧录 Flash​
  • 当你使用 28003x_generic_flash_lnk.cmd编译工程后:

    • 生成的 .out文件会标记代码应存放在 Flash 的哪个地址。

    • 但​​烧录过程需要调用 FAPI_F28003x_EABI_v1.58.10.lib中的函数​​,才能将代码写入 Flash。

  • CCS 的 Flash 烧录工具(如 F28xx On-Chip Flash Programmer)在后台自动使用这个库。

2. ​​在用户代码中直接操作 Flash​
  • 如果你想在运行时动态修改 Flash(例如保存参数、固件升级),可以手动调用该库的函数:

    #include "Fapi_UserDefinedFunctions.h"
    
    // 示例:擦除 Flash Sector
    Flash_Erase(FLASH_SECTOR_A); 
    
    // 示例:写入数据
    uint32_t data[10] = {0x12345678, ...};
    Flash_Program(FLASH_SECTOR_A_START_ADDR, data, sizeof(data));

7.4 ​​常见问题​

Q1: 如果不链接这个库会怎样?
  • ​烧录失败​​:CCS 会提示找不到 Flash 编程函数,无法将程序写入 Flash。

  • ​程序无法脱机运行​​:即使手动下载到 RAM,断电后代码会丢失。

Q2: 这个库和 28003x_generic_flash_lnk.cmd的关系?
  • flash_lnk.cmd​仅定义代码在 Flash 中的存放位置​​,而 FAPI_F28003x_EABI_v1.58.10.lib​提供实际写入 Flash 的函数​​。

  • 两者需配合使用:链接文件告诉编译器“代码放哪”,库文件告诉烧录工具“怎么放”。

Q3: 如何确认我的工程正确使用了这个库?
  • 在 CCS 工程属性中:

    • 检查 ​​Include Path​​ 是否包含 Flash API 的头文件路径(如 C:\ti\c2000\F28003x_API_Flash\include)。

    • 检查 ​​Linker -> File Search Path​​ 是否链接了 .lib文件



​7.5. F280025 的两个 Flash API 库​

​(1) FlashAPI_F28002x_FPU32.lib
  • ​作用​​:

    用于 ​​F28002x 系列芯片(如 F280025)​​ 的 Flash 编程(擦除、写入、校验),​​驱动代码需加载到 RAM 中运行​​。

  • ​关键特性​​:

    • ​FPU32 优化​​:针对芯片的 32 位浮点单元(FPU)优化,适合需要高性能浮点运算的场景。

    • ​RAM-Based​​:库中的 Flash 驱动代码会被复制到 RAM 中执行,​​速度快但占用 RAM 空间​​。

    • ​EABI 兼容​​:适用于 TI 的 EABI 编译器(如 TI Clang/LLVM)。

  • ​适用场景​​:

    • 需要频繁操作 Flash(如实时数据存储)。

    • 对 Flash 操作速度敏感,且 RAM 资源充足。

​(2) FlashAPI_F28002x_FPU32_ROM_EABI.lib
  • ​作用​​:

    同样是 F28002x 的 Flash 编程库,但​​直接调用芯片 ROM 中预存的 Flash 驱动​​,无需将驱动代码加载到 RAM。

  • ​关键特性​​:

    • ​ROM-Based​​:依赖芯片内部 ROM 中的驱动代码,​​节省 RAM 空间​​,但执行速度略慢于 RAM 版本。

    • ​FPU32 优化​​:同样支持浮点运算加速。

    • ​EABI 兼容​​:与 TI 现代编译器工具链兼容。

  • ​适用场景​​:

    • RAM 资源紧张的小型应用。

    • Flash 操作不频繁(如仅在上电时初始化烧录)。

​F280025 两库对比​

特性

FlashAPI_F28002x_FPU32.lib(RAM 版)

FlashAPI_F28002x_FPU32_ROM_EABI.lib(ROM 版)

​驱动代码位置​

需加载到 RAM

直接调用芯片 ROM 中的驱动

​RAM 占用​

高(需存储驱动代码)

低(仅需参数和栈空间)

​执行速度​

快(RAM 访问速度快)

略慢(ROM 访问速度较慢)

​适用场景​

高频 Flash 操作、实时性要求高

节省 RAM、初始化时单次烧录


​7.6. F280039C 的两个 Flash API 库​

​(1) FAPI_F28003x_EABI_v1.58.10.lib
  • ​作用​​:

    用于 ​​F28003x 系列芯片(如 F280039C)​​ 的 Flash 编程,支持 EABI 编译器(如 TI Clang)。

  • ​关键特性​​:

    • ​EABI 标准​​:与 TI 现代编译器工具链兼容。

    • ​通用功能​​:提供擦除、编程、校验等基础操作。

    • ​默认优化​​:通常为平衡性能和代码大小的通用版本。

  • ​适用场景​​:

    • 使用 TI Clang 编译器开发的工程。

    • 常规 Flash 操作需求(无特殊浮点优化要求)。

​(2) FAPI_F28003x_COFF_v1.58.10.lib
  • ​作用​​:

    功能与 EABI 版本相同,但适用于 ​​COFF(Common Object File Format)​​ 格式的旧编译器(如 TI C2000 C28x 传统编译器)。

  • ​关键特性​​:

    • ​COFF 兼容​​:仅支持旧版编译器(如 CCS v6 及更早版本)。

    • ​传统项目维护​​:用于兼容遗留代码或老版本工程。

  • ​适用场景​​:

    • 使用传统 COFF 工具链的旧项目。

    • 需要兼容历史代码库的场景。

​F280039C 两库对比​

特性

FAPI_F28003x_EABI_v1.58.10.lib(EABI)

FAPI_F28003x_COFF_v1.58.10.lib(COFF)

​编译器兼容性​

TI Clang/LLVM(EABI 标准)

传统 C28x 编译器(COFF 格式)

​适用工具链​

CCS v7+ 或支持 EABI 的现代环境

CCS v6 及更早版本

​推荐使用场景​

新项目开发

旧项目维护或兼容性需求


​7.7 总结与选型建议​

​F280025 的库选择​
  • ​优先 RAM 版​​(FlashAPI_F28002x_FPU32.lib):

    需要高性能 Flash 操作(如实时数据记录)且 RAM 充足时使用。

  • ​优先 ROM 版​​(FlashAPI_F28002x_FPU32_ROM_EABI.lib):

    RAM 资源紧张或仅需单次烧录时使用。

​F280039C 的库选择​
  • ​默认选 EABI 版​​(FAPI_F28003x_EABI_v1.58.10.lib):

    现代编译器(TI Clang)的工程必须使用此版本。

  • ​仅旧项目选 COFF 版​​(FAPI_F28003x_COFF_v1.58.10.lib):

    维护传统 COFF 工程时使用,新项目无需考虑。

​注意事项​
  1. ​芯片严格匹配​​:

    F28002x 的库不能用于 F28003x,反之亦然(Flash 地址和时序不同)。

  2. ​编译器版本确认​​:

    在 CCS 工程属性中检查编译器类型(EABI 或 COFF),选择对应库。

  3. ​烧录工具兼容性​​:

    CCS 的 Flash 烧录插件会自动匹配库版本,无需手动干预。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐