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.

[参考译文] CCS/UCD3138:为什么会擦除数据闪存校验和后的值?如果 DFLASH 需要擦除?、如何比较校验和

Guru**** 2596365 points


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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/795706/ccs-ucd3138-why-the-value-after-data-flash-checksum-would-be-erased-how-to-compare-the-checksum-if-dflash-needs-to-be-erased

器件型号:UCD3138

工具/软件:Code Composer Studio

您好,

我查看 HSFB 固件中的 constants.c、并注意到以下代码:

//-------- 数据闪存校验和---
#pragma DATA_SECTION (PMBUS_CHECKSUM、".config");
volatile const UINT32 PMBUS_CHECKSUM = 0x87654321;

#pragma DATA_SECTION (PMBUS_CHECKSUM_b、".CONFIG_B");
volatile const UINT32 PMBUS_CHECKSUM_b; 

如果我在这样的代码之后编写如下代码:

#pragma DATA_SECTION (hly_set、".hly")
volatile const un_hly hly_set = Z;// Z 为常量 

".HLY"(org = 0x00018FA0)的位置位于 DFLASH 中的".config"之后。

但是、Z 可能会被擦除、而校验和之前的值则不会被擦除。

可以给我一些建议吗?

谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    一位专家很快会回来。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    ".HLY"(org = 0x00018FA0)在 DFlash 的同一段中的位置是否与校验和或定义的位置很远?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,

    我认为它们不在同一个细分市场中。

    段中的代码如下所示:

    /*------------------ *
    /* D-Flash 2K 0x18800 - 0x18FFF *
    /*------------------ *
    .dflash:{}>(DFLASH align(32)
    //data flash
    .config:{}>(DFLASH align(32)
    CONFIG_B:{}>(DFLAASH align (32))
    .passw :{}>(DFLASH ALIGN (32))
    
    //hly_add20190117
    .hly:{}>(DFLASHSET1 ALIGN (32))
    .hlY_B:{}>(DFLASHSET2 ALIGN (32)).hlY_C
    :{}>(DFLASHSET3 (32) ALIGN) 

    存储器中的代码如下所示:

    /*------------------ *
    /* D-Flash 2K 0x18800 - 0x18FFF *
    /*------------------ *
    DFLASH (RX):org = 0x00018800,len = 0x000007A0
    /********* hly_add_2019_02_12 /
    DFLASHSET1 (RX):org = 0x00018FA0,len = 0x00000020
    DFLASHSET2 (RX):org = 0x00018FC0,len = 0x00000020
    DFLASHSET3 (RX):org = 0x00018FE0,len = 0x00000020 

    并且.map 文件显示:

    名称 原点长度 已使用 未使用的属性填充
    --- ---- ------ ---- ---- --------
    VECS 00000000 00000020 00000020 00000000 RWIX
    pflash 00000020 00007f38 00005d5e 000021da R X
    DEVICEID 00007f58 00000020 0000001f 00000001 R X
    FIXTFA 00007f78 00000004 00000000 00000004 R X
    FIXCONST 00007f7c 00000080 00000000 00000080 R X
    FLASHSUM 00007ffc 00000004 00000000 00000004 R X
    ROM 0000a020 00000be0 00000000 00000be0 RWIX
    正弦 0000ac00 00000282 00000000 00000282 RWIX
    EXP 0000ae82 0000007a 00000000 0000007a RWIX
    DFLASH 00018800 000007a0 000002e0 000004c0 R X
    DFLASHSET1 00018fa0 00000020 00000008 00000018 R X
    DFLASHSET2 00018fc0 00000020 00000008 00000018 R X
    DFLASHSET3 00018fe0 00000020 00000008 00000018 R X 
    config 0 00018800 00000170
    00018800 00000170 constants.obj (.config)
    
    .config_B
    * 0 00018980 00000170 未初始化
    00018980 00000170 constants.obj (.config_B)
    
    .hlY 0 00018fa0 00000008
    00018fa0 00000008 constants.obj (.hlY)
    
    .hlY_B 0 00018fc0 00000008
    00018fc0 00000008 constants.obj (.HLY_B)
    
    .HLY_C 0 00018fe0 00000008
    00018fe0 00000008 constants.obj (.HLY_C) 

    校验和位于".config",中、".HLY"和".HLY_B"和".HLY_C"中的数据可能会被擦除

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

    如果(ERASE_SEGM_COUNTER > 0)

    ERASE_TASK ();//处理 DFlash 段擦除


    在 main()的开头,擦除 DFlash 块中无效的段。 这是在后台完成的。
    如果由函数 calc_flash_segments ()设置的 ERASE_SEGMLE_COUNTER 值设置错误(更高),则会导致额外的段被擦除。 临时注释掉 main()中的上述语句,并查看其是否起作用。
    如果这有帮助、您必须检查由 calc_flash_segments ()返回的 ERASE_SEGMER_COUNTER 和 FIRST_SEGMENT 的值。

    此致、
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的建议。我会尽快检查。如果它可以正常工作、我会单击此选项解决我的问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这种情况是否间歇性发生、仅针对特定的 UCD? 或者、对于多个 UCD/电路板、这种情况总是会发生?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,

    它只在一个板上进行了试验。 不是每次都发生。有时不会在一天中发生。有时每小时发生3次。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,当我跟踪 start_erase_task (),我发现 bytes_TO_erase 是从 PMBus_CHECKSUM 到 filter0_PMBus_regs 的。

    函数 LARGE_for_interrupted_dflash_erase ()检查 DFLASH、但 filter0_PMBus_regs 位于 RAM (0x00019248)中。

     它是 filter0_PMBus_regs_constants?还是可能我误解了它?

    void lind_for_interrupted_dflash_erase (void)
    {
    volatile UINT32bytes_TO_ERASE、校验和、校验和、校验和_b、Blank_CHECKSUM
    =(UINT8*)&PMBus_CHECKSUM -(UINT8*)(UINT8*)+
    校验和文件0_PMBus (UINT8*
    );BLUM0_RACULT_REGS (UMBus)*(UINT8*)
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你是对的。 这毫无意义。
    请将上述内容替换为以下内容:

    void 查找_中断_dflash_erase (void)

    易失性 uint32bytes_TO_ERASE、校验和、校验和_b、空白校验和;

    Bytes_TO_ERASE =((UINT8*)&PMBus_CHECKSUM -(UINT8*)&filter0_PMBus_regs_constants);
    BLANK_CHECKSUM = 0xff * Bytes_TO_ERASE;
    校验和= calculate_dflash_checksum ((uint8*)&filter0_PMBus_regs_constants、
    (uint8*)&PMBus_CHECKSUM);
    if (校验和!= blank_checksum)

    if ((校验和!=PMBus_CHECKSUM)&&(PMBus_CHECKSUM!=0x87654321))
    {//擦除组 A
    start_erase_task ((void*)&filter0_PMBus_regs_constants、(bytes_TO_ERASE + 4));
    返回;



    CHECKSUM_b = calculate_dflash_CHECKSUM ((UINT8*)&filter0_PMBus_regs_constants_b、
    (uint8*)&PMBus_CHECKSUM_b);
    if ((校验和!=空白校验和)&&(校验和_b!=空白校验和)

    //组 A 可用,组 B 不为空;擦除组 B,点燃组 B 的任何校验和
    //并开始擦除组 B
    start_erase_task ((void*)&filter0_PMBus_regs_constants_b、(bytes_TO_ERASE + 4));
    返回;

    //组 B 为空,不需要再次擦除它。
    ERASE_SEGM_COUNTER = 0;
    返回;