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.

[参考译文] CCS/TMS320F28377D:Fapi_setActiveFlashBank()执行崩溃

Guru**** 2582405 points
Other Parts Discussed in Thread: TMS320F28377D

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/651633/ccs-tms320f28377d-fapi_setactiveflashbank-execution-crashes

器件型号:TMS320F28377D

工具/软件:Code Composer Studio

您好!  

我有一个 C2000项目、其中 Fapi_setActiveFlashBank()崩溃 TMS320F28377D 的2个内核之一 。   当我连接到调试器时、一切看起来都正常、我可以通过 Can. 即使我使用 code composer 加载程序、我也会断开探头并重新启动电源、然后通过重置/重新启动或仅重新启动加载符号、一切都正常。  

但是、当我断开调试器并从闪存引导时、同一软件不起作用。 经过一些调试后,我发现崩溃是在调用函数 Fapi_setActiveFlashBank()期间发生的。

我将此函数放置在 RAM 中:



ramfuncs
{-l F021_API_F2837xD_FPU32.lib}
}负载= FLASHA,
运行= RAMLS0123、
load_start (_RamfuncsLoadStart)、
load_size (_RamfuncsLoadSize)、
load_end (_RamfuncsLoadEnd)、
run_start (_RamfuncsRunStart)、
run_size (_RamfuncsRunSize)、
run_end (_RamfuncsRunEnd)、
PAGE = 0 align (4)/*可执行代码,闪存加载和 RAM 运行之间具有自动链接*/
/*分配计划领域:*/


.cinit:> FLASHA PAGE = 0,align (4)
.pinit:> FLASHA,PAGE = 0,ALIGN (4)
.text:>> FLASHA | FLASHB | FLASHC PAGE = 0,ALIGN (4)/*可执行代码*/
codestart:> begin page = 0,align (4)
AppStart:> BEGINAPP PAGE = 0,ALIG(4)

 在.map 中,函数放置在 ramfuncs 部分中:

RAMfuncs 0 00080004 000009d0运行 ADDR = 00008000
00080004 00000259 F021_API_F2837xD_FPU32.lib:FlashStateMachine.obj (.text:__Fapi_setupFlashStateMachine)
0008025d 0000019d:Program.obj (.text:_fapi_issueProgrammingCommand)
000803fa 00000088:read.obj (.text:__Fapi_loopRegionForValue)
00080482 0000007f:read.obj (.text:__Fapi_checkRegionForValue)
00080501 0000007f:read.obj (.text:__Fapi_checkRegionForValueByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByBy
00080580 00000042:BlankCheck.obj (.text:_fapi_doBlankCheck)
000805c2 0000003a:read.obj (.text:__Fapi_loopRegionForValueByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByBy
000805fc 00000034:Init.obj (.text:_Fapi_initiizeAPI)
00080630 0000002e:Utilities.obj (.text:_Fapi_calculateFletcherChecksum)
0008065e 0000002d:FlashStateMachine.obj (.text:__Fapi_issueFsmCommand)
0008068b 0000002c:utilities.obj (.text:__Fapi_didedUnsignedLong)
000806b7 00000025:FlashStateMachine.obj (.text:_Fapi_setActiveFlashBank)
000806dc 00000022:FlashStateMachine.obj (.text:_fapi_isAddressEcc)
000806fe 00000022:FlashStateMachine.obj (.text:__Fapi_setupSectorsForWrite)

然后、我在 CPU2初始化期间调用函数:

void main (void)
{

InitSysCtrl();

IpcRegs.IPCBOOTSTS = C2_BootROM_BOOTSTS_SYSTEM_READY;

CAL2_InitFlash (F021_CPU0_BASE_ADDRESS)



...

} 

#pragma CODE_SECTION (CAL2_InitFlash、"ramfuncs");

U16 CAL2_InitFlash (Fapi_FmcRegisterType * F021BaseAddr)
{
U16返回状态;
RetStatus = Fapi_Status_Success;



//检查参数
assert (((F021BaseAddr = F021_CPU0_BASE_ADDRESS));

//增益泵信标
SeizeFlashPump();

EALLOW;

//需要此函数来根据系统初始化闪存 API
//频率才能执行任何其他闪存 API 操作
//当前未选中 RetStatus、因为它始终为 Fapi_Status_Success
RetStatus = Fapi_initializeAPI (F021BaseAddr、CAL2_kSYSCLK_FREQUENCY);

EALLOW;

RetStatus = Fapi_setActiveFlashBank (Fapi_FlashBank0);


EDIS;

//保持对闪存泵的控制
ReleaseFlashPump();

返回 RetStatus;
}

请提供任何帮助。 我已经阅读了主题  和  

但这对解决我的问题没有足够的帮助。  

谢谢、  

Clement

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Clement、

    您能否在调用 CPU2上的 API 函数之前尝试禁用 ECC 检查?  

    请参阅以下示例代码:

       EALLOW;

       //

       //复位时启用 ECC。  在调用前禁用 ECC

        // F2837xD CPU2上的 Fapi_setActiveFlashBank()函数

       //

       Flash0EccRegs.ecc_enable.bit.enable = 0x0

     

      //

       //刷新 CPU 流水线

       //

       _asm (" RPT #7 || NOP");

     

       //

       // Fapi_setActiveFlashBank 函数设置闪存组和 FMC

       //用于在组上执行进一步的闪存操作

       //

       oReturnCheck = Fapi_setActiveFlashBank (Fapi_FlashBank0);

       if (oReturnCheck!= Fapi_Status_Success)

       {

           //

           //检查闪存 API 文档以了解可能的错误

           //

           Example_Error (oReturnCheck);

       }

     

    谢谢、此致、

    Vamsi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、 Vamsi、  

     实际上、在 ECC 禁用的情况下、它正在工作。 感谢您帮助我解决这一问题已有一段时间。 我在新电路板上遇到问题的奇怪器件是使用相同版本 的 TMS320F28377D 开发的、而不是使用旧器件(去年制造的)进行开发的。

    此致、  

    Clement

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Clement、

    很高兴它能为您提供帮助。 今年早些时候、TI 通过针对 F2837xD 器件的 SIEP 信函向客户提供了上述权变措施、这些器件针对 TI-OTP 提供了错误的 ECC。 除了上述 CPU2闪存编程问题之外、在闪存外执行应用程序时、不会影响其他器件功能或正常的主闪存阵列 ECC 检查。

    如果需要、我可以通过 E2E 论坛上的朋友请求离线联系您、以便为您提供更多详细信息。 请告诉我。

    谢谢、此致、
    Vamsi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Vamsi、

    感谢您提供的所有信息、我有我需要的一切。

    此致、
    Clement