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.

【Hercules经典问答】随时更新ing

Other Parts Discussed in Thread: TMS470MF06607

TMS570LS3的闪存安全保护

问: 我正在使用 TMS570LS3137,希望确保闪存的安全性。我在技术文档 SPNS162中查找到一些有关 AJSM(高级 JTAG 安全模块)的信息,但说得太笼统。请问是否有人可以告诉我在何处可以找到有关如何锁定该器件,在何处写入密钥(特定地址)以及器件锁定后如何解锁 JTAG 端口等的详细信息。

 

答: 器件上的 AJSM 从 TI 发货时就处于解锁状态。这是通过在闪存 Bank 0 中的客户 OTP 部分编写正确的“可视化解锁代码”实现的。这是一个位于字地址 0xF0000000 和 0xF0000004 上的 128 位代码。

用户通过编写这 128 位中的一位或多个位,即可以锁定该器件。需要注意的是,编程时只能把 1 改写为 0。这部分不允许执行擦除操作(OTP 即为一次性可编程)。一旦这 128 位密码中的任何一位被修改,则该器件在加电后即处于锁定状态。在这种情况下,任何 JTAG 仿真器能看到的唯一测试访问端口 (TAP) 就是 AJSM TAP。AJSM TAP 看上去与 JTAG TAP 相同:有 4 位 IR 寄存器,但为了与 JTAG TAP 区分开,其 IDCODE 寄存器中的值不同。

为解锁器件,用户必须通过 AJSM 的“解锁扫描 (unlock-by-scan)”寄存器扫描正确的 128 位代码。IR 值为 0xB 时,可在 AJSM TAP 端口上访问该寄存器。待扫描的值必须具有这样的特征:即在与 OTP 中修改后的值进行 XOR 运算后,可以得到原始的正确可视化解锁代码

用解锁扫描寄存器进行扫描时所使用的实用工具需由用户选定的仿真器厂商提供。我们已经用 Signum JTAGjet 仿真器以及 Spectrum Digital 提供的 XDS510 USB 仿真器成功验证了该流程。

 

问: 谢谢您的解说。我还需要了解一些其他信息,因为我想在使用 AJSM 模块之前确保自己对其有个正确而全面的了解。首先,我正在配有 CCS V5.1 和 Spectrum Digital XDS510 USB 仿真器的定制板上使用 TMS570LS3137

我打算通过将四个含有密钥的32位常量分别映射到 OTP 中的 0xF0000000、0xF0000004、 0xF0000008和 0xF000000C 地址上来锁定我的器件。推测我使用 JTAG 仿真器为软件编程时,CCS 会自动为闪存中的应用以及 OTP 中的密钥编程。我的推测是否正确?

我没有理解您说的临时用 JTAG 仿真器解锁器件,以进行调试或重新在闪存中写入另一应用的方法。我是否需要在 GEL 文件中编写特殊函数,用于写入我的解锁密钥?这个解锁密钥是否与 OTP 中编程的那个相同?您能否提供一个示例,说明我应该怎么用 CCS V5.1来解锁器件,或者我是否需要使用其他程序?

 

答: 请看我下面的说明:

我打算通过将四个含有密钥的32位常量分别映射到 OTP 中的0xF0000000、0xF0000004、 0xF0000008和 0xF000000C地址上来锁定我的器件。推测我使用 JTAG 仿真器为软件编程时,CCS 会自动为闪存中的应用以及 OTP 中的密钥编程。我的推测是否正确?

>> 是的,您还可以让 CCS 为 OTP 编程。有个选择框可以启用 OTP 编程功能。但我建议您使用专用的独立 OTP 编程步骤来锁定器件,正好可以避免意外器件锁定。

还有,我没有理解您说的用 JTAG 仿真器临时解锁器件,以进行调试或重新在闪存中写入另一应用的方法。我是否需要在 GEL 文件中编写特殊函数,用于写入我的解锁密钥?这个解锁密钥是否与 OTP 中编程的那个相同?您能否提供一下示例,说明我应该怎么用 CCS V5.1 来解锁器件,或者我是否需要使用其他程序?

>>一旦您锁定器件,外部工具唯一能看到的测试访问端口 (TAP) 就是AJSM TAP 且无法访问 CPU 扫描链。

AJSM 扫描链上有一个名为“解锁扫描”的寄存器。您需要根据自己使用的仿真器选择特定的外部工具。这个工具可让您通过解锁扫描寄存器扫描所需的 128 位密码,实现器件解锁。“解锁扫描”寄存器位于 IR 值 0b1011 处。

假定原始可视化解锁代码为 0xFFFF0000 0xFF00FF00 0xF0F0F0F0 0xFFFF0000。(这只是举例。实际代码中零更少。)

为锁定器件,您需要把第四位的 1 改为 0,这样这个位置的闪存 OTP存储的是:

0xF0FF0000 0xFF00FF00 0xF0F0F0F0 0xFFFF0000

现在要解锁工具,需要通过“解锁扫描”寄存器扫描到 x0F000000 0x00000000 0x00000000 0x00000000值。其概念是扫描到的值和目前闪存 OTP 中存储的值进行 XOR 运算得到的结果必定是原始可视化解锁代码。

对于任何常用的仿真器,我们目前还没有可供使用的便利工具。Signum 提供的 JTAGjet 仿真器在没有抽象功能或便利工具的协助下,仅允许用户执行低级操作,可用于完成上述解锁流程。

  • TMS470M SCICLEARINT 寄存器设置问题

    问:  大家好!我有一个关于 SCI 模块(也可能是编译器?)的问题。我发现当 CPU 在执行下列 C 语言语句时,SETINT 寄存器会清除 2 个位,而不是 1 个位。

    我对这种操作感到非常难以理解。

             sciREG1->CLRINT |= 0x200;

    但是,如果我使用语句“sciREG1->CLRINT = 0x200;”,SETINT 寄存器就会只清除一个位。

    我使用的是 TMS470 HDK 电路板,板上具备 TMS470MF06607

    CCS 版本 V5.2.0.00069

    编译器版本:TI v4.9.5(我也试过 TI V5.0.0B1,但结果一样。)

    调试器:Spectrum Digital XDS510USB Plus

    我在本帖中贴出了我的代码。

     请问有人可以帮助我解决这个问题吗?

     

    答: 首先感谢您非常详细地说明您的问题。标注为 CLR 或 SET 的寄存器在通常情况下都有一个非常有趣的属性,读取寄存器告知该功能的状态,同时写入设置或清除该功能。

    这种情况下,SETINT 和 CLEARINT 读取的值相同,因为它们显示的都是 SCI 中断源的状态(比如 SCICLRINT.0 读取的值为 1,这意味着已启用断开检测中断)。但是,将该寄存器的值写回寄存器对 SETINT 和 CLEARINT 寄存器而言,是明显不同的操作。写回 SETINT 寄存器没有影响,因为其会设置已经设置好的中断源;但从另一方面,写回 CLEARINT 寄存器会清除所有处于工作状态的中断源,因为每一个启用的中断源(读取值为 1)都会被清除(因为写入 1 会清除相关源)!

    虽然这种操作有些让人不解,但它提供了您在您的帖子中提到过的优势,就是不用进行读取-修改-写入 (read-modify-write) 操作。仅需简单地写入希望写入的位,即可设置/清除相应的中断源。

    1488.TMS470_sci.zip
  • TMS470MF06607 的 ESD/EMC 抗扰保护电路

     

    问:  我有个客户提出的问题,是关于如何连接到 TMS470MF06607 的 GPIO、CAN、nRST 引脚的保护电路的。为了增强 ESD/EMC 的抗扰性能,请问能否提供范例电路?

     

    答: 您好!对于复位引脚:(建议用户开始先不用 nRST 上的电容/电阻,以及 nPORRST 上的电容,如果 ECU 不能通过 ESD/抗扰测试,方可考虑进行安装)。

    对于 TEST 和 ENZ 引脚(请勿依赖内部的下拉电阻)

    CAN:无需防护从 MCU 到 CAN 收发器之间的路径。如果线迹较长(超过 5 厘米),可以考虑在驱动器端放置一个接地 SMT 电容器。该电容器可以降低边缘电压并减轻辐射,以防出现问题。在收发器一侧一般有一个 TVS 二极管和高电压电容器(约 100pF)组成的 EMC/ESD 保护电路。它们应尽可能靠近连接器放置。TVS 二极管的特性应根据客户对 ESD 的要求进行确定。

    GPIO 引脚:如用于外部中断目的,需在引脚前加一个低通滤波器。如果 GPIO 引脚用于连接到连接器,应考虑 ESD 防护。根据需要,可以选择“电阻 + 高电压电容器”或者“TVS 二极管 + 高电压电容器”的组合方式。

     

    问: 我听取了您的建议,在靠近 nPORRST 引脚处放置了一个 1nF 的电容器,确实有助于增强 ESD 抗扰性能。我很好奇,用相同的方法,但换用 0.1uF 的电容器,却不起作用。请问这是什么原因?我使用的是 1K 上拉电阻。我不知道微处理器中 nRST 和 nPORRST 的内部电路是什么样的。

    如果您能提供帮助,将不胜感激。我现在只是好奇,弄不懂0.1uF的电容器为何不能起效?

     

    答: 我真的不知道您这个案例中的 0.1uF 为何不能发挥作用。是什么类型的测试,接触放电还是空气放电?原理图和引脚布局是什么样的?有没有可能在 ESD 测试中获得这个引脚上的波形?不管怎样,出于下列原因我不建议使用 0.1uF:

    1. PORRST 的启动上升时间(从 20% 到 80%)应低于 10微秒。因此 0.1uF 电容器搭配 1K 电阻不合适。

    2. nRST有时也用作输出引脚—— 4mA IO ——驱动 0.uF 电容器在数千次加电周期后可能导致该引脚损坏。

    内部电路:

    1. PORRST:带有 100uA 下拉电阻的输出

    2. nRST:带有 100uA 上拉电阻的输入或者开漏输出(在正常工作下是输入,但在 PORRST 为低电平或发生复位时,为开漏输出)

     

  • 刚刚在E2E上看到有人询问如何把代码放在RAM中运行的问题,还是蛮有帮助的。

    链接在此:

    http://e2e.ti.com/support/microcontrollers/hercules/f/766/t/248433.aspx

    现翻译如下:

    TCRAM 运行代码 

    : 我希望尽快运行某个代码部分。我想知道能否将这部分代码载入 TCRAM 模块,并在此运行代码。如果可能,您是否建议这么做?还是说仅用于数据?

    : 从 TCRAM 运行代码不受限制。许多希望获得更快速执行性能的客户都从闪存启动,并将性能关键代码交叉载入 TCRAM。

    答:  您需要从闪存运行应用,同时从 RAM 执行函数:

    (1)通过映射文件查找函数代码尺寸,您需要查看 .text 和 .const 部分;

    (2)在链接命令文件中,在闪存和 RAM 中定义一部分支持代码,将加载地址设置为闪存部分,并运行寻址到 RAM 部分;

    (3)在执行函数前应将 coad/const 从闪存拷贝到 RAM。

    我会附上链接命令文件加以说明。此外,我还建议做一些分析/测试,以确保在进行修改前从 RAM 运行代码来解决您的问题。

    4606.lnk16_flash_device_fapi_ram.cmd

    问:  实际操作似乎比我设想的要简单。我此前考虑编写代码,以将应用载入 TCRAM,并向其提供 PC 寄存器控制。

    对于这个话题,我现在还有一个问题。这个问题与编程等关系更密切,不过您要是能给些建议那就太好了。

    假设我正在使用您提供的链接器脚本:

    我有许多需要彼此合作才能正确工作的代码模块。它们都存储在闪存中,不过我希望从 TCRAM 运行它们。所有函数调用(在所有模块之间的)都应由函数指针发起吗?还是说链接器脚本就能满足微控制器的需要?链接器脚本能一劳永逸地解决微控制器问题吗?还是仅适用于 RAM 清空的情况?

    假设我编写了加载函数:

    是否也会遇到同样的问题?

    答:

    (1)代码必须物理位于 RAM 中,始终需要执行我此前介绍的步骤。

    (2) 您不必使用函数指针。使用函数指针时,请确保指针指向运行时地址。我认为您将函数指针设置到函数时,编译器将自动设置为运行时地址。您最好再复核一下。