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.

[参考译文] TMS320F28023:计算闪存校验和

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/743053/tms320f28023-calculate-flash-checksum

器件型号:TMS320F28023

尊敬的香榭丽舍

我们的工厂请求校验和应通过 UART 发送出去。 因此、我实现了如下所示的校验和计算代码、如果没有编程到器件中的传递字、该代码就能正常工作。 但在编程密码后无法正常工作。  

UINT16 FLASH_CHECKSUM_CALCULATE (UINT16 * StartAddr、UINT16大小)

   易失性 UINT16校验和= 0;

   易失性 UINT16 I = 0;

 

   对于(i = 0;i < size;i++)

   {

       校验和+=(uint16)(* StartAddr++);

       校验和=校验和0xFFFF;

   }

 

   返回校验和;

 

UINT16 FLASH_CHECKSUM;

 

void main (void)

  init_system_and_device();  

   //闪存起始地址= 0x3F0000

   //闪存大小= 0x8000、32KB

   FLASH_CHECKSUM = FLASH_CHECKSUM_CALCULATE (((UINT16 *) 0x3F0000、(UINT16) 0x8000);

  (笑声) (笑声)  

浏览系统参考手册后、使用下面显示的安全和不安全闪存的 C 代码示例、但仍然无法正常工作、在我看来、CPU 在使用 unsecure_flash 和 secure_flash 后卡在某个位置。 可以在这方面帮助我吗? 我所期望的是、固件应支持在有密码和没有密码的情况下计算闪存校验和。 谢谢。。。

  unsecure_flash();

  //闪存起始地址= 0x3F0000

   //闪存大小= 0x8000、32KB

   FLASH_CHECKSUM = FLASH_CHECKSUM_CALCULATE (((UINT16 *) 0x3F0000、(UINT16) 0x8000);

  SECURE_FLASH ();

我的不安全代码:

void unsecure_flash (void)

volatile int * csm =(volatile int *) 0x000AE0;//csm 寄存器文件
volatile int * PWL =(volatile int *) 0x003F7FF8;//密码位置
volatile int tmp[8];
int i = 0;
//读取128位密码位置(PWL)
//在地址0x3F 7FF8-0x3F 7FFF 处的闪存中
//如果器件是安全的、则读取的值将是
//实际上没有加载到 temp 变量中,所以
//这称为虚拟读取。
对于(i=0;i<8;i++) tmp[i]=* PWL++;

//if (SECURE_FLAG = 1)
//如果密码不是全一(0xFFFF),则需要下面的代码
//取消 CSM 的安全保护。

//将128位密码写入密钥寄存器
//如果此密码与中存储的密码匹配
// PWL 则 CSM 将变得不安全。 如果没有
//匹配、则器件将保持安全。
//示例密码为:
//使用0x111122223344455556677778888。
asm (" EALLOW");//密钥寄存器受 EALLOW 保护
*CSM++= 0xFFFF;//在0xAE0上注册 KEY0
*CSM++= 0xFFFF;//在0xE1处注册密钥1
*CSM++= 0xFFFF;//在0xAE2处注册密钥2
*CSM++= 0xFFFF;//在0xAE3处注册密钥3
*CSM++= 0xEBEE;//在0xAE4处注册 KEY4
*CSM++= 0xD8FF;//在0xAE5上注册 KEY5
*CSM++= 0xE9D3;//在0xAE6上注册 KEY6
*CSM++= 0xAB38;//在0xAE7上注册 KEY7
asm (" EDIS");

    

void resecure_flash (void)

volatile int * CSMSCR =(volatile int *) 0x00AEF;//CSMSCR 寄存器
//设置 FORCESEC 位
asm (" EALLOW");//CSMSCR 寄存器受 EALLOW 保护。
* CSMSCR = 0x8000;
asm ("EDIS");

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    关于这一点的另一个问题是、如果某些初始值存储在闪存中、如果我想将其复制到 RAM 变量中、如何在对密码进行编程时实现它?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在一个安全器件上、当 JTAG 被连接时、从不安全内存中执行的代码不能访问安全内存中的内容。 如果还在安全存储器中执行校验和算法、则不会出现问题。

    要将某些初始值从闪存复制到 RAM (非安全存储器)、您需要解锁器件。 如果要复制到闪存内容以保护 RAM 存储器、则无需解锁器件。

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

    以下是我的项目中 FLASH_CHECKSUM 变量和 FLASH_CHECKSUM_CALCULATE 函数的地址、您认为两者都在安全存储器中吗?
    00008d0c _flash_checksum
    003f3db5 _flash_checksum_calculate

    BTW、安全/非安全存储器的地址范围是多少?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Manoj:

    关于系统参考手册中的注释、"当限制 CPU 对片上安全存储器位置的访问时、器件是安全的。  当安全时、根据程序计数器当前 指向的位置、可以提供两个级别的保护。 如果代码当前从安全存储器内部运行、则仅阻止通过 JTAG (即、通过仿真器)的访问。 这允许安全代码访问安全数据。 相反、如果代码从非安全存储器运行、则阻止对安全存储器的所有访问。 用户代码可以动态进入和退出安全存储器、从而允许从非安全存储器进行安全函数调用。"

    我认为 L0SRAM 和闪存是安全存储器。 下图显示了我的 FLASH_CHECKSUM 算法在闪存中运行(执行此 fucnion 时 PC 指向0x3F3DB9)、但局部变量(校验和)存储在 M1SARAM 中(非安全存储器)、本地变量(校验和)在安全模式下存储计算出的校验和有哪些风险?  

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

    整个闪存、用户 OTP 和 L0SRAM 都是安全的。 M0/M1 SRAM 是不安全的存储器。 有关更多详细信息、请参阅 F28023数据表中的图6-1。

    在非安全存储器中存储计算出的校验和不应有任何问题。

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

    尊敬的 Manoj:

    系统参考手册下表显示、只要在安全存储器内执行程序提取、CPU 就具有完全访问权限。

    这是否意味着只要 PC 指向安全存储器、CPU 就没有限制?

    如果不解锁器件、如果复制功能存储并在闪存中运行、则将数据从闪存复制到 RAM (不安全存储器)不会出现问题、对吧?  

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

    我发现我的项目无法正常工作的原因、它与.stack 和.ebss 的分配位置有关。

    如果分配给 L0SARAM 的.stack 和密码已编程、则器件将无法工作。
    堆栈 :> D_RAML0 PAGE = 1.
    ebss :> RAMM0_M1 PAGE = 1.

    但是、如果将.stack 分配给 M0/M1、则使用/不使用编程的密码不会有问题。 您能告诉我原因吗?
    堆栈 :> RAMM0_M1 PAGE = 1.
    ebss :> RAMM0_M1 PAGE = 1.

    存储器配置:
    第1页:/*数据存储器*/
    RAMM0_M1:origin = 0x000000,length = 0x000800 /*片上 RAM 块 M0 + M1 */
    D_RAML0 :origin = 0x008800,length = 0x0000800 /*片上 DRAM 块 L0 */

    此外、如果设定了密码、分配该段的标准是什么? .stack、.ebss、.text、.cinit 等
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Manoj、

    请在此处分享您的进一步评论吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    插孔、

    我很高兴您能够让您的代码正常工作。

    堆栈可以位于 D_RAML0中。 因此、不确定您为什么会看到这个问题。 一个可能的原因可能是堆栈损坏。

    此致、
    曼诺伊
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我可以关闭此主题吗?

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

    感谢您的大力支持。 我可以在下面的2个问题中获得您的意见吗?

    1.这是否意味着只要 PC 指向安全存储器、CPU 就没有限制?

    2.如果不解锁器件、如果复制函数存储并在闪存中运行、则将数据从闪存复制到 RAM (不安全的存储器)不会有问题、对吧?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    插孔、

    在安全器件上、将内容从闪存复制到安全 RAM 不会是问题。 但是、将内容从闪存复制到不安全的存储器将是个问题。

    在不安全的器件上、将内容从闪存复制到安全(或)不安全的 RAM 不会是问题。

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

    在我看来、参考手册与您的注释内容冲突。如果代码在闪存中运行、CPU 具有完全访问权限。 您能帮助您再次确认吗?  

    REF 手册说、"当 CPU 对片上安全存储器位置的访问受到限制时、器件是安全的。 时间
    根据程序计数器当前的位置、可以实现两级安全保护
    定点。 如果代码当前从安全存储器内部运行、则仅阻止通过 JTAG 的访问
    (即通过仿真器)。 这允许安全代码访问安全数据。"

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

    我不确定冲突是什么。 从安全存储器运行代码可提供对安全存储器的完全访问、这与我的上述声明并不矛盾。

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

    Manoj、

    关于您的注释、 "但是、将内容从闪存复制到不安全的存储器将是个问题。" 实际上 ,我已经在安全设备上对其进行了测试,我认为如果复制函数在闪存中存储并运行而不解锁设备,则没有问题。

    根据我的理解、对访问(包括读取和写入)不安全存储器没有限制。 但为什么 CPU 可以读取安全闪存、但无法写入不安全的 RAM?

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

    好的。 看起来我犯了这个错误。 将安全存储器内容复制到不安全存储器时不会出现问题。 但是、从从不安全内存执行的代码访问安全内存内容时会遇到问题。

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

    感谢您的大力支持并确认。