This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具/软件:Code Composer Studio
尊敬的 C2K Champs:
我们面临一个使用 F021闪存 API 的奇怪问题。 器件是 C2000Ware_2_00_00_02的 F28377D 和闪存 API。
首先、电路板硬件没有问题、我们可以运行示例代码。
但是、当我们使用 CCS 软件将闪存 API 添加到 SDS200i 时、我们会面临这个问题。
调用 Fapi_issue19 CommandWithAddress 擦除闪存时、oReturnCheck = Fapi_issue19 CommandWithAddress (Fapi_EraseSector、(UINT32 *) Bzero_SectorM_START);
我们首先对扇区 M 进行编程、然后使用"Flash、oReturnCheck = Fapi_issueCommandWithAddress (Fapi_EraseSector、(UINT32 *) Bzero_SectorM_start)擦除扇区 M;"将报告没有源代码错误或转到下图所示的非法区域。
2、到下一步、它还将报告类似下图的问题。
我在下面提到另一篇文章、但我无法解决
请提供意见和建议。
谢谢、此致、
Edward
请参阅以下我的源代码。
#include "F28x_Project.h"
#include
#include "flash_programming_c28.h"//闪存 API 示例头文件
#include "F021_F2837xD_C28x.h"
//
//定义
//
#define words _in_flash_buffer 0xFF //用于测试的数据/程序缓冲区
//闪存 API 函数
#ifdef __TI_Compiler_version__
#if __TI_Compiler_version__>=15009000
#define ramFunc 部分".TI.ramfunc"
其他
#define ramFunc 段"ramfuncs "
#endif
#endif
//
//全局
//
#pragma DATA_SECTION (缓冲区、"BufferDataSection");
uint16 Buffer[words _in_flash_buffer + 1];
uint32 *缓冲器32 =(uint32 *)缓冲器;
UINT16状态= 0;
//
//函数原型
//
void Example_Error (Fapi_StatusType 状态);
void example_done (void);
void example_CallFlashAPI (void);
//
//主函
//
void main (void)
{
//
//步骤1. 初始化系统控制:
//启用外设时钟
//此示例函数位于 F2837xD_SYSCTRL.c 文件中。
//
InitSysCtrl();
//
//解锁 CSM
//
//如果 API 函数将在不安全的 RAM 中运行
//然后 CSM 必须被解锁才能用于闪存
// API 函数来访问闪存。
//如果从安全内存执行闪存 API 函数
//则不需要此步骤。
//
//DcsmZ1Unlock();
//
//步骤2. 初始化 GPIO:
//此示例函数位于 F2837xD_GPIO.c 文件和中
//说明了如何将 GPIO 设置为其默认状态。
//
// InitGpio();//针对此示例跳过
//
//步骤3. 清除所有中断并初始化 PIE 矢量表:
//禁用 CPU 中断
//
Dint;
//
//将 PIE 控制寄存器初始化为默认状态。
//默认状态为禁用所有 PIE 中断和标志
//被清除。
//此函数位于 F2837xD_PIECTRL.c 文件中。
//
InitPieCtrl();
//
//禁用 CPU 中断并清除所有 CPU 中断标志:
//
IER = 0x0000;
IFR = 0x0000;
//
//使用指向 shell 中断的指针初始化 PIE 矢量表
//服务例程(ISR)。
//这将填充整个表,即使是中断也是如此
//在本例中未使用。 这对于调试很有用。
//可以在 DSP2802x_DefaultIsr.c 中找到 shell ISR 例程
//此函数可在 F2837xD_PieVect.c 中找到
//
InitPieVectTable();
EINT;
//
//将时间关键代码和闪存设置代码复制到 RAM
//这包括 InitFlash()、闪存 API 函数和任何函数
//分配给 ramfuncs 段。
// RamfuncsLoadStart、RamfuncsLoadEnd 和 RamfuncsRunStart
//符号由链接器创建。 请参阅器件.cmd 文件。
//
//memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(size_t)&RamfuncsLoadSize);
//
//调用闪存初始化以设置闪存等待状态
//此函数必须驻留在 RAM 中
//
InitFlash();
//
//增益泵信标
//
//SeizeFlashPump();
//
//跳转到 RAM 并调用闪存 API 函数
//
Example_CallFlashAPI();
}
//
// Example_CallFlashAPI -此函数将连接到闪存 API。
//此函数中使用的闪存 API 函数是
//从 RAM 中执行
//
#pragma CODE_SECTION (Example_CallFlashAPI、ramFuncSection);
空示例_CallFlashAPI (空)
{
uint32 u32Index = 0;
uint16 i = 0;
Fapi_StatusType oReturnCheck;
易失性 Fapi_FlashStatusType oFlashStatus;
Fapi_FlashStatusWordType oFlashStatusWord;
while (1)
{
开关(状态)
{
情况0:
中断;
情况1://闪存扇区 M 数据写入
SeizeFlashPump();
//DINT;
EALLOW;
//
//需要此函数来根据系统初始化闪存 API
//频率才能执行任何其他闪存 API 操作
//
oReturnCheck = Fapi_initializeAPI (F021_CPU0_BASE_ADDRESS、200);
if (oReturnCheck!= Fapi_Status_Success)
{
//
//检查闪存 API 文档以了解可能的错误
//
//example_Error (oReturnCheck);
}
//
// Fapi_setActiveFlashBank 函数进一步设置闪存组和 FMC
//闪存操作将在组上执行
//
oReturnCheck = Fapi_setActiveFlashBank (Fapi_FlashBank0);
if (oReturnCheck!= Fapi_Status_Success)
{
//
//检查闪存 API 文档以了解可能的错误
//
//example_Error (oReturnCheck);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
//擦除扇区 C
//
oReturnCheck = Fapi_issueODE19 CommandWithAddress (Fapi_EraseSector、
(uint32 *) Bzero_SectorM_START);
//
//等待 FSM 完成擦除扇区操作
//
while (fapi_checkFsmForReady()!= fapi_Status_FsmReady){}
if (oReturnCheck!= Fapi_Status_Success)
{
//
//检查闪存 API 文档以了解可能的错误
//如果 Erase 命令失败,请使用 Fapi_getFsmStatus()函数获取
// fmstat 寄存器内容,查看是否有 EV 位、ESUSP 位、
// Cstat 位或 VOLTSTAT 位被置位(请参阅 API 文档
//更多详细信息)
//
//example_Error (oReturnCheck);
}
//
//读取 fmstat 寄存器内容以了解之后 FSM 的状态
//用于任何调试的程序命令
//
oFlashStatus = fapi_getFsmStatus();
if (oFlashStatus!=0)
{
//example_Error (oReturnCheck);
}
//
//验证 SectorL 是否被擦除。 擦除步骤本身会执行
//进行验证。 此验证是可以执行的第二次验证。
//
oReturnCheck = Fapi_doBlankCheck ((UINT32 *) Bzero_SectorM_START、
Bzero_16KSector u32length、
oFlashStatusWord (&O);
if (oReturnCheck!= Fapi_Status_Success)
{
//
//检查闪存 API 文档以了解可能的错误
//如果 Erase 命令失败,请使用 Fapi_getFsmStatus()函数获取
// fmstat 寄存器内容,查看是否有 EV 位、ESUSP 位、
// Cstat 位或 VOLTSTAT 位被置位(请参阅 API 文档
//更多详细信息)
//
//example_Error (oReturnCheck);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
for (i=0;i <= word_in_flash_buffer;i++)
{
Buffer[i]= i;
}
对于(i=0、u32Index = Bzero_SectorM_START;
(u32Index <(Bzero_SectorM_START + wors_in_flash_buffer))&&
(oReturnCheck = Fapi_Status_Success);i+= 8、u32Index+= 8)
{
oReturnCheck = fapi_issueProgrammingCommand ((UINT32 *) u32Index、Buffer+I、
8、
0、
0、
Fapi_AutoEccGeneration);
while (fapi_checkFsmForReady ()=fapi_Status_FsmBusy);
if (oReturnCheck!= Fapi_Status_Success)
{
//
//检查闪存 API 文档以了解可能的错误
//
//example_Error (oReturnCheck);
}
//
//读取 fmstat 寄存器内容以了解之后 FSM 的状态
//用于任何调试的程序命令
//
oFlashStatus = fapi_getFsmStatus();
if (oFlashStatus!= 0)
{
//Check FMSTAT 并进行相应的调试
//example_Error (oReturnCheck);
}
//
//验证编程的值。 Program 步骤本身会进行验证
//进行。 此验证是可以执行的第二次验证。
//
oReturnCheck = fapi_doVerify (((uint32 *) u32Index、
4、Buffer32+(I/2)、
oFlashStatusWord (&O);
if (oReturnCheck!= Fapi_Status_Success)
{
//
//检查闪存 API 文档以了解可能的错误
//
//example_Error (oReturnCheck);
}
}
//
//启用 ECC
//
Flash0EccRegs.ecc_enable.bit.enable = 0xA;
EDIS;//保护设置
//
//保持对闪存泵的控制
//
ReleaseFlashPump();
//EDIS;
//EINT;
状态= 0;
中断;
案例2://闪存扇区 M 擦除
SeizeFlashPump();
Flash0EccRegs.ecc_enable.bit.enable = 0x0;
_asm (" RPT #7 || NOP");
//DINT;
EALLOW;//保护清零
////
/////此函数是基于系统初始化闪存 API 所必需的
////频率,然后才能执行任何其他闪存 API 操作
////
// oReturnCheck = fapi_initializeAPI (F021_CPU0_BASE_ADDRESS、200);
// if (oReturnCheck!= Fapi_Status_Success)
//{
////
////检查闪存 API 文档以了解可能的错误
////
////Example_Error (oReturnCheck);
//}
//
////
//// fapi_setActiveFlashBank 函数进一步设置闪存组和 FMC
////闪存操作将在组上执行
////
// oReturnCheck = Fapi_setActiveFlashBank (Fapi_FlashBank0);
// if (oReturnCheck!= Fapi_Status_Success)
//{
////
////检查闪存 API 文档以了解可能的错误
////
////Example_Error (oReturnCheck);
//}
//
//擦除扇区 C
//
oReturnCheck = Fapi_issueODE19 CommandWithAddress (Fapi_EraseSector、
(uint32 *) Bzero_SectorM_START);
//
//等待 FSM 完成擦除扇区操作
//
while (fapi_checkFsmForReady()!= fapi_Status_FsmReady){}
if (oReturnCheck!= Fapi_Status_Success)
{
//
//检查闪存 API 文档以了解可能的错误
//如果 Erase 命令失败,请使用 Fapi_getFsmStatus()函数获取
// fmstat 寄存器内容,查看是否有 EV 位、ESUSP 位、
// Cstat 位或 VOLTSTAT 位被置位(请参阅 API 文档
//更多详细信息)
//
//example_Error (oReturnCheck);
}
//
//读取 fmstat 寄存器内容以了解之后 FSM 的状态
//用于任何调试的程序命令
//
oFlashStatus = fapi_getFsmStatus();
if (oFlashStatus!=0)
{
//example_Error (oReturnCheck);
}
//
//验证 SectorL 是否被擦除。 擦除步骤本身会执行
//进行验证。 此验证是可以执行的第二次验证。
//
oReturnCheck = Fapi_doBlankCheck ((UINT32 *) Bzero_SectorM_START、
Bzero_16KSector u32length、
oFlashStatusWord (&O);
if (oReturnCheck!= Fapi_Status_Success)
{
//
//检查闪存 API 文档以了解可能的错误
//如果 Erase 命令失败,请使用 Fapi_getFsmStatus()函数获取
// fmstat 寄存器内容,查看是否有 EV 位、ESUSP 位、
// Cstat 位或 VOLTSTAT 位被置位(请参阅 API 文档
//更多详细信息)
//
//example_Error (oReturnCheck);
}
//
//启用 ECC
//
Flash0EccRegs.ecc_enable.bit.enable = 0xA;
_asm (" RPT #7 || NOP");
EDIS;//保护设置
//
//保持对闪存泵的控制
//
ReleaseFlashPump();
//EDIS;
//EINT;
状态= 0;
中断;
情况3://闪存0xFFFF 虚拟数据写入
SeizeFlashPump();
//DINT;
EALLOW;
//
//需要此函数来根据系统初始化闪存 API
//频率才能执行任何其他闪存 API 操作
//
oReturnCheck = Fapi_initializeAPI (F021_CPU0_BASE_ADDRESS、200);
if (oReturnCheck!= Fapi_Status_Success)
{
//
//检查闪存 API 文档以了解可能的错误
//
Example_Error (oReturnCheck);
}
//
// Fapi_setActiveFlashBank 函数进一步设置闪存组和 FMC
//闪存操作将在组上执行
//
oReturnCheck = Fapi_setActiveFlashBank (Fapi_FlashBank0);
if (oReturnCheck!= Fapi_Status_Success)
{
//
//检查闪存 API 文档以了解可能的错误
//
Example_Error (oReturnCheck);
}
for (i=0;i <= word_in_flash_buffer;i++)
{
Buffer[i]= i+2;
}
对于(i=0、u32Index = Bzero_SectorM_START;
(u32Index <(Bzero_SectorM_START + wors_in_flash_buffer))&&
(oReturnCheck = Fapi_Status_Success);i+= 8、u32Index+= 8)
{
oReturnCheck = fapi_issueProgrammingCommand ((UINT32 *) u32Index、Buffer+I、
8、
0、
0、
Fapi_AutoEccGeneration);
while (fapi_checkFsmForReady ()=fapi_Status_FsmBusy);
if (oReturnCheck!= Fapi_Status_Success)
{
//
//检查闪存 API 文档以了解可能的错误
//
}
//
//读取 fmstat 寄存器内容以了解之后 FSM 的状态
//用于任何调试的程序命令
//
oFlashStatus = fapi_getFsmStatus();
if (oFlashStatus!= 0)
{
//Check FMSTAT 并进行相应的调试
Example_Error (oReturnCheck);
}
//
//验证编程的值。 Program 步骤本身会进行验证
//进行。 此验证是可以执行的第二次验证。
//
oReturnCheck = fapi_doVerify (((uint32 *) u32Index、
4、Buffer32+(I/2)、
oFlashStatusWord (&O);
if (oReturnCheck!= Fapi_Status_Success)
{
//
//检查闪存 API 文档以了解可能的错误
//
Example_Error (oReturnCheck);
}
}
//
//启用 ECC
//
Flash0EccRegs.ecc_enable.bit.enable = 0xA;
EDIS;//保护设置
//
//保持对闪存泵的控制
//
ReleaseFlashPump();
//EDIS;
//EINT;
状态= 0;
中断;
默认值:
中断;
}
}
}
//
// Example_Error -对于此示例,如果发现错误,请在此处停止
//
#pragma CODE_SECTION (Example_Error、ramFuncSection);
空示例错误(Fapi_StatusType 状态)
{
//
//错误代码将位于 status 参数中
//
//_asm (" ESTOP0");
}
//
// example_done -对于此示例,完成后,只需在此处停止即可
//
#pragma CODE_SECTION (example_done、ramFuncSection);
void example_done (void)(空)
{
//_asm (" ESTOP0");
}
我设置 flash.cmd 文件。
如下所示:
部分
{
.text:> FLASH、page = 0、align (4)
.cinit:> FLASH,page = 0,align (4)
.const:> FLASH、PAGE = 0、ALIGN (4)
.econst:> FLASH、PAGE = 0、ALIGN (4)
.pinit:> FLASH、PAGE = 0、ALIGN (4)
.switch:> FLASH、PAGE = 0、ALIGN (4)
}
但我无法解决它。
爱德华
看起来您是从闪存执行闪存 API 函数。 对吧?
如果您看一下闪存 API 使用示例(C2000Ware_x_xx_xx_xx\device_support\f2837xd\examples\dual\flash_programming\cpu01\flash_programming_cpu1_flash.cmd)使用的链接器命令文件、您将注意到闪存 API 库和 ramfuncs (或.TI.ramfunc)被组合在一起并运行一个指定的闪存地址和一个闪存加载 RAM。
您能否尝试一下、并告诉我这是否可以解决您的问题?
谢谢、此致、
Vamsi
爱德华
如 表4-13中所述。 TRM 的 CPU1的等待点地址(http://www.ti.com/lit/ug/spruhm8h/spruhm8h.pdf)、您的应用程序将以 ITRAP ISR 结束。
如前所述、请为 ramfuncs 和 Flash API 库分配一个闪存加载地址和 RAM 运行地址。 并在执行任何闪存 API 函数或 ramfuncs 代码之前调用 memcpy()函数。
谢谢、此致、
Vamsi
尊敬的 Vamsi
非常感谢您的回复
如上代码所示、我使用了 memcpy 函数。
如下所示:
#pragma CODE_SECTION (Example_CallFlashAPI、ramFuncSection);
空示例_CallFlashAPI (空)
上部代码基于闪存 API 使用示例(C2000Ware_x_xx_xx_xx\device_support\f2837xd\examples\dual\flash_programming\cpu01\flash_programming_cpu1_flash.cmd)。
谢谢、此致、
Edward
爱德华
我看到 memcpy()在您的代码中被注释掉。 请检查。
此外、请仔细查看链接器 cmd 文件。 闪存 API 库应具有加载闪存地址和 RAM 运行地址;我在链接器 cmd 文件中看不到这一点。
谢谢、此致、
Vamsi
尊敬的 Vamsi
感谢您的回复
我正在检查您的评论。
我附加了以下 cmd 文件。
//如果使用、用户必须在项目链接器设置中定义 CLA_C
// CLA C 编译器
//项目属性-> C2000链接器->高级选项->命令文件
//预处理->--define
#ifdef CLA_C
//为将要使用的 CLA 暂存区定义大小
//由 CLA 编译器生成局部符号和 temps
//还强制引用标记的特殊符号
//暂存区是。
CLA_ScratchPad_size = 0x100;
--undef_sym=__cla_scratchpad_end
--undef_sym=__cla_scratchpad_start
#endif //cla_C
存储器
{
第0页:/*程序内存*/
/*内存(RAM/FLASH)块可移动到 Page1进行数据分配*/
/* begin 用于"引导至闪存"引导加载程序模式*/
开始:origin = 0x080000,length = 0x000002
RAMM0:origin = 0x000122、length = 0x0002DE
RAMD0:origin = 0x00B000、length = 0x000800
RAMLS2:origin = 0x009000,length = 0x000800
RAMLS3:origin = 0x009800,length = 0x000800
复位:origin = 0x3FFFC0,length = 0x000002
RAMGS01:origin = 0x00C000,length = 0x002000
// RAMGS0:origin = 0x00C000,length = 0x001000
// RAMGS1:origin = 0x00D000,length = 0x001000
RAMGS23:origin = 0x00E000,length = 0x002000
// RAMGS2:origin = 0x00E000,length = 0x001000
// RAMGS3:origin = 0x00F000,length = 0x001000
/*闪存扇区*/
FLASHA:origin = 0x080002,length = 0x001FFE /*片上闪存*/
FLASHB:origin = 0x082000、length = 0x002000 //片上闪存*
FLASHC:origin = 0x084000,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
RAMLS0123:origin = 0x008000、length = 0x002000
// RAMLS0:origin = 0x008000,length = 0x000800
// RAMLS1:origin = 0x008800,length = 0x000800
// RAMLS2:origin = 0x009000,length = 0x000800
// RAMLS3:origin = 0x009800,length = 0x000800
RAMLS4:origin = 0x00A000,length = 0x000800
RAMLS5:origin = 0x00A800,length = 0x000800
RAMGS4567891011:origin = 0x010000,length = 0x008000
// 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
RAMGS12131415:origin = 0x018000,length = 0x004000 //*仅在 F28379D、F28377D、F28375D 器件上可用。 移除其他设备上的线路。 *
// RAMGS12:origin = 0x018000,length = 0x001000 //*仅在 F28379D、F28377D、F28375D 器件上可用。 移除其他设备上的线路。 *
// RAMGS13:origin = 0x019000,length = 0x001000 //*仅在 F28379D、F28377D、F28375D 器件上可用。 移除其他设备上的线路。 *
// RAMGS14:origin = 0x01A000,length = 0x001000 //*仅在 F28379D、F28377D、F28375D 器件上可用。 移除其他设备上的线路。 *
// RAMGS15:origin = 0x01B000,length = 0x001000 //*仅在 F28379D、F28377D、F28375D 器件上可用。 移除其他设备上的线路。 *
// EMIF1_CS0n:origin = 0x8000000,length = 0x10000000
EMIF1_CS2n:origin = 0x00100000,length = 0x00200000
EMIF1_CS3n:origin = 0x00300000,length = 0x00080000
EMIF1_CS4n:origin = 0x00380000,length = 0x00060000
EMIF2_CS0n:origin = 0x90000000,length = 0x10000000
EMIF2_CS2n:origin = 0x00002000,length = 0x00001000
CLA1_MSGRAMLOW:origin = 0x001480,length = 0x000080
CLA1_MSGRAMHIGH:origin = 0x001500,length = 0x000080
CPU2TOCPU1RAM:origin = 0x03F800,length = 0x000400
CPU1TOCPU2RAM:origin = 0x03FC00,length = 0x000400
upp_MSGRAMTX:origin = 0x006C00,length = 0x000100
upp_MSGRAMRX:origin = 0x006E00,length = 0x000100
SDRAM:origin = 0x80000000,length = 0x10000000 //* 512Kx16 SDRAM */
}
部分
{
/*分配计划领域:*/
.cinit:> FLASHB,PAGE = 0,ALIGN (4)
.pinit:> FLASHB,PAGE = 0,ALIGN (4)
.text:>> FLASHB | FLASHC | FLASHD | FLASHE,PAGE = 0,ALIG(4)
codestart:> begin,page = 0,align (4)
/*分配未初始化的数据段:*/
.stack:>RAMM1,PAGE = 1.
CPU1
//.ebss:>> RAMGS0 | RAMGS1 | RAMGS2 | RAMGS3,PAGE = 1.
.ebss:> RAMLS0123,PAGE = 1
//.ebss:> RAMGS01,page = 1.
filter_RegsFile:>RAMLS0123,page = 1.
// Filter_RegsFile:> RAMGS01,page = 1.
#endif
CPU2
.ebss:> RAMLS0123,PAGE = 1
//.ebss:> RAMGS01,page = 1.
filter_RegsFile:>RAMLS0123,page = 1.
// Filter_RegsFile:> RAMGS01,page = 1.
#endif
.esysmem:>RAMD1,page = 1.
.cio:>RAMD1,page = 1.
/*初始化段进入闪存*/
.econst:>> FLASHF | FLASHG | FLASHH、PAGE = 0、ALIGN (4)
.switch:> FLASHB,PAGE = 0,ALIGN (4)
.reset:> reset,page = 0,type = DSECT //未使用,*/
.farbss:> SDRAM,页= 1
SHARERAMGS4:> RAMGS4567891011,PAGE = 1
SHARERAMGS15:> RAMGS12131415,PAGE = 1
// EXDRAM:> SDRAM,PAGE = 1.
// SHARERAMGS0:> RAMGS0,PAGE = 1
// SHARERAMGS1:>RAMGS1,PAGE = 1.
// SHARERAMGS2:>RAMGS2,PAGE = 1.
// SHARERAMGS3:>RAMGS3,PAGE = 1.
// SHARERAMGS4:> RAMGS4,PAGE = 1
// SHARERAMGS5:> RAMGS5,PAGE = 1
// SHARERAMGS5:> RAMGS5,PAGE = 1
// SHARERAMGS6:> RAMGS6,PAGE = 1
// SHARERAMGS7:> RAMGS7,PAGE = 1
// SHARERAMGS8:> RAMGS8,PAGE = 1
// SHARERAMGS9:> RAMGS9,PAGE = 1
// SHARERAMGS10:> RAMGS10,PAGE = 1
// SHARERAMGS11:> RAMGS11,PAGE = 1
// SHARERAMGS12:> RAMGS12,PAGE = 1/*仅在 F28379D、F28377D、F28375D 器件上可用。 移除其他设备上的线路。 *
// SHARERAMGS13:> RAMGS13,PAGE = 1/*仅在 F28379D、F28377D、F28375D 器件上可用。 移除其他设备上的线路。 *
// SHARERAMGS14:> RAMGS14,PAGE = 1/*仅在 F28379D、F28377D、F28375D 器件上可用。 移除其他设备上的线路。 *
// SHARERAMGS15:> RAMGS15,PAGE = 1 //仅在 F28379D、F28377D、F28375D 器件上可用。 移除其他设备上的线路。 *
CPU1
#ifdef __TI_Compiler_version__
#if __TI_Compiler_version__>=15009000
.TI.ramfunc:{}负载= FLASHD | FLASHE、
运行= RAMGS01、
//수정포인트= RAMLS0 | RAMLS1 | RAMGS14 | RAMGS15、//μ s
load_start (_RamfuncsLoadStart)、
load_size (_RamfuncsLoadSize)、
load_end (_RamfuncsLoadEnd)、
run_start (_RamfuncsRunStart)、
run_size (_RamfuncsRunSize)、
run_end (_RamfuncsRunEnd)、
PAGE = 0、ALIGN (4)
其他
ramfuncs:load = FLASHD | FLASHE,
运行= RAMGS01、
//수정포인트= RAMLS0 | RAMLS1 | RAMGS14 | RAMGS15、//μ s
load_start (_RamfuncsLoadStart)、
load_size (_RamfuncsLoadSize)、
load_end (_RamfuncsLoadEnd)、
run_start (_RamfuncsRunStart)、
run_size (_RamfuncsRunSize)、
run_end (_RamfuncsRunEnd)、
PAGE = 0、ALIGN (4)
#endif
#endif
#endif //end #ifdef CPU1
CPU2
#ifdef __TI_Compiler_version__
#if __TI_Compiler_version__>=15009000
.TI.ramfunc:{}负载= FLASHD | FLASHE、
运行= RAMGS23、
load_start (_RamfuncsLoadStart)、
load_size (_RamfuncsLoadSize)、
load_end (_RamfuncsLoadEnd)、
run_start (_RamfuncsRunStart)、
run_size (_RamfuncsRunSize)、
run_end (_RamfuncsRunEnd)、
PAGE = 0、ALIGN (4)
其他
ramfuncs:load = FLASHD | FLASHE,
运行= RAMGS23、
load_start (_RamfuncsLoadStart)、
load_size (_RamfuncsLoadSize)、
load_end (_RamfuncsLoadEnd)、
run_start (_RamfuncsRunStart)、
run_size (_RamfuncsRunSize)、
run_end (_RamfuncsRunEnd)、
PAGE = 0、ALIGN (4)
#endif
#endif
#endif //结束#ifdef CPU2
/* CLA 特定部分*/
Cla1Prog:load = FLASHD、//수정포인트
수정포인트= RAMLS2 | RAMLS3、//μ s
load_start (_Cla1funcsLoadStart)、
load_end (_Cla1funcsLoadEnd)、
run_start (_Cla1funcsRunStart)、
load_size (_Cla1funcsLoadSize)、
PAGE = 0、ALIGN (4)
CLADataLS4:> RAMLS4,PAGE = 1//μ 수정포인트
CLADataLS5:> RAMLS5,page = 1//수정포인트 μ s
Cla1ToCpuMsgRAM:> CLA1_MSGRAMLOW,page = 1.
CpuToCla1MsgRAM:>CLA1_MSGRAMHIGH,PAGE = 1.
#ifdef CLA_C
/* CLA C 编译器段*/
//
//必须被分配给 CLA 具有写入访问权限的内存
//
CLAscratch:
{*。obj (CLAscratch)
。 += CLA_ScratchPad_size;
*。obj (CLAscratch_end)}> RAMLS5、page = 1
暂存区:>RAMLS5,PAGE = 1.
.bss_cla:> RAMLS5,page = 1.
const_cla:load = FLASHD,
运行= RAMLS5、
run_start (_Cla1ConstRunStart)、
Load_start (_Cla1ConstLoadStart)、
load_size (_Cla1ConstLoadSize)、
PAGE = 1.
#endif //cla_C
CPU1
/*使用 IPC API 驱动程序时需要以下部分定义*/
组:> CPU1TOCPU2RAM,PAGE = 1
{
PUTBUFFER
PUTWRITEIDX
GETREADIDX
}
组:> CPU2TOCPU1RAM,PAGE = 1
{
GETBUFFER:TYPE = DSECT
GETWRITEIDX:TYPE = DSECT
PUTREADIDX:TYPE = DSECT
}
#endif
CPU2
/*使用 IPC API 驱动程序时需要以下部分定义*/
组:> CPU2TOCPU1RAM,PAGE = 1
{
PUTBUFFER
PUTWRITEIDX
GETREADIDX
}
组:> CPU1TOCPU2RAM,PAGE = 1
{
GETBUFFER:TYPE = DSECT
GETWRITEIDX:TYPE = DSECT
PUTREADIDX:TYPE = DSECT
}
#endif
/*以下部分定义适用于 SDFM 示例*/
// Filter1_RegsFile:> RAMGS1,PAGE = 1,fill=0x1111
// Filter2_RegsFile:> RAMGS2,PAGE = 1,fill=0x2222
// Filter3_RegsFile:> RAMGS3,page = 1,fill=0x3333
// Filter4_RegsFile:> RAMGS4,page = 1,fill=0x4444
// Differit_RegsFile:>RAMGS5,page = 1,fill=0x3333
}
/*
//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
//文件结束。
//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
*
谢谢、此致、
Edward
尊敬的 Vamsi
我修改了我的闪存代码以进行注释。
请检查以下代码。
1.将每个函数(FLASH_WRITE、FLASH_READ、FLASH_ERASE)添加到 RAM 中
2.当我检查执行时、它仍然会弹出断点。
3.有时它会执行复位。 执行 FLASH_ERASE 时。
//主代码
void main (void)
{
//
//初始化设备时钟和外设
//
device_init();
InitFlash();
//SeizeFlashPump();
DSP_EmifInit();
USB_GPIOEnable();
//
// GPIO35是 LED 引脚。
//
GPIO_setPinConfig (GPIO_35_GPIO35);
GPIO_setDirectionMode (35、GPIO_DIR_MODE_OUT);
//
// GPIO9是 SCI Rx 引脚。
//
GPIO_setMasterCore (9、GPIO_CORE_CPU2);
GPIO_setPinConfig (GPIO_9_SCIRXDA);
GPIO_setDirectionMode (9、GPIO_DIR_MODE_IN);
GPIO_setPadConfig (9、GPIO_PIN_TYPE_STD);
GPIO_setQualificationMode (9、GPIO_QUAL_异 步);
//
// GPIO8是 SCI Tx 引脚。
//
GPIO_setMasterCore (8、GPIO_CORE_CPU2);
GPIO_setPinConfig (GPIO_8_SCITXDA);
GPIO_setDirectionMode (8、GPIO_DIR_MODE_OUT);
GPIO_setPadConfig (8、GPIO_PIN_TYPE_STD);
GPIO_setQualificationMode (8、GPIO_QUAL_异 步);
#ifdef CPU1_DEBUG
DSP_SCIA_Init();
MSG ="hello\r\n";
DSP_SCIA_Write (msg、7);
#endif
// ConfigureUART();// UART a debug init
// UARTprintf ("\n\nHello world!\n");
//
// GPIO14是 W5300 /Reset 引脚。
//
GPIO_setPinConfig (GPIO_14_GPIO14);
GPIO_setDirectionMode (14、GPIO_DIR_MODE_OUT);
//GpioDataRegs.GPASET.bit.GPIO14=1;
//GpioDataRegs.GPACLEAR.bit.GPIO14=1;
SYSCTL_selectCPUForPeripheral (SYSCTL_CPUSEL5_SCI、1、SYSCTL_CPUSEL_CPU1);
DSP_TimerInit();
EtherNet_Init();
//communication_init();
ftpd_init (gWIZNETINFO.IP);
#ifdef _debug
#endif
Dint;
//
//初始化 PIE 并清除 PIE 寄存器。 禁用 CPU 中断。
//
interrupt_initModule();
//
//使用指向 shell 中断的指针初始化 PIE 矢量表
//服务例程(ISR)。
//
IER = 0x0000;
IFR = 0x0000;
interrupt_initVectorTable();
//
// ISR
//
INTERRUPT_REGTER (INT_TIMER0、&DSP_Timer0_ISR);
中断寄存器(INT_Timer1、&DSP_Timer1_ISR);
INTERRUPT_REGTER (INT_TIMER2、&DSP_Timer2_ISR);
#ifdef CPU1_DEBUG
INTERRUPT_REGTER (INT_SCIA_RX、&DSP_SCIA_RX_ISR);
INTERRUPT_REGTER (INT_SCIA_TX、&DSP_SCIA_TX_ISR);
#endif
USB_IntRegister ();
//
//为了确保精确的时序,请使用只写指令来写入
//整个寄存器。 因此、如果任何配置位发生更改
//在 configCPUTimer 和 initCPUTimers 中,还必须进行以下设置
//更新。
//
CPUTimer_enableInterrupt (CPUTIMER0_BASE);
CPUTimer_enableInterrupt (CPUTIMEer1_base);
CPUTimer_enableInterrupt (CPUTIMEer2_base);
//
//启用连接到 CPU 定时器0的 CPU INT1、INT13和 INT14,
//分别为 CPU 定时器1和 CPU 定时器2。
//在 PIE 中启用 TINT0:组1中断7
//
INTERRUPT_ENABLE (INT_TIMER0);
INTERRUPT_ENABLE (INT_Timer1);
INTERRUPT_ENABLE (INT_TIMER2);
#ifdef CPU1_DEBUG
INTERRUPT_ENABLE (INT_SCIA_RX);
INTERRUPT_ENABLE (INT_SCIA_TX);
#endif
USB_IntMasterEnable();
// EINT;//启用全局中断 INTM
// ERTM;//启用全局实时中断 DBGM
// usb_host_msc ();
//
//启用全局中断(INTM)和实时中断(DBGM)
//
while (SDRAM_Init());
#ifdef _standalone
IPCBootCPU2 (C1C2_Brom_BOOTMODE_BOOT_FROM _FLASH);
#endif
EINT;//启用全局中断 INTM
ERTM;//启用全局实时中断 DBGM
//
//启动 CPU 定时器0、CPU 定时器1和 CPU 定时器2。
//
CPUTimer_startTimer (CPUTIMER0_BASE);
CPUTimer_startTimer (CPUTIMEer1_base);
CPUTimer_startTimer (CPUTIMEer2_base);
usb_host_msc ();
#if 1.
while (1){
//ReadLine2();
if (SCIARxBuff_CPU1[0]= 0x0061)// a
{
flash_write();
///FLASH_STstate = 1;
//g_con_FLAG = 1;
}
否则、如果(SCIARxBuff_CPU1[0]= 0x0062)// b
{
FLASH_READ (缓冲器322);
///FLASH_STstate = 2;
//g_con_FLAG = 2;
}
否则、如果(SCIARxBuff_CPU1[0]= 0x0063)// c
{
FLASH_ERASE ();
///FLASH_STstate = 3;
//g_con_FLAG = 3;
}
否则、如果(SCIARxBuff_CPU1[0]= 0x0064)// d
{
SCIARxBuff_CPU1[0]= 0x0065;
DSP_SCIA_Write (缓冲器322、0xFF);
//g_con_FLAG = 4;
}
否则、如果(SCIARxBuff_CPU1[0]= 0x0065)// e
{
//SCIARxBuff_CPU1[0]= 0x0066;
//DSP_SCIA_Write (缓冲器322、0xFF);
//DSP_SCIA_Write ((UINT16*) rtext、15);
}
//do udp_config (4);//配置套接字4
//ftpd_run (test_buf1);//套接字2、3
// loopback _UDPS (0、test_BUF1、1000);
// loopback_TCPS (7、test_buf1、1000);
// loopback_tcpC (4、test_buf5、destip1、5000);
}
----------------------------------------
//闪存写入
#pragma CODE_SECTION (Flash_write、ramFuncSection);
void Flash_write (void)
{
uint32 u32Index = 0;
uint16 i = 0;
Fapi_StatusType oReturnCheck;
易失性 Fapi_FlashStatusType oFlashStatus;
Fapi_FlashStatusWordType oFlashStatusWord;
SeizeFlashPump();
//DINT;
EALLOW;
//
//需要此函数来根据系统初始化闪存 API
//频率才能执行任何其他闪存 API 操作
//
oReturnCheck = Fapi_initializeAPI (F021_CPU0_BASE_ADDRESS、200);
if (oReturnCheck!= Fapi_Status_Success)
{
//
//检查闪存 API 文档以了解可能的错误
//
//Flash_Error (oReturnCheck);
}
//
// Fapi_setActiveFlashBank 函数进一步设置闪存组和 FMC
//闪存操作将在组上执行
//
oReturnCheck = Fapi_setActiveFlashBank (Fapi_FlashBank0);
if (oReturnCheck!= Fapi_Status_Success)
{
//
//检查闪存 API 文档以了解可能的错误
//
//Flash_Error (oReturnCheck);
}
for (i=0;i <= word_in_flash_buffer;i++)
{
Buffer[i]= i;
}
对于(i=0、u32Index = Bzero_SectorM_START;
(u32Index <(Bzero_SectorM_START + wors_in_flash_buffer))&&
(oReturnCheck = Fapi_Status_Success);i+= 8、u32Index+= 8)
{
oReturnCheck = fapi_issueProgrammingCommand ((UINT32 *) u32Index、Buffer+I、
8、
0、
0、
Fapi_AutoEccGeneration);
while (fapi_checkFsmForReady ()=fapi_Status_FsmBusy);
if (oReturnCheck!= Fapi_Status_Success)
{
//
//检查闪存 API 文档以了解可能的错误
//
//Flash_Error (oReturnCheck);
}
//
//读取 fmstat 寄存器内容以了解之后 FSM 的状态
//用于任何调试的程序命令
//
oFlashStatus = fapi_getFsmStatus();
if (oFlashStatus!= 0)
{
//Check FMSTAT 并进行相应的调试
//Flash_Error (oReturnCheck);
}
//
//验证编程的值。 Program 步骤本身会进行验证
//进行。 此验证是可以执行的第二次验证。
//
oReturnCheck = fapi_doVerify (((uint32 *) u32Index、
4、Buffer32+(I/2)、
oFlashStatusWord (&O);
if (oReturnCheck!= Fapi_Status_Success)
{
//
//检查闪存 API 文档以了解可能的错误
//
//Flash_Error (oReturnCheck);
}
}
//
//启用 ECC
//
Flash0EccRegs.ecc_enable.bit.enable = 0xA;
EDIS;//保护设置
//
//保持对闪存泵的控制
//
ReleaseFlashPump();
}
//闪存擦除
#pragma CODE_SECTION (Flash_erase、ramFuncSection);
空 Flash_erase (空)
{
uint32 u32Index = 0;
uint16 i = 0;
Fapi_StatusType oReturnCheck;
易失性 Fapi_FlashStatusType oFlashStatus;
Fapi_FlashStatusWordType oFlashStatusWord;
SeizeFlashPump();
//Flash0EccRegs.ecc_enable.bit.enable = 0x0;
//DINT;
EALLOW;//保护清零
//
//需要此函数来根据系统初始化闪存 API
//频率才能执行任何其他闪存 API 操作
//
oReturnCheck = Fapi_initializeAPI (F021_CPU0_BASE_ADDRESS、200);
if (oReturnCheck!= Fapi_Status_Success)
{
//
//检查闪存 API 文档以了解可能的错误
//
//Flash_Error (oReturnCheck);
}
//
// Fapi_setActiveFlashBank 函数进一步设置闪存组和 FMC
//闪存操作将在组上执行
//
oReturnCheck = Fapi_setActiveFlashBank (Fapi_FlashBank0);
if (oReturnCheck!= Fapi_Status_Success)
{
//
//检查闪存 API 文档以了解可能的错误
//
//Flash_Error (oReturnCheck);
}
//
//擦除扇区 C
//
oReturnCheck = Fapi_issueODE19 CommandWithAddress (Fapi_EraseSector、
(uint32 *) Bzero_SectorM_START);
//
//等待 FSM 完成擦除扇区操作
//
while (fapi_checkFsmForReady()!= fapi_Status_FsmReady){}
if (oReturnCheck!= Fapi_Status_Success)
{
//
//检查闪存 API 文档以了解可能的错误
//如果 Erase 命令失败,请使用 Fapi_getFsmStatus()函数获取
// fmstat 寄存器内容,查看是否有 EV 位、ESUSP 位、
// Cstat 位或 VOLTSTAT 位被置位(请参阅 API 文档
//更多详细信息)
//
//Flash_Error (oReturnCheck);
}
//
//读取 fmstat 寄存器内容以了解之后 FSM 的状态
//用于任何调试的程序命令
//
oFlashStatus = fapi_getFsmStatus();
if (oFlashStatus!=0)
{
//Flash_Error (oReturnCheck);
}
//
//验证 SectorL 是否被擦除。 擦除步骤本身会执行
//进行验证。 此验证是可以执行的第二次验证。
//
oReturnCheck = Fapi_doBlankCheck ((UINT32 *) Bzero_SectorM_START、
Bzero_16KSector u32length、
oFlashStatusWord (&O);
while (fapi_checkFsmForReady()!= fapi_Status_FsmReady){}
if (oReturnCheck!= Fapi_Status_Success)
{
Flash_Error (oReturnCheck);
}
//
//启用 ECC
//
//Flash0EccRegs.ecc_enable.bit.enable = 0xA;
EDIS;//保护设置
//
//保持对闪存泵的控制
//
ReleaseFlashPump();
//EDIS;
//EINT;
}
//闪存读取
#pragma CODE_SECTION (Flash_Read、ramFuncSection);
空 Flash_Read (UINT32 *缓冲器321)
{
uint32 u32Index = 0;
uint16 i = 0;
Fapi_StatusType oReturnCheck;
易失性 Fapi_FlashStatusType oFlashStatus;
Fapi_FlashStatusWordType oFlashStatusWord;
//SeizeFlashPump();
//DINT;
EALLOW;
#if 0
对于(i=0、u32Index = Bzero_SectorM_START;
(u32Index <(Bzero_SectorM_START + wors_in_flash_buffer))&&
(oReturnCheck = Fapi_Status_Success);i++、u32Index++)
{
oReturnCheck = fapi_doinMargad ((uint32 *) u32Index、Buffer321+I、1、Fapi_normalRead);
}
其他
oReturnCheck = fapi_doinMargad (((uint32 *) Bzero_SectorM_START、Buffer321、wors_in_flash_buffer、fapi_normalRead);
if (oReturnCheck!= Fapi_Status_Success)
{
//
//检查闪存 API 文档以了解可能的错误
//
Flash_Error (oReturnCheck);
}
oFlashStatus = fapi_getFsmStatus();
if (oFlashStatus!= 0)
{
//Check FMSTAT 并进行相应的调试
Flash_Error (oReturnCheck);
}
#endif
//
//启用 ECC
//
//Flash0EccRegs.ecc_enable.bit.enable = 0xA;
EDIS;//保护设置
//
//保持对闪存泵的控制
//
//ReleaseFlashPump();
//EDIS;
//EINT;
}
//
// Flash_Error -对于此示例,如果发现错误,请在此处停止
//
#pragma CODE_SECTION (Flash_Error、ramFuncSection);
空 Flash_Error (Fapi_StatusType 状态)
{
//
//错误代码将位于 status 参数中
//
//_asm (" ESTOP0");
}
//
// Flash_done -对于此示例、完成后、只需在此处停止
//
#pragma CODE_SECTION (Flash_DONE、ramFuncSection);
空 Flash_Done (空)
{
//_asm (" ESTOP0");
}
爱德华
在链接器 cmd 文件中、我看不到闪存 API 库映射到闪存进行加载、而映射到 RAM 进行运行。
请浏览我之前建议的链接器 cmd 文件并更正您的链接器 cmd。
此外、请勿复制帖子正文中的所有代码和链接器 cmd。 请附上这些文档。 我没有查看您的代码。
谢谢、此致、
Vamsi
尊敬的 Vamsi
好的。 我正在尝试您的建议。
我附加了 cmd 文件。 请确认参考文件。
如何将闪存 API 库映射到闪存和 RAM? 请告诉我一些建议。
e2e.ti.com/.../28377D_5F00_FLASH.zip
谢谢、此致、
Edward
爱德华
如果查看闪存 API 使用示例 (C2000Ware_x_xx_xx_xx\device_support\f2837xd\examples\dual\flash_programming\cpu01\flash_programming_cpu1_flash.cmd)使用的链接器命令文件、您将看到 F021_API_F2837xD_FPU32.lib 已映射、 用于加载 FLAS03和 FLASHD。 请参见下面的。 我在您共享的链接器 cmd 文件中看不到这一点。
#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
谢谢、此致、
Vamsi
尊敬的 Vamsi
我根据您的建议修改了链接文件。 然后、我感觉解决了这个问题。 但当我测试它时、它又发生了另一种情况。
闪存写入和擦除工作正常、在2~3minite 之后、电路板发生了复位功能。
我不明白为什么它发生了复位功能。
我非常乐于助人、感谢您的回答。
谢谢、此致、
Edward
爱德华
很高兴闪存擦除/编程现在工作正常。
关于复位: 如果启用了看门狗、请确保它被处理。 此外、检查 TRM 中的 RESC 寄存器和 NMIFLG 寄存器。 您将了解可能的复位源、并且可以在该方向进行调试。
由于本帖子中讨论的原始闪存程序问题已解决、我建议您打开一个新帖子、以讨论您的进一步重置问题。 这有助于我们将帖子分配给相应的专家、以更好地帮助您。
谢谢、此致、
Vamsi
非常感谢。
正如您所说、我将发布以进一步询问重置问题。
谢谢你。