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.

我使用C2000的28069F芯片,跑motorware的电机程序,不对芯片加密时候正常,对芯片加密后,程序就不能正常运行了

Other Parts Discussed in Thread: MOTORWARE

我使用C2000的28069F芯片,跑motorware的电机程序,不对芯片加密时候正常,对芯片加密后,程序就不能正常运行了。我看datasheet上说未加密的RAM不能调用加密部分,而加密部分调用未加密的RAM或者外设寄存器,需要创建什么地址入口。这部分搞不太清楚。我的程序会把flash的执行程序移到RAM运行,哪位知道怎么解决这个加密问题

  • 你好,首先得确认一下你是如何操作加密的?
  • 我使用过两种加密方式,一是用ccs直接加密,二是根据datasheet上的说明加密。加密都是成功的。
    在我使用的motorware程序中有以下代码:
    #ifdef CSM_ENABLE
    //copy .econst to unsecure RAM
    if(*econst_end - *econst_start)
    {
    memCopy((uint16_t *)&econst_start,(uint16_t *)&econst_end,(uint16_t *)&econst_ram_load);
    }

    //copy .switch ot unsecure RAM
    if(*switch_end - *switch_start)
    {
    memCopy((uint16_t *)&switch_start,(uint16_t *)&switch_end,(uint16_t *)&switch_ram_load);
    }
    #endif

    我使能这段代码时,发现econst_end/econst_start/econst_ram_load未定义。

    我理解是,需要将这些段的flash代码拷贝到未加密的RAM运行。

    我有两个问题,一是这段代码是否应该被使能,如果应该,我怎么设置econst_end/econst_start/econst_ram_load相关定义?

    二是,在加密后,系统分成了加密区和未加密区,这之间是否能直接相互调用,如果不能应该怎么处理?
  • 这个宏定义仅适用于F280027F,如果是F28069F的话不需要进行任何更改就可以支持CSM。
    出现加密后无法运行,你是否有更改过cmd文件?如果你不更改F28069F.cmd文件,则所有F28069F的lab都可以支持CSM。
  • 由于空间问题,我倒是更改了一些F28069F.cmd的设置,这个更改有什么需要注意的吗?
  • 我看看有没有这方面的资料可以提供一下。你可以先说明一下大概更改了哪些配置。
  • 我本来把 RAML0_1的长度改长了些,缩短了些RAML2,现在又改回来了,还是不行。我仔细测试了下,我的程序调用OTP里面固化的InstaSPIN算法不能正确执行,其他部分(好比采样通信等等)都正确。我也测试了不调用InstaSPIN算法的一个程序,完全没有问题。
    使用csm对这部分有什么特殊配置么?
  • 关于CSM加密对instaSPIN算法的影响,目前我没碰到过这方面的问题。
    有没有测试过从新更换官方提供的cmd文件?你可以替换之后测试一下,如果还是有问题的话我跟其他同事沟通一下这方面是否有关联问题。
  • 好的,十分感谢您!!!
    主函数里面有这种定义:
    #ifdef CSM_ENABLE
    #pragma DATA_SECTION(gUserParams,"rom_accessed_data");
    #endif

    我使用后,如果将rom_accessed_data定义在非安全区,是有效果的,电机能够转动,但是转动不正确,应该还有哪里不对。
    instaSPIN算法是在rom中运行的,这部分为非加密区。
  • 另外,里面得变量未定义地址,您知道在28027里面是怎么使用这部分的吗?
    #ifdef CSM_ENABLE
    //copy .econst to unsecure RAM
    if(*econst_end - *econst_start)
    {
    memCopy((uint16_t *)&econst_start,(uint16_t *)&econst_end,(uint16_t *)&econst_ram_load);
    }

    //copy .switch ot unsecure RAM
    if(*switch_end - *switch_start)
    {
    memCopy((uint16_t *)&switch_start,(uint16_t *)&switch_end,(uint16_t *)&switch_ram_load);
    }
    #endif
  • 要让链接器去定义它们。你可以看看cmd文件,以及我们如何生成run start,run end,loadstart等等…以ramfuncs为例。
    你可以看一下你的.map文件,看看是否能识别出不安全的sram(0xC000以上部分,包括M0/M1)中是否有任何东西试图访问安全ram/Flash中的任何变量。
  • 正如之前提到的。宏和链接定义仅适用于F28027F。如果要将F28027F与CSM一起使用,则可以在链接器文件中的下面添加参考编码器。

    .econst : LOAD = D_FLASHA,
    RUN = P_RAML0,
    LOAD_START(_econst_start),
    LOAD_END(_econst_end),
    RUN_START(_econst_ram_load),
    PAGE = 0
    
    .switch : LOAD = D_FLASHA,
    RUN = P_RAML0,
    LOAD_START(_switch_start),
    LOAD_END(_switch_end),
    RUN_START(_switch_ram_load),
    PAGE = 0