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.

[参考译文] TMS320F28062:如何在保护 CPU 时使用 FLASH-API?

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1401529/tms320f28062-how-to-use-flash-api-when-cpu-is-secured

器件型号:TMS320F28062
Thread 中讨论的其他器件:C2000WARE

工具与软件:

您好!

我正在为 f28062芯片开发引导加载程序。

遗憾的是、当 CPU 受到保护时、闪存 API 函数(擦除/编程/验证)会返回代码10 (STATUS_FAIL_CSM_LOCKED)。

我做错了什么?

以下是我的配置:

  1. "ramfuncs"扇区包含 ISR、FLASH_API_CALLBACK
  2.  这些函数被复制到 RAML0
  3. ".stack"扇区位于 RAMM0中
  4. ".ebss"扇区位于 RAML1中

此致、
Piotr Romaniuk

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

    尊敬的 Piotr:

    您是否保护了包括 L0和 L1在内的所有安全闪存和 RAM? 您从哪里调用闪存 API?

    谢谢!

    Luke

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

    尊敬的 Luke:

    我认为这种 CPU 模型(即 f28062)没有安全区域配置。
    闪存和一些 RAM 块被永久分配到安全区域、对吧?

    此致、

    Piotr Romaniuk

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

    尊敬的 Piotr:

    F2806有一个代码安全模块(CSM)。 我更熟悉 DCSM、但我可以找到有关 CSM 的任何问题的答案。

    您是否能够通过读取此寄存器来确定 CSM 是否已锁定:

    本节介绍当 CSM 被锁定时、哪些存储器区域会受到 CSM 影响:

    您的引导加载程序是从安全存储器还是不安全存储器运行? 如果从不安全的存储器运行、这可能会阻止引导加载程序通过闪存 API 修改安全闪存。

    谢谢!

    Luke

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

    尊敬的 Luke:

    我想我的初始帖子会解答您的问题:

    [报价用户 id="64714" url="~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1401529/tms320f28062-how-to-use-flash-api-when-cpu-is-secured "]

    以下是我的配置:

    1. "ramfuncs"扇区包含 ISR、FLASH_API_CALLBACK
    2.  这些函数被复制到 RAML0
    3. ".stack"扇区位于 RAMM0中
    4. ".ebss"扇区位于 RAML1中
    [报价]

    (b)。 我确信 CPU 已被锁定、因为:

    1. 我在 CCS 调试器中看到过它:闪存被报告为零填充、
    2. @CCS:当我输入密钥并解锁时、我看到了闪存的真实内容、
    3. 闪存 API 函数报告它已锁定: STATUS_FAIL_CSM_LOCKED、
    4. 当我在引导加载程序中解锁它时、通过使用上面的键(即 B.3)、问题就会消失
    您的引导加载程序是从安全内存还是不安全内存运行?

    引导加载程序的核心是 FLASHA 扇区中、某些编程后无法在闪存中使用的函数被复制到 RAML0中并从该扇区运行。

    此致、

    Piotr Romaniuk

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

    尊敬的 Piotr:

    让我和我们团队中的其他 DCSM 专家讨论这个问题、然后回复您。

    谢谢!

    Luke

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

    尊敬的 Luke:

    已经过去了8天,没有解决办法。

    对我们来说、这是一个非常关键的问题、生产流程被阻止、本周无法发布和销售100个器件。

    此致、
    Piotr Romaniuk

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

    尊敬的 Piotr:

    我能够获得 F2806的闪存 API 指南、其中包含以下此错误代码的描述:

    您能否确认闪存 API 已置于 L0或 L4 RAM 中? 您能否共享链接器文件?

    我假设您根据您先前的回复完成了此操作:

    1. "ramfuncs"扇区包含 ISR、FLASH_API_CALLBACK
    2.  这些函数被复制到 RAML0

    我可以验证您的链接器文件以确认这一点。 您的项目中是否有任何其他链接器文件因错误而被激活?

    我已经向我们的 DCSM 专家强调了这一问题的重要性、我将在明天就这一问题提出任何其他可能的根本原因作出答复。

    谢谢!

    Luke

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

    尊敬的 Luke:

    我有一个疑问:我调用闪存 API 函数的位置应该也位于 SARAM 中吗?

    我再次进行检查、发现这在我的代码中不正确、但在 TI 闪存编程示例中却正确。

    如果有这种限制、为什么需要这样做? 原理是什么?

    此致、

    Piotr Romaniuk

    PS
    该处理器中的闪存 API 位于 ROM 中:

    abs   003ffef3  _Flash2806x_APIVersionHex        
    abs   003ffebd  _Flash2806x_Erase                
    abs   003ffebb  _Flash2806x_Program              
    abs   003ffee7  _Flash2806x_ToggleTest           
    abs   003ffedf  _Flash2806x_Verify

    链接器脚本(项目文件夹还包含标准 F2806x_Headers_nonBIOS.cmd):

    /*
    // TI File $Revision: /main/3 $
    // Checkin $Date: March 3, 2011   13:45:44 $
    //###########################################################################
    //
    // FILE:    F28062.cmd
    //
    // TITLE:   Linker Command File For F28062 Device
    //
    //###########################################################################
    // $TI Release: $
    // $Release Date: $
    //###########################################################################
    */
    
    /* ======================================================
    // For Code Composer Studio V2.2 and later
    // ---------------------------------------
    // In addition to this memory linker command file,
    // add the header linker command file directly to the project.
    // The header linker command file is required to link the
    // peripheral structures to the proper locations within
    // the memory map.
    //
    // The header linker files are found in <base>\F2806x_headers\cmd
    //
    // For BIOS applications add:      F2806x_Headers_BIOS.cmd
    // For nonBIOS applications add:   F2806x_Headers_nonBIOS.cmd
    ========================================================= */
    
    
    
    /* Define the memory block start/length for the F2806x
       PAGE 0 will be used to organize program sections
       PAGE 1 will be used to organize data sections
    
       Notes:
             Memory blocks on F28062 are uniform (ie same
             physical memory) in both PAGE 0 and PAGE 1.
             That is the same memory region should not be
             defined for both PAGE 0 and PAGE 1.
             Doing so will result in corruption of program
             and/or data.
    
             Contiguous SARAM memory blocks can be combined
             if required to create a larger memory block.
    */
    
    MEMORY
    {
    PAGE 0 :   /* Program Memory */
               /* Memory (RAM/FLASH/OTP) blocks can be moved to PAGE1 for data allocation */
       RAML0       : origin = 0x008000, length = 0x000800     /* on-chip RAM block L0 */   
       OTP         : origin = 0x3D7800, length = 0x000400     /* on-chip OTP */
    
       FLASHB      : origin = 0x3F4000, length = 0x002000     /* on-chip FLASH */
       FLASHA      : origin = 0x3F6000, length = 0x001F80     /* on-chip FLASH */
    
       CSM_RSVD    : origin = 0x3F7F80, length = 0x000076     /* Part of FLASHA.  Program with all 0x0000 when CSM is in use. */
       BEGIN       : origin = 0x3F7FF6, length = 0x000002     /* Part of FLASHA.  Used for "boot to Flash" bootloader mode. */
       CSM_PWL_P0  : origin = 0x3F7FF8, length = 0x000008     /* Part of FLASHA.  CSM password locations in FLASHA */
    
       ROM         : origin = 0x3FF3B0, length = 0x000C10     /* Boot ROM */
       RESET       : origin = 0x3FFFC0, length = 0x000002     /* part of boot ROM  */
       VECTORS     : origin = 0x3FFFC2, length = 0x00003E     /* part of boot ROM  */
    
    PAGE 1 :   /* Data Memory */
               /* Memory (RAM/FLASH/OTP) blocks can be moved to PAGE0 for program allocation */
               /* Registers remain on PAGE1                                                  */
    
       BOOT_RSVD   : origin = 0x000000, length = 0x000050     /* Part of M0, BOOT rom will use this for stack */
       RAMM0       : origin = 0x000050, length = 0x0003B0     /* on-chip RAM block M0 */
    //   RAMM1       : origin = 0x000400, length = 0x000400     /* on-chip RAM block M1 */
       DRAML1      : origin = 0x008800, length = 0x000400     /* on-chip RAM block L1 */
       DRAML2       : origin = 0x008C00, length = 0x005400	/* ram 21k	*/
       //RAML2       : origin = 0x008C00, length = 0x005400	/* ram 21k	*/
       //RAML2       : origin = 0x008C00, length = 0x000400     /* on-chip RAM block L2 */
       //RAML3       : origin = 0x009000, length = 0x001000	  /* on-chip RAM block L3 */
       //RAML4       : origin = 0x00A000, length = 0x002000     /* on-chip RAM block L4 */
       //RAML5       : origin = 0x00C000, length = 0x002000     /* on-chip RAM block L5 */
       USB_RAM     : origin = 0x040000, length = 0x000800     /* USB RAM	- not used	  */
    }
    
    /* Allocate sections to memory blocks.
       Note:
             codestart user defined section in DSP28_CodeStartBranch.asm used to redirect code
                       execution when booting to flash
             ramfuncs  user defined section to store functions that will be copied from Flash into RAM
    */
    
    
    SECTIONS
    {
    
       /* Allocate program areas: */
       .cinit              : > FLASHA,     PAGE = 0
       .pinit              : > FLASHA,     PAGE = 0
       .text               : > FLASHA,     PAGE = 0
       codestart           : > BEGIN,      PAGE = 0
       ramfuncs            : LOAD = FLASHA,
                             RUN = RAML0,
                             LOAD_START(_RamfuncsLoadStart),
                             LOAD_END(_RamfuncsLoadEnd),
                             RUN_START(_RamfuncsRunStart),
                             LOAD_SIZE(_RamfuncsLoadSize),
                             PAGE = 0
    
    /*#ifdef __TI_COMPILER_VERSION - not used 
       #if __TI_COMPILER_VERSION >= 15009000
        //.TI.ramfunc : {} LOAD = FLASHD,
        .TI.ramfunc : {} LOAD = FLASHA,
                             RUN = RAML0,
                             LOAD_START(_RamfuncsLoadStart),
                             LOAD_END(_RamfuncsLoadEnd),
                             RUN_START(_RamfuncsRunStart),
                             PAGE = 0
       #endif
    #endif*/
    
    //keys and reserved area
       csmpasswds          : > CSM_PWL_P0, PAGE = 0
       csm_rsvd            : > CSM_RSVD,   PAGE = 0
    
       /* Allocate uninitalized data sections: */
       .stack              : > RAMM0,      PAGE = 1
       .ebss               : > DRAML1,      PAGE = 1
       .esysmem            : > DRAML1,      PAGE = 1
    
       /* Initalized sections to go in Flash */
       .econst             : > FLASHA,     PAGE = 0
       .switch             : > FLASHA,     PAGE = 0
       
      
       /* .reset is a standard section used by the compiler.  It contains the */
       /* the address of the start of _c_int00 for C Code.   /*
       /* When using the boot ROM this section and the CPU vector */
       /* table is not needed.  Thus the default type is set here to  */
       
       .reset              : > RESET,      PAGE = 0, TYPE = DSECT
       vectors             : > VECTORS,    PAGE = 0, TYPE = DSECT
    
    }
    
    /*
    //===========================================================================
    // End of file.
    //===========================================================================
    */
    
    

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

    尊敬的 Piotr:

    这可能是必需的、因为大多数存储器无论如何都是安全的。 您能否测试使用安全存储器区域中的代码调用闪存 API、并查看是否遇到同样的问题? 我也在向其他专家确认这一点。

    谢谢!

    Luke

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

    尊敬的 Luke:

    您是否能够测试使用安全存储器区域中的代码调用闪存 API 并查看是否出现同样的问题?

    它现在位于安全存储器中、但在闪存中、而非 SARAM 中。

    我将尝试将其移至 RAM。

    此致、

    Piotr Romaniuk

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

    请告诉我这样是否可以解决此问题。

    谢谢!

    Luke

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

    尊敬的 Luke:

    我执行了测试。

    我从 RAML0调用 FlashErase()。 该函数失败、返回代码10用于安全 CPU。

    此致、

    Piotr Romaniuk

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

    尊敬的 Piotr:

    我试图在我这边重现此问题、以了解此问题的原因。 是否通过引导加载程序解锁 CSM? 您是否曾经遇到过此问题、或者最近是否刚刚开始出现此问题?

    谢谢!

    Luke

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

    尊敬的 Luke:

    正在通过引导加载程序解锁 CSM 是否有有效选项?

    否 这就是我讨论这个问题的原因。

    根据德州仪器(TI)文档、它应该在解锁的情况下工作。

    您是否一直遇到过此问题、或者最近才开始出现此问题?

    我无法向您提供任何统计数据。 我刚刚开发了引导加载程序、并注意到它在锁定的 CPU 上不起作用。  

    我正在尝试重新创建此问题、以了解此问题的原因。

    您可以从 C2000Ware 中的示例开始。 请注意、这里有一个小错误:

    https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1407047/tms320f28062-bug-in-the-flash-programming-example

    如果您在锁定的器件上运行、FlashErase 将立即失败。

    Luke、案例对我们非常关键、我告诉过您大约100个器件会被延迟、因为问题尚未解决、现在500个下一个问题就要解决了!!!

    此致、

    Piotr Romaniuk

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

    尊敬的 Piotr:

    很抱歉,我在周五和昨天的劳动节下班,我理解这是一个非常关键的问题。 我已经获得了 F2806 LaunchPad 来重现并了解这个问题、现在正在处理这个问题。

    谢谢!

    Luke

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

    尊敬的 Piotr:

    您是否在连接了调试器的情况下执行该测试? 当我在器件安全的情况下尝试单步执行代码时、我立即与器件断开连接。 您如何获得 STATUS_FAIL_CSM_LOCKED 的错误代码

    谢谢!

    Luke

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

    尊敬的 Piotr:

    我已经在我这边重新创建了这个问题、方法是在独立模式下运行并根据闪存擦除选项是否成功来切换 LED。 我将与 其他 DCSM 专家讨论这些结果、以确定根本原因或是否需要更新文档。

    谢谢!

    Luke

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

    尊敬的 Luke:

    您刚刚体验了 ECSL 保护。 您不能在安全芯片上使用调试器。  

    在我的测试中、由于这是最后一个用例、因此未连接调试器。

    对引导加载程序执行了初始测试-我发现了这个问题。 返回代码通过 Modbus 传输并在笔记本电脑上读取。 不幸的是,我不能分享这些来源。

    接下来、我尝试找出问题所在、并提供充分的理由来重复该问题。

    我检查了德州仪器(TI)提供的闪存编程示例、但如果 FlashErase 返回成功或失败、我添加了 LED 信号。

    我还添加了无限循环、以确保我只测试擦除函数。

    其他症状是上电和从擦除功能返回之间的时间、当它擦除7-8秒后返回的所有扇区时。 如果出现错误、函数会立即返回。

    除了明显的 bugfix 之外、我没有将所有修改发送给您、因为我希望您使用 c2000Ware 中的源代码、并将其作为参考。 至少应该是这样。

    在我看来,通过测试不同的选项和假设来解决这一问题将是极其困难的。 它必须来自芯片内的 CSM 架构-管理 CSM 的基本规则。  

    此致、

    Piotr Romaniuk

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

    尊敬的 Piotr:

    我相信我发现了问题的原因。 我注意到您已将 Example_Call API 函数分配给"ramfuncs"、但没有分配 Flash_Erase 函数、该函数在 C2000Ware/libraries/flash_api/f2806x/include/Flash2806x_api_Library.h 中声明 您可以通过将鼠标悬停在 Example_Flash 806x_api.c 中调用函数的位置并点击 Ctrl、导航到该函数声明。

    我向此文件添加了以下行、这一行导致我的 LED 指示闪存擦除功能成功:

    #pragma CODE_SECTION(Flash_Erase,"ramfuncs"); //ADDED THIS LINE
    #if FLASH_F2806x
    #define Flash_Erase(a,b)          Flash2806x_Erase(a,b)
    #define Flash_Program(a,b,c,d)    Flash2806x_Program(a,b,c,d)
    #define Flash_Verify(a,b,c,d)     Flash2806x_Verify(a,b,c,d)
    #define Flash_ToggleTest(a,b)     Flash2806x_ToggleTest(a,b)
    #define Flash_DepRecover()        Flash2806x_DepRecover()
    #define Flash_APIVersionHex()     Flash2806x_APIVersionHex()

    您能否在最后尝试一下、并告诉我这是否适合您?

    谢谢!

    Luke

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

    尊敬的 Luke:

    您描述的更改不起作用。 这就是原因。

    我注意到您已将 Example_Call appi 函数分配给"ramfuncs"、但没有分配给 Flash_Erase

    在这个特定 CPU 中、闪存 API 位于 ROM 中、连接到工程的库仅包含供链接器正确构建程序的符号。
    Flash2806x_Erase 位于 ROM 内的0x3FFEBD 上。

    [报价 userid="529193" url="~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1401529/tms320f28062-how-to-use-flash-api-when-cpu-is-secured/5392431 #5392431"] Flash_Erase 函数(在 C2000Ware/libraries/flash_api/f2806x/include/Flash2806x_api_Library.h 中声明)。

    #define Flash_Erase(a,b)          Flash2806x_Erase(a,b)

    这不是预处理器的声明 buf 宏定义。 预处理器将源文件转换为文本、对 C、函数和链接一无所知。 预处理源文件编译完毕后、可以通过在工程设置中添加选项来查看这些文件。 在这种中间文件中、您将不会看到任何 Flash_Erase 函数。 由于编译器通过生成 警告进行确认、因此不需要执行此步骤:  

    "[...] Flash2806x_API_Library.h", line 163: warning: specified symbol 'Flash_Erase' undefined
    F

    最终证明是对程序的.map 文件进行比较、其中包含和不包含更改。 它们仅因构建时间而异。  

    此致、

    Piotr Romaniuk

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

    尊敬的 Piotr:

    我的错误是、当我获得这些测试结果时、意外禁用了区域锁定、当再次运行且启用了 FORCESEC 位时、此测试对我也失败了。

    我今天下午将与其他 DCSM 专家举行会议、讨论这一问题、并将在今天结束前提供最新情况。

    谢谢!

    Luke

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

    尊敬的 Piotr:

    我认为这只需要从 ROM 复制闪存 API 来保护 RAM 和调用 RAM 函数、今天我将在结束时尝试这种操作。

    谢谢!

    Luke

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

    尊敬的 Piotr:

     C:Example_Flash 806x_API 中的示例涵盖了另一种可行的方法。 此操作会将闪存 API 加载到闪存中、然后将其复制到 RAM 中。 另一位客户尝试将 API 从 ROM 复制到 RAM、但被指示改用此方法:

    https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/170158/how-to-copy-the-f2803x-flash-api-to-ram#pi316717=3&pi316717filter=answers&pi316717scroll=false

    请注意、您必须修改此示例以将闪存 API 加载到闪存中、而不是使用 ROM (取消注释链接器.cmd 中的某个段并更改项目属性、以便在 main 函数中将 memcopy 从闪存加载到 RAM)。

    我会在今天结束之前尝试在我这边进行测试、如果我无法测试、请告诉我这是否对您有效。

    谢谢!

    Luke

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

    Luke、谢谢

    我使用了没有 SW_API 构建配置的较旧 c2000Ware (即5-00-00-00)。  我刚于5月2日00-00进行了检查、发现了 SW_API。

    我将下载明天最新的一个,并在我的网站上检查它。  外观更好。

    此致、

    Piotr Romaniuk

    PS
    顺便说一下、我还想到了您先前的想法、即将 ROM 复制到 RAM 中、但可能不可重定位代码。 没有这些来源、这是非常重要的。

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

    是的、我们似乎没有从 ROM 向 RAM 复制闪存 API 的实用方法。 希望闪存至 RAM 方法适合您。