TMSF280039C新建工程
本文介绍了基于TMS320F280039/049系列芯片新建CCS工程的详细步骤。首先在workspace下创建工程模板,选择EABI格式;然后建立文件目录结构,包括common、driverlib、headers等SDK文件夹,以及自定义的Application和Drivers目录;接着配置包含路径和编译选项,根据调试/发布模式选择不同的链接文件(flash/ram);最后强调两种模式下都必须正
参考大佬的文章: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 地址空间(如RAMLS0、RAML0)。 -
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 模式( |
RAM 模式( |
|---|---|---|
|
代码存放位置 |
Flash(需初始化等待周期) |
RAM(直接运行) |
|
是否需要 |
必须定义(否则跳过关键初始化) |
不需要定义 |
|
执行速度 |
较慢(受 Flash 读取速度限制) |
最快(CPU 直接访问 RAM) |
|
掉电后程序是否保留 |
保留(非易失性) |
丢失(RAM 是易失性存储器) |
|
适用场景 |
最终产品固化程序 |
调试阶段快速迭代 |
3. 验证 RAM 模式是否正常工作
如果你使用 28003x_generic_ram_lnk.cmd,可以通过以下方式确认:
-
检查
.map文件:-
所有代码段(如
.text、.cinit)的加载地址和运行地址都应在 RAM 范围内(如0x00800000开始的地址)。 -
不应出现
FLASHA、FLASHD等 Flash 段。
-
-
调试观察:
-
程序应能直接运行,无需等待
InitFlash()或memcpy操作。 -
如果定义了
_FLASH,相关代码会被编译器忽略(因为#ifdef _FLASH不成立)。
-
-
仿真器下载行为:
-
点击 CCS 的 Debug 按钮时,程序会直接下载到 RAM,而不是烧录到 Flash。
-
4. 常见问题
Q1:如果我在 RAM 模式下定义了 _FLASH,会怎样?
-
不会有直接影响,因为
#ifdef _FLASH包裹的代码(如InitFlash())不会被执行。 -
但可能会引发混淆,建议在 RAM 模式下移除
_FLASH宏,保持工程配置清晰。
Q2:RAM 模式能否调用 Flash API 函数(如擦除/编程 Flash)?
-
可以,但需要满足:
-
工程中链接了
FAPI_F28003x_EABI_v1.58.10.lib。 -
调用 Flash 操作函数时,代码必须在 RAM 中运行(因为 Flash 编程期间无法从 Flash 取指)。
-
Q3:如何切换回 Flash 模式?
-
将链接文件改为
28003x_generic_flash_lnk.cmd。 -
在工程中定义
_FLASH宏。 -
重新编译并使用 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 这个库的核心作用
-
提供 Flash 操作函数:
-
包含擦除(
Flash_Erase())、编程(Flash_Program())、校验(Flash_Verify())等关键操作。 -
支持对 Flash 扇区(Sector)或整个 Flash 进行编程。
-
-
处理 Flash 时序和安全性:
-
Flash 存储器有严格的时序要求(如等待周期、电压控制),这个库封装了底层硬件细节,确保 Flash 操作符合芯片规范。
-
防止误操作(如意外擦除关键代码)。
-
-
支持 EABI(Embedded Application Binary Interface):
-
EABI表示该库适用于 TI 的 EABI 编译工具链(如 TI Clang 编译器),与 C2000 的代码生成工具兼容。
-
7.2 为什么需要这个库?
当你编译一个程序并希望将其烧录到 Flash 中(而非仅在 RAM 中调试)时,普通的编译链接过程只会生成一个 .out文件,但不会自动将代码写入 Flash。你需要:
-
通过仿真器(如 XDS100/200)调用 Flash API 函数,才能将代码真正写入 Flash。
-
在工程中链接
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 两库对比
|
特性 |
|
|
|---|---|---|
|
驱动代码位置 |
需加载到 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 两库对比
|
特性 |
|
|
|---|---|---|
|
编译器兼容性 |
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 工程时使用,新项目无需考虑。
注意事项
-
芯片严格匹配:
F28002x 的库不能用于 F28003x,反之亦然(Flash 地址和时序不同)。
-
编译器版本确认:
在 CCS 工程属性中检查编译器类型(EABI 或 COFF),选择对应库。
-
烧录工具兼容性:
CCS 的 Flash 烧录插件会自动匹配库版本,无需手动干预。
更多推荐



所有评论(0)