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/TMS320F28034:如何使用代码解锁闪存。

Guru**** 2609265 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/684527/ccs-tms320f28034-how-can-i-unlock-my-flash-using-code

器件型号:TMS320F28034

工具/软件:Code Composer Studio

我使用了 Code Composer Studio 中工具菜单下的片上闪存选项来设置密码并锁定我的闪存。  然后、我调用我在应用程序中粘贴的代码、但调用我的闪存

保持锁定。  您能不能建议问题出在哪?

#define STATUS_FAIL 0
#define STATUS_SUCCESS 1.

uint16 CsmUnlock()

易失性 uint16温度;

//使用当前密码加载密钥寄存器。 0xFFFF 是虚拟的
//密码。 用户应将其替换为正确的 DSP 密码。

asm (" EALLOW");
CsmRegs.KEY0 = 0x1111;
CsmRegs.key1 = 0x2222;
CsmRegs.key2 = 0x3333;
CsmRegs.key3 = 0x4444;
CsmRegs.KEY4=0x5555;
CsmRegs.KEY5 = 0x6666;
CsmRegs.KEY6 = 0x7777;
CsmRegs.KEY7 = 0x8888;
_asm (" EDIS");

//执行密码位置的虚拟读取
//如果它们与密钥值匹配,CSM 将解锁

temp = CsmPwl.PSWD0;
temp = CsmPwl.PSWD1;
temp = CsmPwl.PSWD2;
temp = CsmPwl.PSWD3;
temp = CsmPwl.PSWD4;
temp = CsmPwl.PSWD5;
temp = CsmPwl.PSWD6;
temp = CsmPwl.PSWD7;

//如果 CSM 未锁定,则返回成功,否则返回
//失败。
if (CsmRegs.CSMSCR.bit.SECURE = 0)
返回 STATUS_SUCCESS;
其他
返回 STATUS_FAIL;

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

    假读取应该在您写入密码之前出现。 尝试此操作并查看其是否正常工作。

    戴维
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我按照您的建议更改了解锁功能、但我的闪存仍然保持锁定状态。 这是我的函数、首先进行虚拟读取。

    #define STATUS_FAIL 0
    #define STATUS_SUCCESS 1
    //#pragma CODE_SECTION (CsmUnlock、"ramfuncs");
    uint16 CsmUnlock()

    易失性 uint16温度;



    //执行密码位置的虚拟读取
    //如果它们与密钥值匹配,CSM 将解锁

    temp = CsmPwl.PSWD0;
    temp = CsmPwl.PSWD1;
    temp = CsmPwl.PSWD2;
    temp = CsmPwl.PSWD3;
    temp = CsmPwl.PSWD4;
    temp = CsmPwl.PSWD5;
    temp = CsmPwl.PSWD6;
    temp = CsmPwl.PSWD7;

    //使用当前密码加载密钥寄存器。 0xFFFF 是虚拟的
    //密码。 用户应将其替换为正确的 DSP 密码。

    asm (" EALLOW");
    CsmRegs.KEY0 = 0x1111;
    CsmRegs.key1 = 0x2222;
    CsmRegs.key2 = 0x3333;
    CsmRegs.key3 = 0x4444;
    CsmRegs.KEY4=0x5555;
    CsmRegs.KEY5 = 0x6666;
    CsmRegs.KEY6 = 0x7777;
    CsmRegs.KEY7 = 0x8888;
    _asm (" EDIS");

    //如果 CSM 未锁定,则返回成功,否则返回
    //失败。
    if (CsmRegs.CSMSCR.bit.SECURE = 0)
    返回 STATUS_SUCCESS;
    其他
    返回 STATUS_FAIL;

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

    我想知道我是否可以让别人花点时间和我在一起来获得解决方案。   我昨天尝试使用上述代码使闪存解锁。  我甚至尝试将该函数放在安全 RAM 中、以查看是否是问题 所在、而不是运气问题。   确实必须有未记录的内容、否则我在文档中缺少了一些内容。  我应该提到、代码外观能够解锁、但我无法使用上面的代码从我的应用程序中解锁代码。  如果我不是这样做、那么 codeskin 可以做些什么呢?  我 迫切需要一个解决方案、因为这个问题阻碍了我的产品的发货。  如果您能提供更多建议、我将不胜感激。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很抱歉、我在应该回复您时回答了我自己、David。
    我想知道我是否可以让别人花点时间和我在一起来获得解决方案。 我昨天尝试使用上述代码使闪存解锁。 我甚至尝试将该函数放在安全 RAM 中、以查看是否是问题所在、而不是运气问题。 确实必须有未记录的内容、否则我在文档中缺少了一些内容。 我应该提到、代码外观能够解锁、但我无法使用上面的代码从我的应用程序中解锁代码。 如果我不是这样做、那么 codeskin 可以做些什么呢? 我迫切需要一个解决方案、因为这个问题阻碍了我的产品的发货。 如果您能提供更多建议、我将不胜感激。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    James、

    我将执行一个示例程序和测试。

    不过、有一点:您是否尝试在程序中按相反的顺序列出您的密码?

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

    James、

    我进行了测试、一切正常。 我可以使用您的代码(当然使用我的密码)解锁 CSM。

    1) 1)尝试在程序中反转密码的顺序。
    2) 2)您是从闪存还是安全 RAM 运行此代码? 由于闪存中的 PWL 受到 CSM 模块的保护、因此您只能从安全内存进行虚拟读取。

    [更新2018Apr27、1056AM EDT、更改]:上面的#2不正确。  您可以从不安全的存储器执行虚拟读取。


    此致、
    David

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好、David 仍然不能成功地反转密码。 我还阅读了一些建议从安全 RAM 运行的文档
    这是我的函数、密码被颠倒。 我相信我正在从安全存储器运行。 我的映射文件显示了我的函数在98333的地址、如下所示。 你会说这是一个跑步的好地方吗?
    0 00009833 _CsmUnlock

    #pragma CODE_SECTION (CsmUnlock、"ramfuncs");
    uint16 CsmUnlock()

    易失性 uint16温度;



    //执行密码位置的虚拟读取
    //如果它们与密钥值匹配,CSM 将解锁

    temp = CsmPwl.PSWD0;
    temp = CsmPwl.PSWD1;
    temp = CsmPwl.PSWD2;
    temp = CsmPwl.PSWD3;
    temp = CsmPwl.PSWD4;
    temp = CsmPwl.PSWD5;
    temp = CsmPwl.PSWD6;
    temp = CsmPwl.PSWD7;

    //使用当前密码加载密钥寄存器。 0xFFFF 是虚拟的
    //密码。 用户应将其替换为正确的 DSP 密码。

    _asm (" EALLOW");
    CsmRegs.KEY0 = 0x8888;
    CsmRegs.key1 = 0x7777;
    CsmRegs.key2 = 0x6666;
    CsmRegs.key3 = 0x5555;
    CsmRegs.KEY4=0x4444;
    CsmRegs.KEY5=0x3333;
    CsmRegs.KEY6 = 0x2222;
    CsmRegs.KEY7=0x1111;


    //如果 CSM 未锁定,则返回成功,否则返回
    //失败。
    uint16 status = CsmRegs.CSMSCR.bit.secure;
    _asm (" EDIS");
    如果(状态= 0)
    返回 STATUS_SUCCESS;
    其他
    返回 STATUS_FAIL;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我甚至不幸运地尝试了这种方法。 以从方程式中获取密码顺序。 我将密码设置为所有0xaaaa
    #pragma CODE_SECTION (CsmUnlock、"ramfuncs");
    uint16 CsmUnlock()

    易失性 uint16温度;



    //执行密码位置的虚拟读取
    //如果它们与密钥值匹配,CSM 将解锁
    _asm (" EALLOW");
    temp = CsmPwl.PSWD0;
    temp = CsmPwl.PSWD1;
    temp = CsmPwl.PSWD2;
    temp = CsmPwl.PSWD3;
    temp = CsmPwl.PSWD4;
    temp = CsmPwl.PSWD5;
    temp = CsmPwl.PSWD6;
    temp = CsmPwl.PSWD7;

    //使用当前密码加载密钥寄存器。 0xFFFF 是虚拟的
    //密码。 用户应将其替换为正确的 DSP 密码。


    CsmRegs.KEY0 = 0xaaaa;
    CsmRegs.key1 = 0xaaaa;
    CsmRegs.key2 = 0xaaaa;
    CsmRegs.key3 = 0xaaaa;
    CsmRegs.KEY4 = 0xaaaa;
    CsmRegs.KEY5 = 0xaaaa;
    CsmRegs.KEY6 = 0xaaaa;
    CsmRegs.KEY7 = 0xaaaa;


    //如果 CSM 未锁定,则返回成功,否则返回
    //失败。
    uint16 status = CsmRegs.CSMSCR.bit.secure;
    _asm (" EDIS");
    如果(状态= 0)
    返回 STATUS_SUCCESS;
    其他
    返回 STATUS_FAIL;

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

    James、

    尝试将解锁函数留在闪存中、而不是复制到 RAM、直到您将其解析。  另一个要处理的变量。

    解锁过程非常简单、您似乎已经正确执行了它。  我想知道您用于检测 CSM 状态的方法是否存在缺陷。  您如何处理'status'变量?  您是否使用它来点亮 LED 或类似的东西?

    戴维

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我认为您必须从安全 RAM 运行? 我已经尝试了闪存和安全 RAM。 我不对状态变量执行任何操作。 我现在代码仍然被锁定、因为 Code Composer 拒绝连接并告诉我它已被锁定。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    James、

    [引用 user="James Robb">我不对状态变量执行任何操作。 我现在代码仍然被锁定、因为 Code Composer 拒绝连接并告诉我它已被锁定。

    [/报价]
    除非您编辑.gel 文件、否则 CCS 将在连接时重置器件、从而再次锁定器件。  很容易在这里跳闸。
    我建议根据 CSM 状态闪烁 LED 或某种东西。  这样调试器就不会出现问题。
    戴维
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    James、

    您是否尝试过通过闪存插件 GUI 解锁它? 它是否在那里工作?

    您还可以共享 csmunlock()函数的汇编代码吗?

    此致、

    Vivek Singh
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我按照以下步骤验证闪存是否已锁定。

    我使用 codeskin 加载代码、并将0xaaaa 作为密码
    2.我连接调试器并使用片上闪存选项设置密码。
    3.我对运行解锁代码的控制器进行重新启动。
    4.然后我尝试使用错误的密码运行 codeskin。 Codeskin 告诉我器件已锁定。
    5.然后,我在 codeskin 中输入正确的密码,并能够加载代码。

    我认为此程序确认我的解锁代码不起作用。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    James、

    如果器件变得不安全、您是否可以切换某些 GPIO 以查看其是否正常工作? 尝试使用密码不正确的 codeskin 可能会再次锁定设备、因此可能无法提供正确的信息。 我觉得您的不安全代码运行正常、但您检查它的方式可能不起作用。

    此致、

    Vivek Singh
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这是我的列表。 在哪里可以获得"flash 插件 GUI"

    00000013 .sect ".text"
    2395 clink
    2396 .global _CsmUnlock
    2397
    2398 $C$D$313 .dwtag DW_TAG_듎 벶 랽 낸
    2399 dwattr $C$DW$313、DW_AT_NAME ("CsmUnlock")
    2400 dwattr $C$DW$313、DW_AT_LOW_PC (_CsmUnlock)
    2401 dwattr $C$DW$313、DW_AT_HIGH_PC (0x00)
    2402 dwattr $C$DW$313、DW_AT_TI_symbol_name ("_CsmUnlock")
    2403 dwattr $C$DW$313、DW_AT_EXTERNAL
    2404 dwattr $C$D$313、DW_AT_TYPE (*$C$DW$T$23)
    2405 dwattr $C$DW$313、DW_AT_TI_BEGIN_FILE ("../main.c")
    2406 dwattr $C$DW$313、DW_AT_TI_BEGIN_LINE (0x4f7)
    2407 dwattr $C$DW$313、DW_AT_TI_BEGIN_COLUMN (0x08)
    2408 dwattr $C$DW$313、DW_AT_TI_max_frame_size (-4)
    2409 .dwpsn 文件"../main.c"、行1272、列1、is_stmt、地址_CsmUnlock、ISA 0
    2410.
    2411. .dwfde $C$DW$CIE、_CsmUnlock
    2412.
    2413. ;*********
    2414. ;* FNAME:_CsmUnlock FR 大小:2. *
    2415. ;* *
    2416. ;*功能环境 *
    2417. ;* *
    2418. ;*函数属性 *
    2419. ;* 0个参数、1个自动、0个 SOE *
    2420. ;*********
    2421.
    2422. _解锁:
    2423. $C$$DW$314 .dwtag DW_TAG_variable
    2424. dwattr $C$DW$314、DW_AT_NAME ("temp")
    2425. dwattr $C$DW$314、DW_AT_TI_symbol_name ("_temp")
    2426. dwattr $C$DW$314、DW_AT_TYPE (*$C$DW$T $303)
    2427. dwattr $C$DW$314、DW_AT_LOCATION [DW_OP_Breg20 -1]
    2428.
    2429. ;* AR4分配给$O$C1
    2430. ;* AH 分配给_status
    2431. $C$DW$315 .dwtag DW_TAG_variable
    2432. dwattr $C$DW$315、DW_AT_NAME ("状态")
    2433. dwattr $C$DW$315、DW_AT_TI_symbol_name ("_STATUS")
    2434. dwattr $C$DW$315、DW_AT_TYPE (*$C$DW$T$23)
    2435. dwattr $C$DW$315、DW_AT_LOCATION [DW_OP_reg1]
    2436.
    2437. dwcfi CFA_offset、-2
    2438. dwcfi save_reg_to _mem、26、0
    2439 00000013 FE02 ADDK SP、#2 ;[cpu_u]
    2440. dwcfi CFA_offset、-4
    TMS320C2000汇编器 PC v16.9.0 2018年4月27日11:35:57星期五

    工具版权所有(c) 1996-2015 Texas Instruments Incorporated
    C:\Users\Eng4\AppData\Local\Temp\0818010 第46页

    2441 00000014 7622 EALLOW
    2442 00000015 761F! MOVW DP、#_CsmPwl ;[cpu_u]
    00000016 0000
    2443. .dwpsn 文件"../main.c"、行1280、列5、is_stmt、ISA 0
    2444 00000017 9200! MOV AL、@ü_CsmPwl ;[CPU_]|1280|
    2445 00000018 9641 MOV *-SP[1]、AL ;[CPU_]|1280|
    2446. .dwpsn 文件"../main.c"、行1293、列2、is_stmt、ISA 0
    2447 00000019 8F00! MOVL XAR4、#_CsmRegs ;[CPU_U]|1293|
    0000001a 0000
    2448. .dwpsn 文件"../main.c"、行1305、列21、is_stmt、ISA 0
    2449 0000001b D00F MOVB XAR0、#15 ;[CPU_]|1305|
    2450. .dwpsn 文件"../main.c"、行1281、列5、is_stmt、ISA 0
    2451 0000001c 9201! MOV AL、@μ_CsmPwl+1 ;[CPU_]|1281|
    2452 0000001d 9641 MOV *-SP[1]、AL ;[CPU_]|1281|
    2453. .dwpsn 文件"../main.c"、行1282、列5、is_stmt、ISA 0
    2454 0000001e 9202! MOV AL、@ü_CsmPwl+2 ;[CPU_]|1282|
    2455 0000001f 9641 MOV *-SP[1]、AL ;[CPU_]|1282|
    2456. .dwpsn 文件"../main.c"、行1283、列5、is_stmt、ISA 0
    2457 00000020 9203! MOV AL、@ü_CsmPwl+3 ;[CPU_]|1283|
    2458 00000021 9641 MOV *-SP[1]、AL ;[CPU_]|1283|
    2459. .dwpsn 文件"../main.c"、第1284行、第5列、IS_stmt、ISA 0
    2460 00000022 9204! MOV AL、@ü_CsmPwl+4 ;[CPU_]|1284]
    2461 00000023 9641 MOV *-SP[1]、AL ;[CPU_]|1284]
    2462. .dwpsn 文件"../main.c"、行1285、列5、is_stmt、ISA 0
    2463 00000024 9205! MOV AL、@ü_CsmPwl+5 ;[CPU_]|1285|
    2464 00000025 9641 MOV *-SP[1]、AL ;[CPU_]|1285|
    2465 .dwpsn 文件"../main.c"、行1286、列5、is_stmt、ISA 0
    2466 00000026 9206! MOV AL、@ü_CsmPwl+6 ;[CPU_]|1286|
    2467 00000027 9641 MOV *-SP[1]、AL ;[CPU_]|1286|
    2468 .dwpsn 文件"../main.c"、行1287、列5、is_stmt、ISA 0
    2469 00000028 9207! MOV AL、@ü_CsmPwl+7 ;[CPU_]|1287|
    2470 00000029 9641 MOV *-SP[1]、AL ;[CPU_]|1287|
    2471. .dwpsn 文件"../main.c"、行1293、列2、is_stmt、ISA 0
    2472 0000002a 28C4 MOV *+XAR4[0]、#43690 ;[CPU_]|1293|
    0000002b AAAA
    2473. .dwpsn 文件"../main.c"、行1294、列2、is_stmt、ISA 0
    2474 0000002c 28CC MOV *+XAR4[1]、#43690 ;[CPU_]|1294|
    0000002d AAAA
    2475 .dwpsn 文件"../main.c"、行1295、列2、is_stmt、ISA 0
    2476 0000002e 28D4 MOV *+XAR4[2]、#43690 ;[CPU_]|1295|
    0000002f AAAA
    2477 .dwpsn 文件"../main.c"、第1296行、第2列、IS_stmt、ISA 0
    2478 00000030 28DC MOV *+XAR4[3]、#43690 ;[CPU_]|1296|
    00000031 AAAA
    2479 .dwpsn 文件"../main.c"、行1297、列2、is_stmt、ISA 0
    2480 00000032 28E4 MOV *+XAR4[4]、#43690 ;[CPU_]|1297|
    00000033 AAAA
    2481. .dwpsn 文件"../main.c"、行1298、列2、is_stmt、ISA 0
    2482 00000034 28EC MOV *+XAR4[5]、#43690 ;[CPU_]|1298|
    00000035 AAAA
    2483 .dwpsn 文件"../main.c"、行1299、列2、is_stmt、ISA 0
    2484 00000036 28F4 MOV *+XAR4[6]、#43690 ;[CPU_]|1299|
    00000037 AAAA
    2485. .dwpsn 文件"../main.c"、第1300行、第2列、is_stmt、ISA 0
    2486 00000038 28FC MOV *+XAR4[7]、#43690 ;[CPU_]|1300|
    TMS320C2000汇编器 PC v16.9.0 2018年4月27日11:35:57星期五

    工具版权所有(c) 1996-2015 Texas Instruments Incorporated
    C:\Users\Eng4\AppData\Local\Temp\0818010 第47页

    00000039 AAAA
    2487 .dwpsn 文件"../main.c"、行1305、列21、is_stmt、ISA 0
    2488 0000003a CD94 和 AH、*+XAR4[AR0]、#0x0001;[CPU_]|1305|
    0000003b 0001.
    2489 0000003c 761A EDIS
    2490 .dwpsn 文件"../main.c"、行1310、列6、is_stmt、ISA 0
    2491 0000003d 9A00 MOVB AL、#0 ;[CPU_]|1310 |
    2492 0000003E FF69 SPM 0 ;[cpu_]
    2493 0000003f 5300 CMPB 啊、#0 ;[CPU_]|1310 |
    2494 00000040 56B1 MOVB AL、#1、EQ ;[CPU_]|1310 |
    00000041 01A9
    2495 00000042 FE82 子 B SP、#2 ;[cpu_u]
    2496 dwcfi CFA_offset、-2
    2497 $C$D$316 .dwtag DW_TAG_TI_BRANCH
    2498 dwattr $C$DW$316、DW_AT_LOW_PC (0x00)
    2499 dwattr $C$DW$316、DW_AT_TI_RETURN
    2500
    2501 00000043 0006 LRETR ;[cpu_]
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我按照您的建议添加了 GPIO。 安全位始终返回为1并将 GPIO_Number_40设置为高电平。 当器件解锁时、我还测试了安全位为0、并将 GPIO_Number_40设置为低电平。

    uint16 CsmUnlock()

    易失性 uint16温度;



    //执行密码位置的虚拟读取
    //如果它们与密钥值匹配,CSM 将解锁
    _asm (" EALLOW");
    temp = CsmPwl.PSWD0;
    temp = CsmPwl.PSWD1;
    temp = CsmPwl.PSWD2;
    temp = CsmPwl.PSWD3;
    temp = CsmPwl.PSWD4;
    temp = CsmPwl.PSWD5;
    temp = CsmPwl.PSWD6;
    temp = CsmPwl.PSWD7;

    //使用当前密码加载密钥寄存器。 0xFFFF 是虚拟的
    //密码。 用户应将其替换为正确的 DSP 密码。


    CsmRegs.KEY0 = 0xaaaa;
    CsmRegs.key1 = 0xaaaa;
    CsmRegs.key2 = 0xaaaa;
    CsmRegs.key3 = 0xaaaa;
    CsmRegs.KEY4 = 0xaaaa;
    CsmRegs.KEY5 = 0xaaaa;
    CsmRegs.KEY6 = 0xaaaa;
    CsmRegs.KEY7 = 0xaaaa;


    //如果 CSM 未锁定,则返回成功,否则返回
    //失败。
    uint16 status = CsmRegs.CSMSCR.bit.secure;
    _asm (" EDIS");
    如果(状态= 0)

    GPIO_setLow (halHandle->gpioHandle、GPIO_Number_40);
    返回 STATUS_SUCCESS;

    其他

    GPIO_setHigh (halHandle->gpioHandle、GPIO_Number_40);
    返回 STATUS_FAIL;


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

    在代码中、写入最后一个密钥寄存器后、您可以添加 EALLOW 指令、然后读取安全位。 请告诉我具体情况。

    此致、

    Vivek Singh
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    仍然不幸运。 仍然无法解锁闪存

    uint16 CsmUnlock()

    易失性 uint16温度;



    //执行密码位置的虚拟读取
    //如果它们与密钥值匹配,CSM 将解锁
    _asm (" EALLOW");
    temp = CsmPwl.PSWD0;
    temp = CsmPwl.PSWD1;
    temp = CsmPwl.PSWD2;
    temp = CsmPwl.PSWD3;
    temp = CsmPwl.PSWD4;
    temp = CsmPwl.PSWD5;
    temp = CsmPwl.PSWD6;
    temp = CsmPwl.PSWD7;

    //使用当前密码加载密钥寄存器。 0xFFFF 是虚拟的
    //密码。 用户应将其替换为正确的 DSP 密码。


    CsmRegs.KEY0 = 0xaaaa;
    CsmRegs.key1 = 0xaaaa;
    CsmRegs.key2 = 0xaaaa;
    CsmRegs.key3 = 0xaaaa;
    CsmRegs.KEY4 = 0xaaaa;
    CsmRegs.KEY5 = 0xaaaa;
    CsmRegs.KEY6 = 0xaaaa;
    CsmRegs.KEY7 = 0xaaaa;


    //如果 CSM 未锁定,则返回成功,否则返回
    //失败。
    _asm (" EALLOW");
    uint16 status = CsmRegs.CSMSCR.bit.secure;
    _asm (" EDIS");
    如果(状态= 0)

    GPIO_setLow (halHandle->gpioHandle、GPIO_Number_40);
    返回 STATUS_SUCCESS;

    其他

    GPIO_setHigh (halHandle->gpioHandle、GPIO_Number_40);
    返回 STATUS_FAIL;


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

    James、

    附加到这个帖子的是一个简单的代码示例、此示例已编辑 CSM 密码、程序解锁 CSM。  我正在闪烁 GPIO34、它连接到我正在使用的 F28035 controlCARD 上的 LED。  解锁过程完成后、如果 CSM 已解锁、LED 快速闪烁(~5Hz)。  如果 CSM 已锁定、则 LED 慢速闪烁(~0.5Hz)。

    您可能需要修改用于电路板的 GPIO。

    请注意,时钟/PLL 未配置,因此使用的 DelayMs()宏未校准。  它需要60MHz 时钟、但 CPU 仅以内部振荡器的10/2MHz (我认为)运行。

    我只将第一个密码从0xFFFF 更改为  我正在使用0xFFFE。  所有其他密码仍为0xFFFF。  不过、这不是问题。  我已经运行了此程序、并对所有密码进行了编程。  我只会像这样向您发送第一个0xFFFE。

    此致、

    David

    e2e.ti.com/.../F28035_5F00_example_5F00_nonBIOS.zip

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

    BTW、该项目是 CCSv8.0.0项目。  如果您使用的是较旧版本、则可能需要安装此程序才能加载项目。

    戴维

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我有一个较旧版本的 CCS 版本:6.1.1.00022。 是否可以同时安装 CCSv8.0.0? 如果我安装了所有 CCSv8.0.0、是否有任何风险使我的当前工具变得混乱?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您可以将 CCSv8安装在与 CCSv6不同的文件夹中。 例如、c:/ti2。

    或者、您可以尝试创建新项目并使用我的源文件。 该项目是完全自包含的。

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

    我能够使用 CCSv6工具编译您的项目。 我使用 CCS 调试器单步执行您的代码。
    我一收到该陈述就会立即通知您
    CsmRegs.CSMSCR.bit.FORCESEC = 1;

    我从 CCS 收到一条消息、询问我是否要使器件脱离低功耗模式。 我单击是。 我的28034重新启动并开始以非常快的速度切换 IO、就像器件已解锁并且安全位等于零一样。 这是我所期望的、因为密码与 password.asm 文件中编程的密码相匹配。 当我重新接通电源时出现问题。 电源再循环后、I/O
    以1秒的速率缓慢切换、这表明器件已锁定。 我循环通电几次、但器件仍保持锁定状态、且安全位等于1。 您是否不希望器件在下电上电后被解锁、因为写入密钥寄存器的密钥与您在闪存中编程的密钥相匹配?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    James、

    [引用用户="James Robb"]  
    我一收到该陈述就会立即通知您
    CsmRegs.CSMSCR.bit.FORCESEC = 1;

    我从 CCS 收到一条消息、询问我是否要使器件脱离低功耗模式。 我单击是。

    [/报价]

    这是预期的。  我也明白了。  当 CSM 被代码锁定时、CCS 失去与处理器的连接。  之前它已解锁(因为 CCS 已连接)。  您未处于低功耗模式。

    [引用用户="James Robb"]

    当我重新接通电源时出现问题。 电源再循环后、I/O
    以1秒的速率缓慢切换、这表明器件已锁定。 我循环通电几次、但器件仍保持锁定状态、且安全位等于1。 您是否不希望器件在下电上电后被解锁、因为写入密钥寄存器的密钥与您在闪存中编程的密钥相匹配?

    [/报价]

    这是不可预料的。  尝试从电路板上物理拔下仿真器、然后重新通电。

    戴维