Part Number: TMS320F28377D
我在使用F28377D对flash进行写数据,在线仿真测试结果正常,能确保关于flash操作函数都已经搬到ram运行。
一、仿真操作
1:仿真操作前的情况:

2.仿真后的情况:

可以看到数据正常。
二、离线仿真情况
通过串口打印得出程序在执行 Fapi_issueProgrammingCommand后就跑飞了

定位代码如下:

附加我的flash代码
----------------------------------------------flash.c--------------------------------------------------
#include "F28x_Project.h"
#include <string.h>
#include "flash_programming_dcsm_c28.h"
#include "F021_F2837xD_C28x.h"
#include "bsp_flash.h"
#include "bsp_sci.h"
static void Scia_PrintHex32(uint32 val)
{
const char hex[] = "0123456789ABCDEF";
int i;
Scia_Xmit('0'); Scia_Xmit('x');
for (i = 28; i >= 0; i -= 4) {
Scia_Xmit(hex[(val >> i) & 0xF]);
}
Scia_Msg("\r\n");
}
static void Scia_PrintHex16(uint16 val)
{
const char hex[] = "0123456789ABCDEF";
int i;
Scia_Xmit('0'); Scia_Xmit('x');
for (i = 12; i >= 0; i -= 4) {
Scia_Xmit(hex[(val >> i) & 0xF]);
}
Scia_Msg("\r\n");
}
////////////////////////////////////////////配置flash///////////////////////////////////////////
#pragma CODE_SECTION(McuFlash_Init, ".TI.ramfunc");
void McuFlash_Init(void)
{
EALLOW;
// FlashRegs.FRDWAIT.bit.RWAIT = 5; // 对应 200 MHz EDIS;
SeizeFlashPump();
// DELAY_US(100);
Flash0EccRegs.ECC_ENABLE.bit.ENABLE = 0;
// DELAY_US(1000);
Fapi_initializeAPI(F021_CPU0_BASE_ADDRESS, 200);
// Fapi_writeEwaitValue(0x717);//时钟等待周期?
// Fapi_flushPipeline();//刷新 测试失败
Flash0CtrlRegs.FRD_INTF_CTRL.bit.PREFETCH_EN = 0;
Fapi_setActiveFlashBank(Fapi_FlashBank0);
Flash0CtrlRegs.FRD_INTF_CTRL.bit.PREFETCH_EN = 1;
EDIS;
ReleaseFlashPump();
}
uint8 McuFlash_Read(uint32 Addr, void *Data, uint32 Size)
{
uint32 i;
uint16 *Read = (uint16 *)Data;
if (Addr < MCU_FLASH_SADD || Addr + Size >= MCU_FLASH_SADD + MCU_FLASH_SIZE)
return 1;
Scia_Msg("Reading from address: ");
Scia_PrintHex32(Addr);
Scia_Msg("Size: ");
Scia_PrintHex32(Size);
Scia_Msg("Data read:\r\n");
for (i = 0; i < Size; i++) {
*Read = *(uint16 *)Addr;
// 打印读取的值
Scia_Msg(" [");
if(i < 10) {
Scia_Xmit('0' + i);
} else {
Scia_Xmit('A' + (i - 10));
}
Scia_Msg("]: ");
Scia_PrintHex16(*Read);
Read++;
Addr++;
}
return 0;
}
#pragma CODE_SECTION(McuFlash_Write, ".TI.ramfunc");
uint8 McuFlash_Write(uint32 Addr, const void *Data, uint32 Size)
{
uint8 i;
uint8 Res;
Fapi_StatusType oReturnCheck;
uint16 *Write = (uint16 *)Data;
uint16 WriteBuf[MCU_FLASH_PB_SIZE];
if (0 == Size || NULL == Data)
return 1;
if (Addr < MCU_FLASH_SADD || Addr + Size >= MCU_FLASH_SADD + MCU_FLASH_SIZE)
return 1;
if (Addr & (MCU_FLASH_PB_SIZE - 1))
return 1;
SeizeFlashPump();
EALLOW;
while (Size > 0) {
if (Size >= MCU_FLASH_PB_SIZE) {
for (i = 0; i < MCU_FLASH_PB_SIZE; i++)
WriteBuf[i] = Write[i];
Size -= MCU_FLASH_PB_SIZE;
} else {
for (i = 0; i < Size; i++)
WriteBuf[i] = Write[i];
for (; i < MCU_FLASH_PB_SIZE; i++)
WriteBuf[i] = 0xFFFF;
Size -= Size;
}
Scia_Msg("===write: in Fapi_issueProgrammingCommand!===\r\n");
oReturnCheck = Fapi_issueProgrammingCommand((uint32 *)Addr, WriteBuf, MCU_FLASH_PB_SIZE, NULL , 0, Fapi_AutoEccGeneration);
Scia_Msg("===write: out Fapi_issueProgrammingCommand!===\r\n");
while (Fapi_checkFsmForReady() != Fapi_Status_FsmReady) {
}
if (oReturnCheck != Fapi_Status_Success) {
Res = 1;
// goto FLS_SET_EXT;
}
Addr += MCU_FLASH_PB_SIZE;
Write += MCU_FLASH_PB_SIZE;
}
Res = 0;
// FLS_SET_EXT:
EDIS;
ReleaseFlashPump();
/*
Flash_claimPumpSemaphore(FLASHPUMPSEMAPHORE_BASE, (Flash_PumpOwnership)0);
*/
return Res;
}
#pragma CODE_SECTION(McuFlash_Erase, ".TI.ramfunc");
uint8 McuFlash_Erase(uint32 Addr)
{
uint8 Res;
Fapi_StatusType oReturnCheck;
if (Addr < MCU_FLASH_SADD || Addr >= MCU_FLASH_SADD + MCU_FLASH_SIZE)
return 1;
if (Addr & (MCU_FLASH_PP_SIZE - 1))
return 1;
SeizeFlashPump();
/*
#ifdef CPU1
Flash_claimPumpSemaphore(FLASHPUMPSEMAPHORE_BASE, FLASH_CPU1_WRAPPER); //??
#else
Flash_claimPumpSemaphore(FLASHPUMPSEMAPHORE_BASE, FLASH_CPU2_WRAPPER);//??
#endif
*/
EALLOW;
oReturnCheck = Fapi_issueAsyncCommandWithAddress(Fapi_EraseSector, (uint32 *)Addr);
while (Fapi_checkFsmForReady() != Fapi_Status_FsmReady) {
}
if (oReturnCheck != Fapi_Status_Success) {
Res = 1;
// goto FLS_ERASE_EXT;
}
Res = 0;
//FLS_ERASE_EXT:
EDIS;
ReleaseFlashPump();
/*
Flash_claimPumpSemaphore(FLASHPUMPSEMAPHORE_BASE, (Flash_PumpOwnership)0);
*/
return Res;
}
----------------------------------------------main.c--------------------------------------------------
#include "F28x_Project.h" // Device Headerfile and Examples Include File
#include "F2837xD_Ipc_drivers.h"
#include "stdio.h"
#include "user_app.h"
#pragma CODE_SECTION(Flash_QuickTest, ".TI.ramfunc");
void Flash_QuickTest(void)
{
EALLOW;
uint16_t quickTestData[4] = {0xAAAA, 0x1111, 0x2222, 0x90EF};
uint16_t quickReadData[4];
uint16_t result;
int i;
uint16_t verifyFailed = 0;
Scia_Msg("=== Quick Flash Test ===\r\n");
// 2. 擦除
result = McuFlash_Erase(TEST_FLASH_ADDR);
if(result != 0) {
Scia_Msg("Erase FAILED!\r\n");
return;
}
/* result = McuFlash_Read(TEST_FLASH_ADDR, quickReadData, sizeof(quickReadData));
if(result != 0) {
Scia_Msg("Read FAILED!\r\n");
return;
}
*/
// 3. 写入
result = McuFlash_Write(TEST_FLASH_ADDR, quickTestData, sizeof(quickTestData));
if(result != 0) {
Scia_Msg("Write FAILED!\r\n");
return;
}
// 4. 读取
result = McuFlash_Read(TEST_FLASH_ADDR, quickReadData, sizeof(quickReadData));
if(result != 0) {
Scia_Msg("Read FAILED!\r\n");
return;
}
// 5. 验证
for( i = 0; i < 4; i++) {
if(quickTestData[i] != quickReadData[i]) {
Scia_Msg("Verify FAILED at pos \r\n");
Scia_Xmit('0' + i);
Scia_Msg("\r\n");
verifyFailed = 1;
}
}
if(!verifyFailed) {
Scia_Msg("PASS - Quick Test OK!\r\n");
}
EDIS;
}
void main(void)
{
DINT;
EALLOW;
DevCfgRegs.CPUSEL5.bit.SCI_A = 0;
EDIS;
InitSysCtrl();
/*
#ifdef _STANDALONE
#ifdef _FLASH
IPCBootCPU2(C1C2_BROM_BOOTMODE_BOOT_FROM_FLASH);
#else
IPCBootCPU2(C1C2_BROM_BOOTMODE_BOOT_FROM_RAM);
#endif
#endif
*/
//初始化之间检查外设时钟是否开启
InitGpio();
// DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
DELAY_US(5000);
User_App_Init();
EINT;
ERTM;
for(;;)
{
}
}