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.

[参考译文] TMS320F2.8377万D:双核上的安全设置示例

Guru**** 2562310 points
Other Parts Discussed in Thread: CONTROLSUITE, C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/631902/tms320f28377d-security-setting-example-on-dual-core

部件号:TMS320F2.8377万D
主题中讨论的其他部件:controlSUITEC2000WARE

大家好,  

我使用双核,  希望 保护我的设备, 因此 除非 您有正确的密码,否则不能访问任何资源。

请 举例说明,您是否有如何执行此操作的教程?  

我只在一个内核上的controlSUITE中找到了一个示例。

任何建议/信息 都非常受欢迎 ,最好是流程图/代码  来实现。

谢谢你  

此致

卡洛

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

    大家好,Carlo问我这个问题。

    我需要将密码插入我的双核: 非常简单,我想将所有资源分配给Z1,并将一个简单的PSWD设置为能够访问内部的所有内容,但外部不能(不能使用C2Prog或CCS重新编程,除非我提供了正确的psw)。

    我附加了一个项目,它基本上阻止了我的DSP:其中有一个自述文件,其中描述了我用于插入PSW的解决方案和我发现的问题。 我需要一个解决方案以及如何操作

    1)以正确的方式在代码中插入PSWD

    2)使用CCS连接右侧PSW

    3)使用C2Prog重新编程DSP

    谢谢!

    Andrea Marcianesi。

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

    在双核设备上,两个CPU都具有Z1和Z1。 您需要仅在CPU1上或两个CPU (CPU1和CPU2)上确保Z1的安全吗?

    此致

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

    阅读自述文件后,我了解您在设定密码后无法连接至CCS。 这是预料之中的。 一旦设定了密码,就无法使用引导至闪存选项连接至CCS。 这在设备TRM部分的“2.13 .1.1 仿真代码安全逻辑(ECSL)”中有明确提及。 本节载有以下注释:

    "在初始调试具有OTP中的密码位置的设备时(已编程(安全)),
    仿真器需要一些时间来控制CPU。 在此期间,CPU将开始运行,并且可能会
    执行一个指令,执行对受保护的ECSL区域的访问,如果CPU在以下时间停止
    程序计数器(PC)指向安全位置,ECSL将跳闸并导致仿真器
    连接断开。
    此问题的解决方法是:
    •使用Wait Boot Mode (等待引导模式)引导选项。 在此模式下,CPU将处于循环状态,因此不会跳转至
    用户应用程序代码。 使用此引导模式,用户可以连接到CCS并调试代码。 "

    请将引导模式PIN设置更改为等待引导或任何其他引导模式(未使用),然后重置设备。 现在,您应该能够连接到设备,然后通过在闪存插件GUI中提供正确的密码来解锁设备。

    请告诉我您是否仍面临问题。

    此致,

    Vivek Singh
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    早上好Vivek
    首先,非常感谢您的回答。
    我尝试强制GPIO84=0和GPIO72=1 (等待模式),现在我可以再次连接到DSP。 因此,您的答案对Blackhawk部件是正确的。
    我认为当调试器存在时,等待模式是默认的引导模式。 我的错。
    现在,对于生产,我想使用C2PROG和串行通信对DSP进行重新编程。 因此,在本例中,我输入GPIO84=1和GPIO72=0 (SCI引导模式)。 如果您阅读自述文件,您可以看到虽然C2PROG允许插入PSW,但C2PROG无法重新编程CPU1。
    如何使C2PROG正常工作?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好Andrea -

    请注意,C2Prog目前仅支持DCSM的Z1。

    是否确定键入的密钥正确? 必须指定键值而不带前导0x,即“FFFE”,而不是“0xFFFE”。

    此外,如果您尚未锁定密码,您应该能够为所有密钥输入“0”以解锁芯片。

    心跳

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

    早上好,Codeskin,

    在我的DSP中,我仅保护CPU1,将所有内容分配给Z1区域。

    在代码库GUI中,只能插入4个字符,而不能插入0xFFF等数字,因为是6个字符。

    是的,我确定键入了正确的PSW,但解锁不起作用。 顺便说一句,我把这个项目附在了一起,如果你有一个双核测试板,你可以自己试一下。 对我们来说,这是一个大问题。

    我还尝试将所有0放入所有键中,并且实际工作,接口解锁DSP:这是非常非常奇怪的,因为DCSM实际上是安全的,所以怎么可能做到这一点? 在密钥字段中插入所有零即可解锁所有双核,这是不是一种可弹出性? 您能否向我解释一下它的工作原理? 我不确定它是否对DSP编程,但至少C2PROG确认了解锁,擦除程序。

    我需要明确地使用正确的psw使所有流程正常工作,并使用所有0锁定DSP。

    谢谢你。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Codeskin:
    我为Z1区域设定的密码如下
    DcsmZ1Regs.Z1_CSMKEY0 = 0xFFFFFFFE;
    DcsmZ1Regs.Z1_CSMKEY1 = 0xFFFFFFFF;
    DcsmZ1Regs.Z1_CSMKEY2 = 0xFFFFFFFF;
    DcsmZ1Regs.Z1_CSMKEY3 = 0xFFFFFFFF;

    所以,我认为我应该使用的psw是
    Key1=FFFE
    Key2=FFFF
    Key3=FFFF
    Key4=FFFF
    Key5=FFFF
    Key6=FFFF
    Key7=FFFF
    Key8=FFFF

    而是工作的psw
    Key1=FFFF
    key2=FFFE
    Key3=FFFF
    Key4=FFFF
    Key5=FFFF
    Key6=FFFF
    Key7=FFFF
    Key8=FFFF

    因此Key2可能是Z1_CSMKEY0的不太重要的单词(16位)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好Andrea -是的,这是正确的:最重要的单词首先是,最不重要的单词其次。

    当您输入所有零的特殊密钥时,C2Prog之所以能够解锁CSM,是因为您尚未激活密码锁(OTP中的PSWDLOCK位置),因此C2Prog内核能够读取密钥(请参阅spruhm8g中的2.13 .1.4 部分)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的,代码,
    那么C2Prog也在工作。

    我理解psw锁定的情况,所以现在,如果我锁定psw,我应该只能使用正确的psw进入,而不是所有的0,对吗? 我会试着告诉你。

    最后,当您说"C2Prog当前仅支持DCSM的Z1时,您指的是同时支持CPU还是仅支持CPU1? 何时准备好支持Z2区域?

    非常感谢您的答案Codeskin。

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

    Andrea,

    [引述]

    我理解psw锁定的情况,所以现在,如果我锁定psw,我应该只能使用正确的psw进入,而不是所有的0,对吗? 我会试着告诉你。 [/引述]

    这是在实际硬件中,因此是的,一旦您对PSWDLOCK字段进行编程,Codeskin将无法从设备读取密码值,因此输入密码值,因为所有0x0都将不起作用。

    此致,

    Vivek Singh

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

    早上好Vivek

    请再提供一个帮助。

    我尝试用这种方式锁定密码,对结构DcsmZ1Otp的默认值进行编程

    #define DCSM_Z1_OTP_DEFAULTS{     

    0xFFFFFFFE,     \ Z1OTP_LINKPOINTER1

    0xFFFF,          \

    0xFFFF,          \

    0xFFFFFFFE,      \ Z1OTP_LINKPOINTER2

    0xFFFF,          \

    0xFFFF,          \

    0xFFFFFFFE,      \ Z1OTP_LINKPOINTER3:

    0xFFFF,          \

    0xFFFF,          \

    0xFFFF,          \

    0xFFFF,          \

    0xFFFF,          \

    0xFFFF,          \

    0xFFFFFFFE,     \ Z1OTP_PSWDLOCK:锁定与所有0不同的psw I PU部件

    0xFFFF,          \

    0xFFFF,          \

    0xFFFFFFFF,     \ Z1OTP_CRCLOCK

    0xFFFF,          \

    0xFFFF,          \

    0xFFFF,          \

    0xFFFF,          \

    0xFFFF,          \

    0xFFFF,          \

    0xFFFF,          \

    0xFFFF,          \

    0xFFFFFFFF  }\     Z1OTP_BOOTCTRL

    我没有触摸任何其他东西,但现在我的DSP没有运行任何东西:LED不再闪烁,C2PROG无法自动检测DSP,因此即使串行通信也失败。

    DSP似乎没有什么做。

    相反,使用黑色Hack,我可以连接到DSP, 使用与以前相同的psw,但CPU 在一段时间内卡住了。  

    所有这些行为只是将 OTP中的PSWLOCK的1位更改:从0xFFFFFFFF 更改为0xFFFFFFFE

    你有什么想法吗?

    感谢您的回答

    Andrea Marcianesi。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Andrea,只更改PSWDLOCK值不会对现有代码造成任何问题。 它仅阻止访问密码位置。 您是否尝试过等待启动模式?

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

    早上好Vivek

    问题不是我无法连接调试器:如果我将DSP置于等待启动模式(GPIO72=1,GPIO84=0),调试器能够连接和编程DSP。 问题是当我拔下调试器并正常提供DSP时,DSP被阻止。 我觉得这是因为CPU1在等待CPU2。 因此,锁定密码似乎与处理器间通信有关。

    您有我的代码示例,您可以自己尝试:在示例中,我在CPU1中有2个LED (GPIO66,GPIO67) ,在CPU2 (GPIO68)中有一个。 您必须做的唯一更改是 F2837xD_dcsm.h文件中#define DCSM_Z1_OTP_DEFAULTS中的单词0xFFFFFFFF到0xFFFFFFFE。

    奇怪的是,当我将DSP置于SCI引导(GPIO72=0,GPIO84=1)中时,C2PROG无法连接到DSP,因为在串行通信期间无法自动检测: 在实践中,C2程序无法与DSP通信(解锁阶段应遵循此阶段,但C2PROG在解锁阶段之前失败)。


    非常感谢你的帮助。

    Andrea MArcianesi。

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

    Vivek目前不可用。 我将请他在得到你的答复后再看一下。

    您能否检查是否意外修改了BOOTCTRL?

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

    抱歉,我正在旅行,因此无法尝试您发送的示例。 正如我前面提到的,PSWDLOCK位只影响OTP中密码位置的可见性,因此不应影响执行。 您能否从CCS内存监视窗口向我们发送DCSM_Z1_OTP和Zone_Select_Block位置的快照? 您可以解锁设备,然后打开适用的内存范围和CCS内存监视窗口并发送快照。

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

    早上好,Vivek,旅途愉快!

    这是你问我的图片。

    感谢你的帮助。

    此致,

    Andrea Marcianesi。

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

    Andrea,

    1)您似乎与Vivek共享了一个项目。 您能将它发送给我,以便我尝试一下吗?

    2)根据您提供的快照,我看到只有扇区A到扇区G分配给区域1,而REST不受保护。 这是故意的吗? 我是因为您提到您要将所有资源分配给区域1。

    3)您是否在Unsecured Flash中有任何代码尝试访问安全闪存或RAM? 请检查。

    4)您能否确认从工作项目更改为不工作项目的唯一方法是PSWDLOCK中的1位翻转? 您是否按此顺序重试过:0xFFFFFFFF应该正常工作,但只有一个更改0xFFFFFFFE不工作?

    谢谢,此致,
    Vamsi

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

    另一个问题:您是否也确保了CPU2?

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

    让我们按顺序回答:
    1)您似乎与Vivek共享了一个项目。 您能将它发送给我,以便我尝试一下吗?
    很遗憾,我不得不删除示例项目,但我会尽快给您一个示例。

    2)根据您提供的快照,我看到只有扇区A到扇区G分配给区域1,而REST不受保护。 这是故意的吗? 我是因为您提到您要将所有资源分配给区域1。
    是的,这是需要的,因为实际上我的项目是针对F2.8374万D的,它只有A到G的扇区

    3)您是否在Unsecured Flash中有任何代码尝试访问安全闪存或RAM? 请检查。

    是的,我有从GSxRAM运行的代码:例如,示例是bootloader,API Flash Write函数从该块运行。 这应该不是问题,因为在主页中,结构如下所示

    Void主(void)

    U16 I;
    unsigned char U16_CheckBuffer[32];
    U16 U16_CheckBuffer2[32];
    U16 U16_Tmp1;

    InitSysCtrl();
    DCSM_DcsmInit();
    CsmUnlock();
    …。
    使用
    UINT16 CsmUnlock()

    易失性UINT16温度;

    //使用当前密码加载密钥寄存器。 0xFFFF是虚拟的
    //密码。 用户应使用正确的DSP密码替换它们。

    EALLOW;
    DcsmZ1Regs.Z1_CSMKEY0 = 0xFFFFFFFE;
    DcsmZ1Regs.Z1_CSMKEY1 = 0xFFFFFFFF;
    DcsmZ1Regs.Z1_CSMKEY2 = 0xFFFFFFFF;
    DcsmZ1Regs.Z1_CSMKEY3 = 0xFFFFFFFF;
    EDIS;
    返回0;

    }
    因此,在执行某些操作之前,所有受保护的闪存都应该是不安全的。

    4)您能否确认从工作项目更改为不工作项目的唯一方法是PSWDLOCK中的1位翻转? 您是否按此顺序重试过:0xFFFFFFFF应该正常工作,但只有一个更改0xFFFFFFFE不工作?
    是的,我可以确认。

    5)您是否也保护了CPU2?
    否,CPU2没有保护所有资源。

    我将尽快向你提供我的例子。
    此致,
    Andrea Marcianesi
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Andrea,

    #1: 好的,我将等待这个例子。

    新问题: 在对密码锁定进行编程之前,应用程序是否在独立(无调试器)模式下成功?

    谢谢,此致,

    Vamsi

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

    Andrea,

    我查看了您的团队发送给我的离线项目。  我注意到下面的结构定义是由用户添加的。  您能否要求他们将这些结构分为两部分? -一个结构应包括3个链接指针,然后下一个结构应从ZxOTP_PSWDLOCK开始。  请尝试并告诉我。  我没有备用设备来尝试此操作,但我觉得这可以解决问题。  

    我认为ECC未针对PSWDLOCK位置进行编程,导致ECC错误。  当工具对结构下面进行编程时,它们首先找到链接指针地址,因此跳过整个结构的编程ECC。  因为不应为链路指针对ECC进行编程,所以工具会执行此操作。  但是,PSWDLOCK需要对ECC进行编程。

    如果客户使用TI提供的头文件,则不会发生此问题,因为这些部分按我上面的说明进行了细分。 结帐:

    (i) DCSM_ZX_ZoneSelectBlock.ASM,位于C2000Ware_1_00_02_00\device_support\f2837xd\examples\CPU1 \linky_with2837 \linky_with _DCSM\cpu01和

    (ii) 2837xD_DCSM_lnk_CPUx.cmd,位于C2000Ware_1_00_02_00\device_support\f2837xd\con\cmd</s>2837

    结构DCSM_Z1_OTP{

      UINT32.                  Z1OTP_LINKPOINTER1;      // Z1 OTP中的区域1链路接口1

      UINT16.                  rsvd1[2];           //保留

      UINT32.                  Z1OTP_LINKPOINTER2;      // Z1 OTP中的区域1链路接口2

      UINT16.                  rsvd2[2];           //保留

      UINT32.                  Z1OTP_LINKPOINTER3;      // Z1 OTP中的区域1链路接口3

      UINT16.                  rsvd3[6];           //保留

      UINT32.                  Z1OTP_PSWDLOCK;        // Z1 OTP中的安全密码锁

      UINT16.                  rsvd4[2];           //保留

      UINT32.                  Z1OTP_CRCLOCK;         //在Z1 OTP中安全锁定CRC

      UINT16.                  rsvd5[8];           //保留

      UINT32.                  Z1OTP_BOOTCTRL;        // Z1 OTP中的启动模式

    };

    结构DCSM_Z2_OTP{

      UINT32.                  Z2OTP_LINKPOINTER1;      // Z2 OTP中的区域2链路接口1

      UINT16.                  rsvd1[2];           //保留

      UINT32.                  Z2OTP_LINKPOINTER2;      // Z2 OTP中的区域2链路接口2

      UINT16.                  rsvd2[2];           //保留

      UINT32.                  Z2OTP_LINKPOINTER3;      // Z2 OTP中的区域2链路接口3

      UINT16.                  rsvd3[6];           //保留

      UINT32.                  Z2OTP_PSWDLOCK;        // Z2 OTP中的安全密码锁

      UINT16.                  rsvd4[2];           //保留

      UINT32.                  Z2OTP_CRCLOCK;         //在Z2 OTP中确保CRC锁的安全

      UINT16.                  rsvd5[8];           //保留

      UINT32.                  Z2OTP_BOOTCTRL;        // Z2 OTP中的引导模式

    };

    谢谢,此致,

    Vamsi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好Vamsi:
    抱歉耽误我的时间,但我在其他几项任务之间进行了尝试,所以我有点晚了。 不管怎样,我完全按照你的建议,更确切地说
    我拆分结构

    /*结构DCSM_Z1_OTP {
    UINT32 Z1OTP_LINKPOINTER1
    uINT16 rsvd1[2];
    UINT32 Z1OTP_LINKPOINTER2;
    uINT16 rsvd2[2];
    UINT32 Z1OTP_LINKPOINTER3;
    uINT16 rsvd3[6];
    UINT32 Z1OTP_PSWDLOCK;
    uINT16 rsvd4[2];
    UINT32 Z1OTP_CRCLOCK;
    uINT16 rsvd5[8];
    UINT32 Z1OTP_BOOTCTRL;
    };*/
    在以下方面:
    结构DCSM_Z1_OTP_LINKPOINTERS{
    UINT32 Z1OTP_LINKPOINTER1;
    uINT16 rsvd1[2];
    UINT32 Z1OTP_LINKPOINTER2;
    uINT16 rsvd2[2];
    UINT32 Z1OTP_LINKPOINTER3;
    uINT16 rsvd3[2];
    };

    结构DCSM_Z1_OTP_PSWLOCK {
    UINT32 Z1OTP_PSWDLOCK;
    UINT16 rsvd[2];

    结构DCSM_Z1_OTP_CRCLOCK {
    UINT32 Z1OTP_CRCLOCK;
    UINT16 rsvd[2];

    结构DCSM_Z1_OTP_BOOTCTRL{
    UINT16 rsvd[2];
    UINT32 bZ1OTP_BOOTCTRL;
    };

    我对Z2区域也是这样,因为我没有锁定CPU2。

    我为Z1-Pointers和PSWLOCK准备了如下默认结构
    #define DCSM_Z1_OTP_LINKPOINTERS_DEFAULTS{
    0xFFFFFFFE, \
    0xFFFF, \
    0xFFFF, \
    0xFFFFFFFE, \
    0xFFFF, \
    0xFFFF, \
    0xFFFFFFFE, \
    0xFFFF, \
    0xFFFF }



    #define DCSM_Z1_OTP_PSWLOCK默认值{
    0xFFFFFFFE, \
    0xFFFF, \
    0xFFFF }

    在“F2837xD_Headers_nonBIOS_CPU1.cmd”文件中,我进行了这些更改,
    /*DCSM_Z1_OTP:原点= 0x7.8万,长度= 0x0.002万 /* Z1 OTP的一部分。 LinkPointer/JTAG锁定/引导模式*/
    DCSM_OTP_Z1_LINKPOINTER:原点= 0x7.8万,长度= 0x0万C
    /* Z1 OTP。 PSWDLOCK/reserved */
    DCSM_OTP_Z1_PSWDLOCK :原点= 0x7.801万,长度= 0x0.0004万
    /* Z1 OTP。 CRCLOCK/RESERED */
    DCSM_OTP_Z1_CRCLOCK :原点= 0x7.8014万,长度= 0x0.0004万
    /* Z1 OTP。 保留/BOOTCTRL *
    DCSM_OTP_Z1_BOOTCTRL :原点= 0x7801C,长度= 0x0.0004万


    /* DCSM Z1区域选择内容(!!可移动!!) */
    /* Z1 OTP。 Z1密码位置/闪存和RAM分区*/
    DCSM_ZSEL_Z1_P0 :原点= 0x7.803万,长度= 0x0.001万

    /*DCSM_Z2_OTP:原点= 0x7.82万,长度= 0x0.002万 /* Z2 OTP的一部分。 LinkPointer/JTAG锁定*/
    DCSM_OTP_Z2_LINKPOINTER :原点= 0x7.82万,长度= 0x0万C
    /* Z2 OTP。 GPREG1/GPREG2 *
    DCSM_OTP_Z2_GPREG :原点= 0x7820C,长度= 0x0.0004万
    /* Z2 OTP。 PSWDLOCK/reserved */
    DCSM_OTP_Z2_PSWDLOCK :原点= 0x7.821万,长度= 0x0.0004万
    /* Z2 OTP。 CRCLOCK/RESERED */
    DCSM_OTP_Z2_CRCLOCK :原点= 0x7.8214万,长度= 0x0.0004万
    /* Z2 OTP。 GPREG3/BOOTCTRL *
    DCSM_OTP_Z2_BOOTCTRL :原点= 0x7821C,长度= 0x0.0004万

    /* DCSM Z2区域选择内容(!!可移动!!) */
    DCSM_ZSEL_Z2_P0:原点= 0x7.822万,长度= 0x0.001万

    …。

    /***警告:仅删除“类型=无加载”以编程OTP位置***/
    /*DcsmZ1OtpFile :> DCSM_Z1_OTP, 页面= 1*/
    DcsmZ1OtpLinkPinters:> DCSM_OTP_Z1_LINKPOINTER, 第= 1页
    DcsmZ1OtpPswLock :> DCSM_OT_Z1_PSWDLOCK, 页面= 1.
    DcsmZ1OtpCrcLock :> DCSM_OT_Z1_CRCLOCK, 页面= 1,类型=无负载
    DcsmZ1OtpBootCtrl :> DCSM_OT_Z1_BOOTCTRL, 页面= 1,类型=无负载

    DcsmZselZ1File :> DCSM_ZSEL_Z1_P0 页面= 1
    /*DcsmZ2OtpFile :> DCSM_Z2_OTP, Page =1,类型= NoLoad*/
    DcsmZ2OtpLinkPinters:> DCSM_OT_Z2_LINKPOINTER, 页=1,类型=无负载
    DcsmZ2OtpPswLock :> DCSM_OT_Z2_PSWDLOCK, 页面= 1,类型=无负载
    DcsmZ2OtpCrcLock :> DCSM_OT_Z2_CRCLOCK, 页面= 1,类型=无负载
    DcsmZ2OtpBootCtrl :> DCSM_OT_Z2_BOOTCTRL, 页面= 1,类型=无负载
    DcsmZselZ2File :> DCSM_ZSEL_Z2_P0 page = 1,type = NoLoad

    在F2837xD_GlobalVariableDefs.c中,我做了这些更改
    //----------------
    /*#ifdef __cplusplus
    #pragma data_section("DcsmZ1OtpFile")
    #否则
    #pragma data_section(DcsmZ1Otp,"DcsmZ1OtpFile");
    #endif
    const struct DCSM_Z1_OTP DcsmZ1Otp = DCSM_Z1_OTP_defaults;*/

    //----------------
    #ifdef __cplusplus
    #pragma data_section("DcsmZ1OtpLinkPinters")
    #否则
    #pragma data_section(DcsmZ1OtpLnkPnt,"DcsmZ1OtpLinkPinters";
    #endif
    Const结构DCSM_Z1_OTP_LINKPOINTERS DcsmZ1OtpLnkPnt = DCSM_Z1_OTP_LINKPOINTERS_DEFAULTS;
    //----------------
    #ifdef __cplusplus
    #pragma data_section("DcsmZ1OtpPswLock")
    #否则
    #pragma data_section(DcsmZ1OtpPswLk,"DcsmZ1OtpPswLock");
    #endif
    const struct DCSM_Z1_OTP_PSWLOCK DcsmZ1OtpPswLk = DCSM_Z1_OTP_PSWLOCK默认值;
    //----------------
    #ifdef __cplusplus
    #pragma data_section("DcsmZ1OtpCrcLock")
    #否则
    #pragma data_section(DcsmZ1OtpCrcLk,"DcsmZ1OtpCrcLock");
    #endif
    结构DCSM_Z1_OTP_CRCLOCK DcsmZ1OtpCrcLk;
    //----------------
    #ifdef __cplusplus
    #pragma data_section("DcsmZ1OtpBootCtrl")
    #否则
    #pragma data_section(DcsmZ1OtpBtCtrl,"DcsmZ1OtpBootCtrl";
    #endif
    结构DCSM_Z1_OTP_BOOTCTRL DcsmZ1OtpBtCtrl;
    //----------------
    /*#ifdef __cplusplus
    #pragma data_section("DcsmZ2OtpFile")
    #否则
    #pragma data_section(DcsmZ2Otp,"DcsmZ2OtpFile");
    #endif
    易失性结构DCSM_Z2_OTP DcsmZ2Otp;*/
    //----------------
    #ifdef __cplusplus
    #pragma data_section("DcsmZ2OtpLinkPinters")
    #否则
    #pragma data_section(DcsmZ2OtpLnkPnt,"DcsmZ2OtpLinkPinters";
    #endif
    结构DCSM_Z2_OTP_LINKPOINTERS DcsmZ2OtpLnkPnt;
    //----------------
    #ifdef __cplusplus
    #pragma data_section("DcsmZ2OtpPswLock")
    #否则
    #pragma data_section(DcsmZ2OtpPswLk,"DcsmZ2OtpPswLock");
    #endif
    结构DCSM_Z2_OTP_PSWLOCK DcsmZ2OtpPswLk;
    //----------------
    #ifdef __cplusplus
    #pragma data_section("DcsmZ2OtpCrcLock")
    #否则
    #pragma data_section(DcsmZ2OtpCrcLk,"DcsmZ2OtpCrcLock");
    #endif
    结构DCSM_Z2_OTP_CRCLOCK DcsmZ2OtpCrcLk;
    //----------------
    #ifdef __cplusplus
    #pragma data_section("DcsmZ2OtpBootCtrl")
    #否则
    #pragma data_section(DcsmZ2OtpBtCtrl,"DcsmZ2OtpBootCtrl";
    #endif
    结构DCSM_Z2_OTP_BOOTCTRL DcsmZ2OtpBtCtrl;

    现在一切都完美无瑕。 但现在出现了一些问题:

    1) 从“C”语言的角度来看,这种方式或以前的方式是相同的,所以我不明白这种方式会有什么变化。 此外,当您说“我认为ECC没有为PSWDLOCK位置进行编程并导致ECC错误时,我也不是很清楚会发生什么情况。 当工具对下面的结构进行编程时,它们首先找到链接指针地址,因此跳过整个结构的编程ECC”。 ECC基本上是内存的奇偶校验检查器,默认情况下是否激活? 如果是,它会发出NMI? 如何设置软件以使我能够理解存在ECC错误(ECC自动更改提供给CPU但不在闪存中的数据,这就是闪存读卡器显示PSWLOCK地址正确编程为1的原因):
    2) 同样的方法可以应用到CPU2以确保它的安全?
    3) 使用CsmUnlock()函数在主菜单的开头解除固定;是否安全? 我的意思是我们的目标是保护闪存代码,所以我们希望这样做
    1) 避免使用外部通信连接到DSP并读取闪存,但在我们的协议中没有闪存读取命令。
    2) 避免使用调试器进行连接,除非您知道密码
    3) 避免使用某些启动模式下载或重新编程DSP,除非您知道密码。
    这就是我为什么要问的原因。

    感谢Vamsi的帮助,这对我们来说非常重要。

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

    Andrea,

    很高兴它有所帮助。

    关于您的问题:

    1)默认情况下启用闪存/ OTP的ECC检查。  因此,如果没有对ECC进行编程,将会出现NMI。  ECC错误有两种类型-单位错误和双位错误。  单位错误在数据提供给CPU之前得到纠正-单位错误详细信息,如发生错误的地址,从ECC寄存器获取etc.ca。  您可以为中断生成的单位错误设置阈值,此阈值应大于0 (请查看勘误表)。  未纠正双位错误,并且生成NMI。  有关此方面的详细信息,请阅读TRM中的2.12 .................................................................10错误纠正代码(ECC)保护部分。

    关于工具: 正如我前面提到的那样,不应针对链接指针位置对ECC进行编程,因为如果需要,您应该可以在不擦除的情况下多次更新链接指针。  因此,闪存工具(如CCS片上闪存插件)将避免对ECC进行编程。  由于您之前拥有的结构/部分包括链路指针和PSWDLOCK,因此Flash工具会查看为其提供的部分的地址,并发现它是链路指针,跳过对整个部分的ECC编程-因此,ECC也不是为PSWDLOCK位置编程的。  这会导致ECC错误。  将它们分开后,Flash工具会跳过链接指针的ECC,而不是PSWDLOCK。  

    2)您可以。

    3)如果您使用CsmUnlock()解锁设备,则设备不再受保护。  请阅读 TRM中的2.13 双码安全模块(DCSM)部分,了解更多详细信息。

    谢谢,此致,

    Vamsi  

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

    早上好Vamsi

    好的,我将阅读手册中的ECC模块,并以这种方式启用NMI来管理此类事件。

    非常感谢

    Andrea Marcianesi。

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

    我特意编辑了您的帖子,并在发送给FAE的电子邮件中回答了您的问题。 请与您的FAE核实。

    谢谢,此致,
    Vamsi