TMS320F280049 Flash/OTP
下文主要记录调用TI Flash API静态库和User OTP
一、准备工作
- 下载安装C2000Ware
- 下载安装CCS(Code Composer Studio 10.4.0)
软件可以从TI官网下载,下载安装不做说明。
二、CCS创建工程
1.Project------>>New CCS Project…
2.选择芯片型号
3.选择仿真器(根据实际情况选择)
后续可以在ccxml文件中修改
4.输入工程名
5.选择XXX.cmd文件。
xxx_FLASH_lnk.cmd:编译出的代码在flash区
xxx_RAM_lnk.cmd:编译出的代码在RAM区
本次代码要放在RAM区运行,所以选择280049_RAM_lnk.cmd。
6.选择 Empty Project(with main.c)
7.其余保持默认设置点击”Finish“,工程创建完成。
三、CCS设置生成hex文件
1.右击工程---->>Proprtties
2.选择C2000 Hex Utility------>>勾选 Enable ‘C2000 Hex Utility’
3.选择Output Format Options—>>选择Intel hex。(根据自己需求选择)
4.选择General Options---->>在Specify rom width处输入16. (因为该芯片一个地址占2个字节,即16位)。然后点击"Apply and Close"。
5.Swap。
注:UniFlash烧录hex默认是不选Swap数据,即UniFlash烧录时会自动对数据一个 字(WORD)进行高低字节转换
例如下方是生成没有勾选Swap的hex,hex文件中数据是0x8000=0x7640,实际烧录是0x8000=0x4076
四、添加Flash API静态库与头文件
1.右击工程---->>Proprtties
2.选择C2000 Compiler—>>>Include Options 按图上箭头添加头文件 文件夹 D:\ti\c2000\C2000Ware_3_03_00_00\libraries\flash_api\f28004x\include
根据自己C2000Ware实际安装路径选择
3.添加完后显示如下
4.根据相同方法添加如下文件夹
5.同样在C2000 Linker–>>File Search Path下添加如下
6.设置结束 点击"Apply and Close"
7.添加链接文件:右击工程---->>Add Files
8.添加如下3个文件,点击"打开"。文件路径D:\ti\c2000\C2000Ware_3_03_00_00\device_support\f28004x\common\source
根据C2000Ware实际安装目录选择
9.步骤8会弹出如下界面,选择Link to files—>>OK
根据自己需要选择Copy与Link
10.添加如下文件,路径D:\ti\c2000\C2000Ware_3_03_00_00\device_support\f28004x\headers\source
根据C2000Ware实际安装目录选择
11.添加如下文件,D:\ti\c2000\C2000Ware_3_03_00_00\device_support\f28004x\headers\cmd
根据C2000Ware实际安装目录选择
12.至此工程配置完成
五、Flash API
具体使用可以参考 TMS320F28004x Flash API Version 1.56.01.00 Reference Guide文档
文档路径D:\ti\c2000\C2000Ware_3_03_00_00\libraries\flash_api\f28004x\docs
根据C2000Ware实际安装路径选择
1.Flash初始化
uint32 FlashAPI_Init(void)
{Fapi_StatusType oReturnCheck;oReturnCheck = Fapi_initializeAPI(F021_CPU0_BASE_ADDRESS, 100);if(oReturnCheck != Fapi_Status_Success){// Check Flash API documentation for possible errorsreturn oReturnCheck;}oReturnCheck = Fapi_setActiveFlashBank(Fapi_FlashBank0);if(oReturnCheck != Fapi_Status_Success){// Check Flash API documentation for possible errorsreturn oReturnCheck;}return Fapi_Status_Success;
}
2.擦除
typedef struct {uint32 *StartAddr;
} SECTOR;SECTOR Sector[32]= {//bank0(uint32 *) 0x00080000,(uint32 *) 0x00081000,(uint32 *) 0x00082000,(uint32 *) 0x00083000,(uint32 *) 0x00084000,(uint32 *) 0x00085000,(uint32 *) 0x00086000,(uint32 *) 0x00087000,(uint32 *) 0x00088000,(uint32 *) 0x00089000,(uint32 *) 0x0008A000,(uint32 *) 0x0008B000,(uint32 *) 0x0008C000,(uint32 *) 0x0008D000,(uint32 *) 0x0008E000,(uint32 *) 0x0008F000,//bank1(uint32 *) 0x00090000,(uint32 *) 0x00091000,(uint32 *) 0x00092000,(uint32 *) 0x00093000,(uint32 *) 0x00094000,(uint32 *) 0x00095000,(uint32 *) 0x00096000,(uint32 *) 0x00097000,(uint32 *) 0x00098000,(uint32 *) 0x00099000,(uint32 *) 0x0009A000,(uint32 *) 0x0009B000,(uint32 *) 0x0009C000,(uint32 *) 0x0009D000,(uint32 *) 0x0009E000,(uint32 *) 0x0009F000,
};uint32 Flash_Erase(uint32 SectorMask)
{ int i=0;Fapi_FlashStatusType oFlashStatus;Fapi_StatusType oReturnCheck;for(i=0;i<32;i++)//芯片有32个扇区{if((SectorMask>>i)&1){oReturnCheck = Fapi_issueAsyncCommandWithAddress(Fapi_EraseSector,Sector[i].StartAddr);// Wait until FSM is done with erase sector operationwhile (Fapi_checkFsmForReady() != Fapi_Status_FsmReady) if(oReturnCheck != Fapi_Status_Success){return oReturnCheck;}// Read FMSTAT register contents to know the status of FSM after// erase command to see if there are any erase operation related errorsoFlashStatus = Fapi_getFsmStatus();if(oFlashStatus != 0){return oReturnCheck;}}}return Fapi_Status_Success;
}
3.编程
边界对齐:Flash :64bit,OTP:128bit
uint32 Flash_ProgramPage(uint32 *pu32StartAddress,uint16 *pu16DataBuffer,uint16 uPageWordNum)
{ Fapi_FlashStatusType oFlashStatus;Fapi_StatusType oReturnCheck;//Fapi_FlashStatusWordType oFlashStatusWord;oReturnCheck = Fapi_issueProgrammingCommand(pu32StartAddress, pu16DataBuffer, uPageWordNum,0, 0, Fapi_AutoEccGeneration);// Wait until the Flash program operation is overwhile(Fapi_checkFsmForReady() == Fapi_Status_FsmBusy)if(oReturnCheck != Fapi_Status_Success){return oReturnCheck;}// Read FMSTAT register contents to know the status of FSM after// program command to see if there are any program operation related errorsoFlashStatus = Fapi_getFsmStatus();if(oFlashStatus != 0){return oFlashStatus;}}
4.校验
uint32 Flash_Verify(uint32 *pu32StartAddress,uint16 *pu16DataBuffer,uint16 uPageWordNum)
{// Verify the programmed values. Check for any ECC errors.// The program command itself does a verify as it goes.// Hence program verify by CPU reads (Fapi_doVerify()) is optional. return = Fapi_doVerify(pu32StartAddress,uPageWordNum/2,(uint32*)pu16DataBuffer,&oFlashStatusWord);
}
六、修改CMD文件内容
使用默认280049_RAM_lnk.cmd,编译出的hex文件数据都在芯片RAM区。但是数据分散在不同的RAM区,是不连续的。为了方便数据使用通过修改CMD文件使数据编译生成到一起。
1.地址修改如下:
将BEGIN生成代码从0x000000改成0x008000,即生成代码从 RAMM0 转到 RAMLS0。
由于BEGIN占用2个地址,所以RAMLS0地址要向后偏移2即从0x008000改成0x008002,大小也要减2,即0x000800改成0x0007fe
BEGIN : origin = 0x000000, length = 0x000002BEGIN : origin = 0x008000, length = 0x000002RAMLS0 : origin = 0x008000, length = 0x000800RAMLS0 : origin = 0x008002, length = 0x0007fe
2.生成代码位置修改
将RAMM0改成RAMLS0,即以RAMLS0作为代码生成基地址
.TI.ramfunc : > RAMM0 PAGE = 0.text : >>RAMM0 | RAMLS0 | RAMLS1 | RAMLS2 | RAMLS3 | RAMLS4, PAGE = 0.cinit : > RAMM0, PAGE = 0.pinit : > RAMM0, PAGE = 0.switch : > RAMM0, PAGE = 0.reset : > RESET, PAGE = 0, TYPE = DSECT /* not used, */.TI.ramfunc : > RAMLS0 | RAMLS1 | RAMLS2 | RAMLS3 | RAMLS4 PAGE = 0.text : >>RAMLS0 | RAMLS1 | RAMLS2 | RAMLS3 | RAMLS4, PAGE = 0.cinit : > RAMLS0 | RAMLS1 | RAMLS2 | RAMLS3 | RAMLS4, PAGE = 0.pinit : > RAMLS0 | RAMLS1 | RAMLS2 | RAMLS3 | RAMLS4, PAGE = 0.switch : > RAMLS0 | RAMLS1 | RAMLS2 | RAMLS3 | RAMLS4, PAGE = 0.reset : > RAMLS0 | RAMLS1 | RAMLS2 | RAMLS3 | RAMLS4, PAGE = 0, TYPE = DSECT /* not used, */
七、调试
1.debug前要创建ccxml配置文件:右击工程—>>New—>>Target Configuration File
2.选择芯片,点击Save。
如果创建工程时仿真器选错或漏选,可以在此处修改。
八、Flash/User-configurable DCSM OTP
- 主阵列闪存编程必须与 64 位地址边界对齐,每个 64 位字在写/擦除周期中只能编程一次。允许分别对数据和ECC 进行编程。 但是,每个 64 位数据和 16 位ECC在写/擦除周期中只能编程一次。
- DCSM OTP 编程必须与 128 位地址边界对齐,每个 128 位字只能编程一次。 例外情况是:
- DCSM OTP 中的 DCSM Zx-LINKPOINTER1 和 Zx-LINKPOINTER2 值应一起编程
- DCSM OTP 中的 DCSM Zx-LINKPOINTER3 要与 Zx-PSWDLOCK 分开。原因:除Zx-LINKPOINTER以外OPT 配置字带有ECC保护。当编程起始地址为Zx-LINKPOINTER时API会自动跳过ECC编程,默认使用Fapi_DataOnly。所以编程Zx-LINKPOINTER3不能与其他 DCSM OTP 配置字混在一起。如果其他区域与 link-pointers混在一起, API 会跳过 ECC 编程. 会导致应用程序 ECC 错误
DCSM Zx-LINKPOINTERx只有低29位有效,且Zx-LINKPOINTER1,2,3需要写入同一个值。
Zx-LINKPOINTER值决定了启用哪个地址区的Zone Select Block
TMS320F280049 Flash/OTP相关推荐
- DSP Flash运行代码
在前面章节那些实验我们都是将程序烧写到芯片 RAM 中运行调试的,我们知道 RAM 中存储的东西在掉电后是会丢失的,也就是说程序烧入到 RAM 中运行,如果系统电源关闭后再开启,之前下载的程序是不会再 ...
- [第一讲]DSP28335将Flash中的代码拷贝到RAM中运行
背景: 近期需要使用28335完成一个简单的逆变器设计,由于开关频率为81kHz,每个开关周期只有12.34us,担心在每个开关期间无法完成相应的计算工作,因此想到了将代码烧写时放在Flash中,初始 ...
- TI 280049 FLASH 翻译
2.1 TI 280049 FLASH 3.12 Flash 和 OTP 存储器 闪存是一种电可擦除/可编程非易失性存储器,可以多次编程和擦除以简化代码开发. 闪存主要用作内核的程序存储器,其次用作静 ...
- TMS320F28335程序烧写FLASH
DSP TMS320F28335 FLASH烧写 1.检查map文件 在烧写之前,首先检查Debug目录下的.map文件,如果Debug文件下没有,检查其他的文件夹,每个项目中都会有.map文件. 打 ...
- F2833x烧录到FLASH芯片锁住如何解除
TMS320F28335是入门TI的DSP的经典芯片,其操作简单,可烧录进RAM和FLASH中,烧录进RAM速度快,FLASH的速度慢,所以TI采取的方法是烧录程序是可以选择在FLASH上,但在上电后 ...
- 使用sprc097的DSP281x_usDelay.asm
在ti sprc097的example中,提供了一个us延时函数,其使用很简单,它的声明放在了DSP281x_Examples.h里面: #define CPU_RATE 6.667L // for ...
- F28027-Flash介绍
1.1 Flash and OTP Menory Blocks 本章介绍配置闪存和一次性可编程(OTP)存储器的等待状态和操作模式的正确顺序.它还包括有关Flash和OTP功率模式以及如何通过启用Fl ...
- DSP2812 RAM不够用的解决方法
DSP2812的FLASH虽然很大,但是程序在这个FLASH区域运行的速度与在RAM中运行速度相比要慢很多,为此通常的做法是将需要快速运行的程序copy到ram中运行,通常将中断子程序以及中断中调用的 ...
- [DSP学习笔记]cmd文件的讲解
一.前言 在笔者学习F28335的过程中,发现网上少有对于cmd文件的讲解,而学习DSP,肯定是要编写或修改cmd文件的.故笔者基于自己的学习经验,给出了自己对于cmd文件的理解. 在正式开始学习cm ...
最新文章
- [译] React Native vs. Cordova、PhoneGap、Ionic,等等
- joyui版本和android版本,游戏爱好者注意!JOYUI 11来了
- 数据结构源码笔记(C语言):栈的基本操作
- 【学习笔记】opencv的python接口 轮廓特征值 滚动条控制阈值参数
- jzoj3896-战争游戏【tarjan,割点,点双联通分量】
- 重读经典:《Generative Adversarial Nets》
- CADFANS2012网站源码
- springmvc源码阅读3--dispatcherServlet reqeust的执行流程
- 1.2.1 计算机网络的分层结构、协议、服务和接口(转载)
- C#的yield return是怎么被调用到的?
- 关于起点中文网字体反爬的解决方法——以阅读指数榜为例
- 教务管理系统——数据库课程设计mysql+java
- 最新版面具隐藏root过检测教程(免刷机)
- 免费的chk恢复工具
- 开灯问题 算法竞赛 (注释详细)
- 翡翠手链的寓意是什么?要如何保养它才好!
- 依赖倒置、控制反转、依赖注入
- Win10添加右键打开cmd和Powershell窗口(管理员/非管理员)
- 逻辑与() 逻辑或(||)
- 《操作系统》第三章 知识点整理