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.

TMS320F280025: Flash擦除时DSP异常进入ESTOP0

Part Number: TMS320F280025

开发二次Bootloader功能,程序在擦除Flash的时候可能会出现崩溃的情况。

项目的cmd文件如下:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
MEMORY
{
BOOT_RSVD : origin = 0x00000002, length = 0x00000126
RAMM0 : origin = 0x00000128, length = 0x000002D8
RAMM1 : origin = 0x00000400, length = 0x000003F8 /* on-chip RAM block M1 */
// RAMM1_RSVD : origin = 0x000007F8, length = 0x00000008 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
/* RAMLS4 : origin = 0x0000A000, length = 0x00000800
RAMLS5 : origin = 0x0000A800, length = 0x00000800
RAMLS6 : origin = 0x0000B000, length = 0x00000800
RAMLS7 : origin = 0x0000B800, length = 0x00000800
RAMGS0 : origin = 0x0000C000, length = 0x000007F8
RAMGS0_RSVD : origin = 0x0000C7F8, length = 0x00000008 // Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory"
*/
/* Combining all the LS RAMs and GS0 RAM */
RAML_Data : origin = 0x0000A000, length = 0x00001400
RAML_Prog : origin = 0x0000B400, length = 0x00001400
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

其中bootloader程序占据sector0~sector1

app1占据sector2~sector8

app2占据sector9~sector15

bootloader运行后检查app2是否有有效的程序代码:如果有则擦除app1区域,并将app2代码拷贝至app1区,然后擦除app2区域,最后跳转至app1运行;如果app2没有有效代码,则跳转至app1运行

CCS项目采用TI ROM提供的FlashAPI代码,项目中包含的库文件为:FlashAPI_F28002x_FPU32_ROM_EABI.lib

操作flash的关键代码如下:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//before using any FlashAPI ,Initalize it first
void Upgrade_Initialize_FlashAPI()
{
if(isFlashAPI_Initialized) return;
Fapi_StatusType oReturnCheck;
oReturnCheck = Fapi_initializeAPI(F021_CPU0_BASE_ADDRESS, DEVICE_SYSCLK_FREQ/1000000U);
if(oReturnCheck != Fapi_Status_Success) return;
oReturnCheck = Fapi_setActiveFlashBank(Fapi_FlashBank0);
if(oReturnCheck != Fapi_Status_Success) return;
isFlashAPI_Initialized = true;
}
//Erase single sector at address
#pragma CODE_SECTION(EraseSingleSector, ".TI.ramfunc");
Fapi_StatusType EraseSingleSector(Uint32 u32StartAddress)
{
Fapi_StatusType oReturnCheck;
Fapi_FlashStatusWordType oFlashStatusWord;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

调用 Upgrade_EraseSectorOfApp2()函数,擦除Sector9后,在擦除sector10时程序进入ESTOP0

程序跟踪可以看到,调用的Fapi_issueAsynCommand 函数位于 0x3f8ec8

请问擦除后崩溃的原因可能是什么?

还有,如何将TI ROM中的FlashAPI代码放在RAM中执行?

  • 补充一下:

    擦除FLASH时,有时候擦除第2个Sector时崩溃,有时擦除第3个Sector时崩溃

    同样的代码,之前还有全部擦除成功的情况。

  • 还补充一下,当前测试出问题的工程是实际工程项目的代码加入了bootloader功能。

    如果用另外一个简单的测试App程序,则擦除过程没有问题。

    2个app工程所用到的擦除代码都是一模一样的,2个App代码均运行于App1区域