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");
}
尊敬的 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
非常感谢。
正如您所说、我将发布以进一步询问重置问题。
谢谢你。