Thread 中讨论的其他器件:controlSUITE
工具/软件:Code Composer Studio
大家好、我正在尝试将 F28377D 的 flashA、flashB、flashC 器件用作 EEPROM (当软件运行时和软件重启时、我需要写入和读取一些非易失性数据)。我使用"\ti\controlSUITE\device_support\f2837xD\V210\F2837xD_examples_Dual\flash_programming\cpu01"作为参考
项目我在该项目上编写代码。 我在下面解释了我的问题步骤。
1 -当数据从串行端口成功发送到闪存 A 时、我正在写入闪存(我将闪存 A 闪存 B 和闪存 C 组合在一起)
2 -我切断电源、然后接通电源、我正在读取写入 flashA 的数据、但没有数据块
3 -当数据从串行端口传输到闪存 A 时、我再次写入闪存
4 -我再次切断电源、然后打开电源、我正在读取写入 flashA 的数据、但在步骤1而非步骤3中写入数据
我正在使用 CCS 6.2.0、当我的软件在硬复位后启动时、它会读取闪存数据、当数据来自串行端口时、它会写入闪存。
我想我只是第一次成功地撰写。 什么可能是问题?
链接器文件是
/*
//######################################################################################################################
//文件:flash_programming_cpu1_flash.cmd
//标题:所有 F28X7x 器件的链接器命令文件
//######################################################################################################################
//$TI 版本:F2837xD 支持库 V210 $
//$Release Date:Tue Nov1 14:46:15 CDT 2016 $
//版权所有:版权所有(C) 2013-2016 Texas Instruments Incorporated -
// http://www.ti.com/ 保留所有权利$
//######################################################################################################################
*
/*===================================================================
//适用于 Code Composer Studio V2.2和更高版本
//--------------------------------------------------------
//除了该内存链接器命令文件外,
//将头文件链接器命令文件直接添加到工程中。
//链接时需要标头链接器命令文件
//将外设结构设置到内部的适当位置
//存储器映射。
//在中找到了头文件链接器文件 \F2837xD_headers\cmd
//对于 BIOS 应用程序添加:F28X7x_Headers_BIOS.cmd
//对于非 BIOS 应用程序添加:F28X7x_Headers_nonBIOS.cmd
=================================================================================================== *
/*定义 F28X7x 的存储器块开始/长度
PAGE 0将用于组织程序段
第1页将用于组织数据段
注:
F28M3Xx 上的存储器块是一致的(也是相同的
物理存储器)。
不应该是相同的存储器区域
同时为 PAGE 0和 PAGE 1定义。
这样做将导致程序损坏
和/或数据。
可以是连续的 SARAM 存储器块或闪存扇区
组合在一起以创建更大的存储器块。
*
存储器
{
第0页:/*程序内存*/
/*内存(RAM/FLASH)块可移动到 Page1进行数据分配*/
/* begin 用于"引导至闪存"引导加载程序模式*/
开始:origin = 0x080000,length = 0x000002
RAMM0:origin = 0x000122、length = 0x0002DE
RAMD0:origin = 0x00B000、length = 0x000800
RAMLS03:origin = 0x008000、length = 0x002000
/* RAMLS1:origin = 0x008800,length = 0x000800
RAMLS2:origin = 0x009000,length = 0x000800
RAMLS3:origin = 0x009800、length = 0x000800 *
RAMLS4:origin = 0x00A000,length = 0x000800
RAMGS14:origin = 0x01A000,length = 0x001000
RAMGS15:origin = 0x01B000,length = 0x001000
复位:origin = 0x3FFFC0,length = 0x000002
/*闪存扇区*/
// FLASHA:origin = 0x080002,length = 0x001FFE //片上闪存*/
// FLASHB:origin = 0x082000,length = 0x002000 //片上闪存*/
FLASHD:origin = 0x086000、length = 0x002000 //片上闪存*/
FLASHE:origin = 0x088000、length = 0x008000 //片上闪存*/
FLASHF:origin = 0x090000,length = 0x008000 //片上闪存*
FLASHG:origin = 0x098000、length = 0x008000 //片上闪存*/
FLASHH:origin = 0x0A0000,length = 0x008000 //片上闪存*/
FLASHI:origin = 0x0A8000、length = 0x008000 //片上闪存*/
FLASHJ:origin = 0x0B0000,length = 0x008000 //片上闪存*/
FLASHK:origin = 0x0B8000、length = 0x002000 //片上闪存*/
FLASHL:origin = 0x0BA000、length = 0x002000 //片上闪存*/
FLASHM:origin = 0x0BC000、length = 0x002000 //片上闪存*/
FLASHN:origin = 0x0BE000、length = 0x002000 //片上闪存*/
第1页:/*数据存储器*/
/*内存(RAM/FLASH)块可移动到 PAGE0进行程序分配*/
BOOT_RSVD:origin = 0x000002,length = 0x000120 // M0的一部分,引导 ROM 将此用于栈*/
RAMM1:origin = 0x000400、length = 0x000400 //片上 RAM 块 M1 *
RAMD1:origin = 0x00B800,length = 0x000800
RAMLS5:origin = 0x00A800,length = 0x000800
RAMGS0:origin = 0x00C000、length = 0x001000
RAMGS1:origin = 0x00D000、length = 0x001000
RAMGS2:origin = 0x00E000、length = 0x001000
RAMGS3:origin = 0x00F000、length = 0x001000
RAMGS4:origin = 0x010000,length = 0x001000
RAMGS5:origin = 0x011000,length = 0x001000
RAMGS6:origin = 0x012000,length = 0x001000
RAMGS7:origin = 0x013000,length = 0x001000
RAMGS8:origin = 0x014000,length = 0x001000
RAMGS9:origin = 0x015000,length = 0x001000
RAMGS10:origin = 0x016000,length = 0x001000
RAMGS11:origin = 0x017000,length = 0x001000
RAMGS12:origin = 0x018000,length = 0x001000
RAMGS13:origin = 0x019000,length = 0x001000
FLASHA:origin = 0x080002,length = 0x005FFE // flashA,B,C 组合
CPU2TOCPU1RAM:origin = 0x03F800,length = 0x000400
CPU1TOCPU2RAM:origin = 0x03FC00,length = 0x000400
}
部分
{
/*分配计划领域:*/
.cinit:> FLASHD PAGE = 0
.pinit:> FLASHD,page = 0
.text:>> FLASHD | FLASHE PAGE = 0
codestart:> begin page = 0
#ifdef __TI_Compiler_version__
#if __TI_Compiler_version__>=15009000
组
{
.TI.ramfunc
{-l F021_API_F2837xD_FPU32.lib}
}负载= FLASHD,
运行= RAMLS03、
load_start (_RamfuncsLoadStart)、
load_size (_RamfuncsLoadSize)、
load_end (_RamfuncsLoadEnd)、
run_start (_RamfuncsRunStart)、
run_size (_RamfuncsRunSize)、
run_end (_RamfuncsRunEnd)、
PAGE = 0
其他
组
{
ramfuncs
{-l F021_API_F2837xD_FPU32.lib}
}负载= FLASHD,
运行= RAMLS03、
load_start (_RamfuncsLoadStart)、
load_size (_RamfuncsLoadSize)、
load_end (_RamfuncsLoadEnd)、
run_start (_RamfuncsRunStart)、
run_size (_RamfuncsRunSize)、
run_end (_RamfuncsRunEnd)、
PAGE = 0
#endif
#endif
/*分配未初始化的数据段:*/
.stack:>RAMM1 page = 1.
.ebss:>> RAMLS5 | RAMGS0 | RAMGS1 PAGE = 1.
.esysmem:> RAMLS5 PAGE = 1.
/*初始化段进入闪存*/
econst:>> FLASHF | FLASHG PAGE = 0
.switch:> FLASHD PAGE = 0
.reset:> reset,page = 0,type = DSECT //未使用,*/
filter_RegsFile:> RAMGS0,PAGE = 1
SHARERAMGS0:> RAMGS0,PAGE = 1
SHARERAMGS1:>RAMGS1,PAGE = 1.
/*闪存编程缓冲器*/
BufferDataSection:>RAMD1,PAGE = 1,ALIG(4)
/*使用 IPC API 驱动程序时需要以下部分定义*/
组:> CPU1TOCPU2RAM,PAGE = 1
{
PUTBUFFER
PUTWRITEIDX
GETREADIDX
}
组:> CPU2TOCPU1RAM,PAGE = 1
{
GETBUFFER:TYPE = DSECT
GETWRITEIDX:TYPE = DSECT
PUTREADIDX:TYPE = DSECT
}
}
/*
//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
//文件结束。
//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
*
我的代码闪存例程
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void CallFlashAPI (uint32 flash_adress)
{
uint32 u32Index = 0;
uint16 i = 0;
Fapi_StatusType oReturnCheck;
易失性 Fapi_FlashStatusType oFlashStatus;
Fapi_FlashStatusWordType oFlashStatusWord;
EALLOW;
Flash0EccRegs.ecc_enable.bit.enable = 0x0;
oReturnCheck = Fapi_initializeAPI (F021_CPU0_BASE_ADDRESS、200);
if (oReturnCheck!= Fapi_Status_Success)
{
Flash_error (oReturnCheck);
}
oReturnCheck = Fapi_setActiveFlashBank (Fapi_FlashBank0);
if (oReturnCheck!= Fapi_Status_Success)
{
Flash_error (oReturnCheck);
}
if (flash_write_command=1)//用于写操作
{
for (i=0、u32Index = flash_adress;
(u32Index <(flash_adress + 48))&&
(oReturnCheck = Fapi_Status_Success);i+= 8、u32Index+= 8)
{
oReturnCheck = fapi_issueProgrammingCommand (((uint32 *) u32Index、RBuffer+I、8、0、0、Fapi_DataOnly);
while (fapi_checkFsmForReady ()=fapi_Status_FsmBusy);
if (oReturnCheck!= Fapi_Status_Success)
{
Flash_error (oReturnCheck);
}
oFlashStatus = fapi_getFsmStatus();
oReturnCheck = fapi_doVerify (((uint32 *) u32Index、
4、RBuffer32+(I/2)、
oFlashStatusWord (&O);
if (oReturnCheck!= Fapi_Status_Success)
{
Flash_error (oReturnCheck);
}
}
}
否则、如果(flash_write_command=0)//进行读取操作
{
for (i=0、u32Index = flash_adress;
(u32Index <(flash_adress + 48))&&
(oReturnCheck = Fapi_Status_Success);i+= 8、u32Index+= 8)
{
Fapi_doMarginiad (((uint32 *) u32Index、(uint32 *)(RBuffer+I)、8、Fapi_normalRead);
//DELAY_US (10);
}
Read_Buffer_With Integer 值();
}
Flash0EccRegs.ecc_enable.bit.enable = 0xA;
EDIS;
ReleaseFlashPump();
flash_done ();
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////