我使用C2000的28069F芯片,跑motorware的电机程序,不对芯片加密时候正常,对芯片加密后,程序就不能正常运行了。我看datasheet上说未加密的RAM不能调用加密部分,而加密部分调用未加密的RAM或者外设寄存器,需要创建什么地址入口。这部分搞不太清楚。我的程序会把flash的执行程序移到RAM运行,哪位知道怎么解决这个加密问题
Green Deng:
你好,首先得确认一下你是如何操作加密的?
chao zhang1:
回复 Green Deng:
我使用过两种加密方式,一是用ccs直接加密,二是根据datasheet上的说明加密。加密都是成功的。
在我使用的motorware程序中有以下代码:#ifdef CSM_ENABLE//copy .econst to unsecure RAMif(*econst_end – *econst_start){memCopy((uint16_t *)&econst_start,(uint16_t *)&econst_end,(uint16_t *)&econst_ram_load);}
//copy .switch ot unsecure RAMif(*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相关定义?
二是,在加密后,系统分成了加密区和未加密区,这之间是否能直接相互调用,如果不能应该怎么处理?
Green Deng:
回复 chao zhang1:
这个宏定义仅适用于F280027F,如果是F28069F的话不需要进行任何更改就可以支持CSM。
出现加密后无法运行,你是否有更改过cmd文件?如果你不更改F28069F.cmd文件,则所有F28069F的lab都可以支持CSM。
chao zhang1:
回复 Green Deng:
由于空间问题,我倒是更改了一些F28069F.cmd的设置,这个更改有什么需要注意的吗?
Green Deng:
回复 chao zhang1:
我看看有没有这方面的资料可以提供一下。你可以先说明一下大概更改了哪些配置。
chao zhang1:
回复 Green Deng:
我本来把 RAML0_1的长度改长了些,缩短了些RAML2,现在又改回来了,还是不行。我仔细测试了下,我的程序调用OTP里面固化的InstaSPIN算法不能正确执行,其他部分(好比采样通信等等)都正确。我也测试了不调用InstaSPIN算法的一个程序,完全没有问题。
使用csm对这部分有什么特殊配置么?
Green Deng:
回复 chao zhang1:
关于CSM加密对instaSPIN算法的影响,目前我没碰到过这方面的问题。
有没有测试过从新更换官方提供的cmd文件?你可以替换之后测试一下,如果还是有问题的话我跟其他同事沟通一下这方面是否有关联问题。
chao zhang1:
回复 Green Deng:
好的,十分感谢您!!!
主函数里面有这种定义:
#ifdef CSM_ENABLE
#pragma DATA_SECTION(gUserParams,"rom_accessed_data");
#endif我使用后,如果将rom_accessed_data定义在非安全区,是有效果的,电机能够转动,但是转动不正确,应该还有哪里不对。
instaSPIN算法是在rom中运行的,这部分为非加密区。
chao zhang1:
回复 Green Deng:
另外,里面得变量未定义地址,您知道在28027里面是怎么使用这部分的吗?
#ifdef CSM_ENABLE//copy .econst to unsecure RAMif(*econst_end – *econst_start){memCopy((uint16_t *)&econst_start,(uint16_t *)&econst_end,(uint16_t *)&econst_ram_load);}
//copy .switch ot unsecure RAMif(*switch_end – *switch_start){memCopy((uint16_t *)&switch_start,(uint16_t *)&switch_end,(uint16_t *)&switch_ram_load);}#endif
Green Deng:
回复 chao zhang1:
要让链接器去定义它们。你可以看看cmd文件,以及我们如何生成run start,run end,loadstart等等…以ramfuncs为例。
你可以看一下你的.map文件,看看是否能识别出不安全的sram(0xC000以上部分,包括M0/M1)中是否有任何东西试图访问安全ram/Flash中的任何变量。