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.

[参考译文] TMS320F28075:无法从 DCSM 安全 RAM 执行闪存 API 写入

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/593910/tms320f28075-can-not-execute-flash-api-writes-from-dcsm-secured-ram

器件型号:TMS320F28075

作为我的设计的一部分、我将在'f28075中实现闪存仿真 EEPROM。  当器件未固定时、它工作正常。  我现在正尝试锁定芯片、为客户交付做好准备。  我已使用密码设置 DSCM、并将所有闪存扇区、LSx RAM 和 Dx RAM 安全到同一个区域(区域1)。 当我运行程序时、程序的闪存写入部分不会向闪存写入任何内容。

调试观察结果:

  • 在 flash_write()例程中使用了"Fapi_issueProgrammingCommand()"。
  • Fapi_issueProgrammingCommand()在执行时返回"Fapi_Status_SUCCESS"的状态,但对闪存的检查显示没有写入任何内容。
  • 闪存读取(使用"Fapi_doMargininaad()")似乎正常工作。
  • 所有闪存 API 函数和任何包含闪存 API 调用的例程都被复制到 RAM、并且这些 RAM 函数已经被映射到安全 RAM (RAMLSx)。
  • 如果我使用通行匹配流程解锁芯片、则闪存写入操作正常。

DCSM 和闪存 API 的文档表示、如果闪存 API 例程在安全 RAM 之外执行、并且 RAM 与安全闪存扇区位于同一区域、那么器件不必被解锁。

是否可以在无需解锁器件的情况下执行从安全 RAM 到安全闪存(两者都位于同一 DCSM 区域)的闪存写入?

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

    您好!

    [引用]是否可以在无需解锁器件的情况下执行从安全 RAM 到安全闪存(两者都位于同一 DCSM 区域)的闪存写入? [/报价]

    是的、这应该起作用。

    在开始此操作之前、您能否检查您是否在代码中捕获了闪存信标。 基本上、将 FLSEM 寄存器中 SEM 字段的值(请参阅第2.14.13.1节 FLSEM 寄存器(偏移= 0h)[复位= 0h])更改为0x01。

    此致、

    Vivek Singh

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

    Toby、

    还有一个要检查的地方: 确保 Fapi_UserDefinedFuncations.c 文件中的函数被分配给.TI.ramfunc 段。

    谢谢、此致、

    Vamsi

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

    我在执行"Fapi_initializeAPI (F021_CPU0_BASE_ADDRESS、120)"之前添加了以下语句;
    //获取闪存信标
    DcsmCommonRegs.FLSEM.bit.KEY = 0xA5;
    DcsmCommonRegs.FLSEM.bit.sem = 1;

    我只执行此操作一次(不是在每次写入之前)、因为所有安全性都限制在一个区域(区域1)。

    这没有解决我的问题。 行为与以前相同。
    我还可以尝试其他什么吗?

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

    您需要同时写入密钥和 SEM 位、如下所示。

    DcsmCommonRegs.FLSEM.ALL = 0xA501;

    请尝试此操作并让我们知道它是如何运行的。

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

    所有 Fapi 函数和库都被分配给"ramfuncs"段(使用 #pragma)。 我是否必须将它们全部更改为.TI.ramfuncs? 在链接器命令文件中、ramfuncs 段看起来与.TI.ramfuncs 段基本相同。 我没有看到正在分配给.TI.ramfuncs 的任何其他代码。

    我使用的是 C 编译器版本:TI v16.12.0.STS

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

    您的最后一个建议解决了我的问题!

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

    Toby、

    是的、如果编译器版本>= 15.9。x、则需要使用名称 .TI.ramfunc 而不是 ramfuncs。  

    如果您使用最新的 examples/cmd 文件、您将注意到以下定义使用编译器版本来分配到正确的部分:

    #ifdef __TI_Compiler_version__
    #if __TI_Compiler_version__>=15009000
    组
    {
    .TI.ramfunc
    {-l F021_API_F2837xS_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_F2837xS_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