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.
您好!
我正面临一个奇怪的问题。 我开发了引导加载程序、可以使用 FlashAPI 函数对 CPU1或 CPU2闪存(或 OTP DCSM 位置)进行编程/验证。 引导加载程序被加载(使用并行引导模式访问)并从共享 GSRAMx 运行。 一个引导加载程序用于访问 CPU1、另一个用于 CPU2内核。 我已经对 CPU1闪存、CPU2闪存和 CPU2的 DCSM OTP 位置进行了编程(所有操作都无错误通过)。 之后、我将器件断电、为器件加电、将 CPU1的引导加载程序加载到 GSRAM (负载似乎正常)、并尝试对 DCSM OTP CPU1存储器位置进行编程。 但我的引导加载程序停止工作! 似乎在器件断电和加电后、DCSM OTP CPU2安全设置(仅对 ZONE1 Z1-LINKPOINTER1/2/3、Z1-PSWDLOCK、Zx-GRABRAM、Zx-GRABSECT 和 Zx-CSMPSWD0/1/2/3 OTP 位置进行编程)会禁用运行代码以进行 CPU1编程... 这是正常的吗? 为什么会发生这种情况? 我已经预料到、只有 CPU1 (作为主内核)可以禁用或禁用并行引导模式?
如果我创建一个单一引导加载程序、在一个代码中可以访问 CPU1或 CPU2中的闪存而不对器件断电和上电、我是否能够成功地对两个 CPU 的 DCSM OTP 位置进行编程? controlSUITE/C2000ware 中是否存在一些示例代码、在从 CPU1访问 CPU2与返回之间进行切换?
感谢您的回答!
此致、
Tomas Lehotsky
您好、Vivek、
[引用 user="Vivek Singh)]有一点不清楚,那就是如果未对 CPU2用户 OTP 设置进行编程,您是否能够正确执行该操作? 此外、您是否能够对闪存扇区进行编程、问题仅与用户 OTP 有关?
[/报价]
是的、如果未对 CPU2用户 OTP 进行编程、我的引导加载程序工作正常、并且每次对器件执行操作(编程/验证/...) 工作无任何问题。 这对两个 CPU 的闪存扇区或 OTP 存储器有效。 当然、当我将 CPU1用户 OTP 密码位置编程为一些非空值时、情况将是相同的。 从这一点开始、我无法访问该器件(由于 bootROM 访问...)。
[引用 USER="Vivek Singh)]您能否将器件连接到 CCS 并检查 CPU2用户 OTP 设置以确保按预期进行编程;如果共享此信息没有问题、您能否共享这些值。
[/报价]
我确信、这些值已按照我的需要成功编程-当我使用 TI UniFlash 闪存工具并将编程的密码数据放在那里时、CPU2闪存已解锁。 在本例中、我能够在 UniFlash 工具中擦除/编程 CPU2闪存、而不会出现任何问题。 我不知道如何在 CCS"Memory Browser"窗口中查看 CPU2 OTP 位置、CPU2用户 OTP 的密码位置是否编程为非空值。 但是、我的程序和验证例程对 CPU2用户 OTP 位置进行编程、在编程期间不会返回任何错误。
CPU2用户 OTP 位置已按如下方式进行编程:
Z1-LINKPOINTER1 -地址0x78000、数据0x1FFF_FFFF
Z1-LINKPOINTER2 -地址0x78004、数据0x1FFF_FFFF
Z1-LINKPOINTER3 -地址0x78008、数据0x1FFF_FFFF
Z1-PSWDLOCK -地址0x78010、一些非空数据(由于安全性原因、我无法共享...)
Z1-GRABRAM -地址0x78024、数据0xFFF_5FFF
Z1-GRABSECT -地址0x78026、数据0xFFF5_5555
Z1-CSMPSWD0/1/2/3 -地址0x78028 - 0x7802E、一些非空白数据(由于安全性原因、我无法共享...)
所有其他 CPU2用户 OTP 具有0xFFFF 空值。
[引用 user="Vivek Singh">此外、当 CPU1引导加载程序尝试对其闪存/用户 OTP 设置进行编程时、CPU2会执行什么操作?
[/报价]
嗯、我从未关注过它。 是否有任何特殊呼叫需要呼叫、我不需要呼叫? 这是 CPU1闪存编程"main.c"过程的开始:
void main (void) { //步骤1。 初始化系统控制: //启用外设时钟 //此示例函数位于 F2837xD_sysctrl.c 文件中。 InitSysCtrl(); //解锁 CSM // //如果 API 函数将在不安全的 RAM 中运行 //则必须解锁 CSM,以便闪存 // API 函数访问闪存。 //如果从安全内存执行闪存 API 函数 //则不需要此步骤。 //DcsmZ1Unlock(); //步骤2. 初始化 GPIO: //此示例函数位于 F2837xD_GPIO.c 文件中, //说明了如何将 GPIO 设置为其默认状态。 InitGpio();//针对此示例跳过 //步骤3。 清除所有中断并初始化 PIE 矢量表: //禁用 CPU 中断 Dint; //将 PIE 控制寄存器初始化为默认状态。 //默认状态是禁用所有 PIE 中断并 清除标志//。 //此函数位于 F2837xD_PIECTRL.c 文件中。 InitPieCtrl(); //禁用 CPU 中断并清除所有 CPU 中断标志: IER = 0x0000; IFR = 0x0000; //使用指向 shell 中断 //服务例程(ISR )的指针初始化 PIE 矢量表。 //这将填充整个表,即使在 本示例中未使用中断//也是如此。 这对于调试很有用。 //可以在 DSP2802x_DefaultIsr.c 中找到 shell ISR 例程 //此函数可在 F2837xD_PieVect.c 中找到 InitPieVectTable(); //将时间关键代码和闪存设置代码复制到 RAM //其中包括 InitFlash()、闪存 API 函数以及// 分配给 ramfuncs 段的任何函数。 // RamfuncsLoadStart、RamfuncsLoadEnd 和 RamfuncsRunStart //符号由链接器创建。 请参阅器件.cmd 文件。 //memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(size_t)&RamfuncsLoadSize); //调用闪存初始化以设置闪存等待状态 //此函数必须驻留在 RAM 中 InitFlash(); //增益泵信标 使 eFlashPump(); //跳转至 RAM 并调用闪存 API 函数 Example_CallFlashAPI(); }
我一直在想是否未从安全 RAM 中加载和运行 CPU1代码(由上面列出的 CPU2用户 OTP 设置设置进行设置)。 因此、我要附加链接器文件以进行 CPU1编程。
e2e.ti.com/.../linker_5F00_file_5F00_flash_5F00_programming_5F00_cpu1_5F00_RAM.zip
我真的不明白 CPU2用户 OTP 设置为什么会导致我的引导加载程序(从共享 GSxRAM 加载并运行)无法正常工作... 有什么想法吗? 您是否需要任何其他信息?
此致、
Tomas Lehotsky
您好、Tomas、
[引用]我一直在想我的 CPU1代码是否未从安全 RAM 中加载和运行(由上面列出的 CPU2用户 OTP 设置设置进行设置)。 因此、我要附加链接器文件以进行 CPU1编程。 [/报价]
每个 CPU 都有自己的专用安全 RAM、因此这不是问题。
[引用]我真的不明白 CPU2用户 OTP 设置为什么会导致我的引导加载程序(从共享 GSxRAM 加载并运行)无法正常工作... 有什么想法吗? 您是否需要任何其他信息? [/报价]
在这种情况下、您是否检查了 XRSn 引脚的状态? 它是稳定的还是切换的。 如果 CPU2正在引导、但由于安全原因无法运行代码、则可能会向 CPU1发出 NMI、这将影响 CPU1的执行。 因此、了解 CPU2在本例中的作用非常重要。
如果您可以在连接 CCS 的情况下运行它、那会更好。
此致、
Vivek Singh
您好、Vivek、
很抱歉耽误了回复-我太忙了这个项目。
[引用 USER="Vivek Singh"]如果 CPU2正在引导但由于安全原因无法运行代码,则可能会向 CPU1发出 NMI,这将影响 CPU1的执行。 因此、了解 CPU2在本例中的作用非常重要。
[/报价]
你是对的。 CPU2正在执行可能影响 CPU1代码执行的操作这一想法似乎是正确的。 我在主过程中输入了以下命令:
EALLOW; DevCfgRegs.CPU2RESCTL.ALL = 0xA5A50001; EDIS;
它将 CPU2保持在复位状态。 此解决方案正常工作、我的 CPU1代码运行时没有任何问题。
感谢你的帮助!
此致、
Tomas