hello,
Ti 工程师。因项目需求原因,将28335的片内Sector H 区域作为用户参数保存区域,但是我在调试的过程中发现,当参数写入flash后,会出现三种情况,分别是:1.程序跑飞。2.进入异常中断。3.正常工作。我这边设定的:

以下是状态图片:


进入异常中断后,扇区H,从地址0x300000开始 ,所有的数据丢失。

并且报错:进入低功耗模式,与仿真器断开连接。
代码情况如下:
void InitFlash(void)
{
asm(" EALLOW");
FlashRegs.FPWR.bit.PWR = 3;
FlashRegs.FSTATUS.bit.V3STAT = 1;
FlashRegs.FSTDBYWAIT.bit.STDBYWAIT = 0x01FF;
FlashRegs.FACTIVEWAIT.bit.ACTIVEWAIT = 0x01FF;
FlashRegs.FBANKWAIT.bit.RANDWAIT = 6;
FlashRegs.FBANKWAIT.bit.PAGEWAIT = 5;
FlashRegs.FOTPWAIT.bit.OTPWAIT = 10;
FlashRegs.FOPT.bit.ENPIPE = 1;
asm(" EDIS");
asm(" RPT #6 || NOP");
}
InitFlash(),该函数在main.c中调用,用于初始化flash。时钟配置150MHz。
Uint16 app_ParamWrite(MotorCtrlType *MCtrl, FaultType *g_Fault)
{
Uint16 Read_temp[52] = {0};//写入缓存
Uint32 WriteLength = 52;//数据长度
Uint16 *pFlashAddr = NULL;
FLASH_ST FOpStatus;
Uint16 actual_write_len = 0;
Uint16 EraseFlag=0; //擦除标志
Uint16 verify_stat = 0; //验证写入
DINT; //关中断
DRTM;
//读取需要保存的参数
pro_WorCondRead(MCtrl, g_Fault, Read_temp);
pFlashAddr = (Uint16*)0x300000; // 写入地址0x300000
EraseFlag = Flash_Erase(SECTORH, &FOpStatus);
if (EraseFlag == 0 )
{
actual_write_len = Flash_Program(
pFlashAddr, // 正确的Flash地址指针
Read_temp, // 数据缓冲区
WriteLength, // 写入长度(52个16位字)
&FOpStatus // 状态结构体
);
}
verify_stat = Flash_Verify(pFlashAddr, Read_temp, WriteLength, &FOpStatus);
EINT;//允许中断触发器
ERTM;//使能实时中断
return (verify_stat == 0 ) ? 1 : 0;
}
app_ParamWrite(),该函数作为业务函数,主要是对28335的扇区H进行擦除 /写入/校验。