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.

[参考译文] TMS320F28377D:CPU2 DCSM OTP 安全设置能否禁用对 CPU1闪存的访问?

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/762208/tms320f28377d-can-cpu2-dcsm-otp-security-settings-disable-access-to-cpu1-flash-memory

器件型号:TMS320F28377D
主题中讨论的其他器件:controlSUITEC2000WAREUNIFLASH

您好!

我正面临一个奇怪的问题。 我开发了引导加载程序、可以使用 FlashAPI 函数对 CPU1或 CPU2闪存(或 OTP DCSM 位置)进行编程/验证。 引导加载程序被加载(使用并行引导模式访问)并从共享 GSRAMx 运行。 一个引导加载程序用于访问 CPU1、另一个用于 CPU2内核。 我已经对 CPU1闪存、CPU2闪存和 CPU2的 DCSM OTP 位置进行了编程(所有操作都无错误通过)。 之后、我将器件断电、为器件加电、将 CPU1的引导加载程序加载到 GSRAM (负载似乎正常)、并尝试对 DCSM OTP CPU1存储器位置进行编程。 但我的引导加载程序停止工作! 似乎在器件断电和加电后、DCSM OTP CPU2安全设置(仅对 ZONE1 Z1-LINKPOINTER1/2/3、Z1-PSWDLOCK、Zx-GRABRAM、Zx-GRABSECT 和 Zx-CSMPSWD0/1/2/3 OTP 位置进行编程)会禁用运行代码以进行 CPU1编程... 这是正常的吗? 为什么会发生这种情况? 我已经预料到、只有 CPU1 (作为主内核)可以禁用或禁用并行引导模式?

如果我创建一个单一引导加载程序、在一个代码中可以访问 CPU1或 CPU2中的闪存而不对器件断电和上电、我是否能够成功地对两个 CPU 的 DCSM OTP 位置进行编程? controlSUITE/C2000ware 中是否存在一些示例代码、在从 CPU1访问 CPU2与返回之间进行切换?

感谢您的回答!

此致、

Tomas Lehotsky

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

    对 CPU2用户 OTP 进行编程不应对 CPU1用户 OTP 位置的编程产生任何影响。 有一点不清楚的是、如果 CPU2用户 OTP 设置未编程、您是否能够正确执行该操作? 此外、您是否能够对闪存扇区进行编程、问题仅与用户 OTP 有关? 您能否将器件连接到 CCS 并检查 CPU2用户 OTP 设置以确保按预期进行编程;如果共享此信息没有问题、您能否共享这些值。 此外、当 CPU1引导加载程序尝试对其闪存/用户 OTP 设置进行编程时、CPU2在做什么?

    此致、

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

    您好、Vivek、

    [引用 user="Vivek Singh)]有一点不清楚,那就是如果未对 CPU2用户 OTP 设置进行编程,您是否能够正确执行该操作? 此外、您是否能够对闪存扇区进行编程、问题仅与用户 OTP 有关?

    [/报价]

    是的、如果未对 CPU2用户 OTP 进行编程、我的引导加载程序工作正常、并且每次对器件执行操作(编程/验证/...) 工作无任何问题。 这对两个 CPU 的闪存扇区或 OTP 存储器有效。 当然、当我将 CPU1用户 OTP 密码位置编程为一些非空值时、情况将是相同的。 从这一点开始、我无法访问该器件(由于 bootROM 访问...)。

    [引用 USER="Vivek Singh)]您能否将器件连接到 CCS 并检查 CPU2用户 OTP 设置以确保按预期进行编程;如果共享此信息没有问题、您能否共享这些值。

    [/报价]

    我确信、这些值已按照我的需要成功编程-当我使用 TI UniFlash 闪存工具并将编程的密码数据放在那里时、CPU2闪存已解锁。 在本例中、我能够在 UniFlash 工具中擦除/编程 CPU2闪存、而不会出现任何问题。 我不知道如何在 CCS"Memory Browser"窗口中查看 CPU2 OTP 位置、CPU2用户 OTP 的密码位置是否编程为非空值。 但是、我的程序和验证例程对 CPU2用户 OTP 位置进行编程、在编程期间不会返回任何错误。

    CPU2用户 OTP 位置已按如下方式进行编程:

    Z1-LINKPOINTER1 -地址0x78000、数据0x1FFF_FFFF

    Z1-LINKPOINTER2 -地址0x78004、数据0x1FFF_FFFF

    Z1-LINKPOINTER3 -地址0x78008、数据0x1FFF_FFFF

    Z1-PSWDLOCK -地址0x78010、一些非空数据(由于安全性原因、我无法共享...)

    Z1-GRABRAM -地址0x78024、数据0xFFF_5FFF

    Z1-GRABSECT -地址0x78026、数据0xFFF5_5555

    Z1-CSMPSWD0/1/2/3 -地址0x78028 - 0x7802E、一些非空白数据(由于安全性原因、我无法共享...)

    所有其他 CPU2用户 OTP 具有0xFFFF 空值。

    [引用 user="Vivek Singh">此外、当 CPU1引导加载程序尝试对其闪存/用户 OTP 设置进行编程时、CPU2会执行什么操作?

    [/报价]

    嗯、我从未关注过它。 是否有任何特殊呼叫需要呼叫、我不需要呼叫? 这是 CPU1闪存编程"main.c"过程的开始:

    void main (void)
    {
    //步骤1。 初始化系统控制:
    //启用外设时钟
    //此示例函数位于 F2837xD_sysctrl.c 文件中。
    InitSysCtrl();
    
    //解锁 CSM
    //
    //如果 API 函数将在不安全的 RAM 中运行
    //则必须解锁 CSM,以便闪存
    // API 函数访问闪存。
    //如果从安全内存执行闪存 API 函数
    //则不需要此步骤。
    //DcsmZ1Unlock();
    
    //步骤2. 初始化 GPIO:
    //此示例函数位于 F2837xD_GPIO.c 文件中,
    //说明了如何将 GPIO 设置为其默认状态。
    InitGpio();//针对此示例跳过
    
    //步骤3。 清除所有中断并初始化 PIE 矢量表:
    //禁用 CPU 中断
    Dint;
    
    //将 PIE 控制寄存器初始化为默认状态。
    //默认状态是禁用所有 PIE 中断并
    清除标志//。
    //此函数位于 F2837xD_PIECTRL.c 文件中。
    InitPieCtrl();
    
    //禁用 CPU 中断并清除所有 CPU 中断标志:
    IER = 0x0000;
    IFR = 0x0000;
    
    //使用指向 shell 中断
    //服务例程(ISR )的指针初始化 PIE 矢量表。
    //这将填充整个表,即使在
    本示例中未使用中断//也是如此。 这对于调试很有用。
    //可以在 DSP2802x_DefaultIsr.c 中找到 shell ISR 例程
    //此函数可在 F2837xD_PieVect.c 中找到
    InitPieVectTable();
    
    //将时间关键代码和闪存设置代码复制到 RAM
    //其中包括 InitFlash()、闪存 API 函数以及//
    分配给 ramfuncs 段的任何函数。
    // RamfuncsLoadStart、RamfuncsLoadEnd 和 RamfuncsRunStart
    //符号由链接器创建。 请参阅器件.cmd 文件。
    
    //memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(size_t)&RamfuncsLoadSize);
    
    //调用闪存初始化以设置闪存等待状态
    //此函数必须驻留在 RAM 中
    
    InitFlash();
    
    //增益泵信标
    使 eFlashPump();
    
    //跳转至 RAM 并调用闪存 API 函数
    Example_CallFlashAPI();
    } 

    我一直在想是否未从安全 RAM 中加载和运行 CPU1代码(由上面列出的 CPU2用户 OTP 设置设置进行设置)。 因此、我要附加链接器文件以进行 CPU1编程。

    e2e.ti.com/.../linker_5F00_file_5F00_flash_5F00_programming_5F00_cpu1_5F00_RAM.zip

    我真的不明白 CPU2用户 OTP 设置为什么会导致我的引导加载程序(从共享 GSxRAM 加载并运行)无法正常工作... 有什么想法吗? 您是否需要任何其他信息?

    此致、

    Tomas Lehotsky

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

    您好、Tomas、

    [引用]我一直在想我的 CPU1代码是否未从安全 RAM 中加载和运行(由上面列出的 CPU2用户 OTP 设置设置进行设置)。 因此、我要附加链接器文件以进行 CPU1编程。 [/报价]

    每个 CPU 都有自己的专用安全 RAM、因此这不是问题。

    [引用]我真的不明白 CPU2用户 OTP 设置为什么会导致我的引导加载程序(从共享 GSxRAM 加载并运行)无法正常工作... 有什么想法吗? 您是否需要任何其他信息? [/报价]

    在这种情况下、您是否检查了 XRSn 引脚的状态? 它是稳定的还是切换的。 如果 CPU2正在引导、但由于安全原因无法运行代码、则可能会向 CPU1发出 NMI、这将影响 CPU1的执行。 因此、了解 CPU2在本例中的作用非常重要。

    如果您可以在连接 CCS 的情况下运行它、那会更好。

    此致、

    Vivek Singh

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

    您是否能够检查 XRSn 状态和 CPU2状态?

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

    您好、Vivek、

    很抱歉耽误了回复-我太忙了这个项目。

    [引用 USER="Vivek Singh"]如果 CPU2正在引导但由于安全原因无法运行代码,则可能会向 CPU1发出 NMI,这将影响 CPU1的执行。 因此、了解 CPU2在本例中的作用非常重要。

    [/报价]

    你是对的。 CPU2正在执行可能影响 CPU1代码执行的操作这一想法似乎是正确的。 我在主过程中输入了以下命令:

    EALLOW;
    DevCfgRegs.CPU2RESCTL.ALL = 0xA5A50001;
    EDIS; 

    它将 CPU2保持在复位状态。 此解决方案正常工作、我的 CPU1代码运行时没有任何问题。

    感谢你的帮助!

    此致、

    Tomas