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.
您好!
我在 TMS320F28379D 上使用 CPU1和 CPU2
在我的软件中、我 想使用 SD 卡上的十六进制文件(使用 SPI-A)对 CPU1和 CPU2的闪存进行重新编程。
如需相关信息、在之前的程序中、我仅使用 CPU1、此函数(使用 SD 卡对闪存重新编程)工作正常。
重新编程过程如下:
下面是我要继续的方式:
我可以正确重新编程 CPU1闪存,但我对 CPU2重新编程有一些疑问:
此致、
您好!
对于 CPU1编程和重新引导、程序的起始位置是什么? 它是闪存入口点吗? 是否有显示如何到达非法 ISR 的调用堆栈?
对于 SPI 问题、我已请求 SPI 专家发表意见。
谢谢、
Anu
您好!
[引用 userid="315989" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1055149/tms320f28379d-reprogramming-flash-for-cpu1-and-cpu2 ]CPU1重新启动后、我尝试将 SPI-A 所有权更改为 CPU2、但似乎无法正常工作。 为什么?您能否提供用于更改所有权的代码?
您是否正在修改 CPUSEL6寄存器、特别是位0 (SPIA)?
此致、
Marlyn
您好、Marlyn、
这是我使用的代码:
EALLOW; DevCfgRegs.CPUSEL6.bit.SPI_A = 1; // SPIA controlled by CPU2 EDIS;
我能否在闪存中写入数据之后,但在重新启动 CPU1之前执行此代码?
因为我希望 SPI-A 仅 在 CPU1重新编程后由 CPU2驱动;在正常操作中,SPI-A 将由 CPU1驱动。
此致、
Anu、
是的、它是闪存入口点。
在最终操作中,CPU1和 CPU2将在闪存上重新启动,这就是我使用该指令的原因:
IPCBootCPU2(C1C2_BROM_BOOTMODE_BOOT_FROM_FLASH);
但对于调试测试、我删除了该指令。
是否有显示如何到达非法 ISR 的调用堆栈?
我不理解您的请求,如何继续?
对我来说,出现问题可能是正常的,因为我处于调试模式,重新启动后,Code Composer 将断开连接,不会?
此致、
我今天进行了几次测试。 我已经尝试了整个循环,不进行闪存操作并重新引导:
所以它可以正常工作。 问题是当我擦除 CPU1和 CPU2上的闪存扇区以及尝试重新启动两个内核时。
感谢您的支持。
此致、
您好!
[引用 userid="315989" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1055149/tms320f28379d-reprogramming-flash-for-cpu1-and-cpu2/3904811 #3904811"]在擦除闪存扇区并使用我的十六进制文件重新写入闪存之后,我必须如何继续向 CPU2发送 IPC0标志并将 SPI-A 所有权更改为 CPU2?这可能是您要写入闪存的新十六进制文件的一部分。 这些指令可以放置在您的 init 函数之后。
[引用 userid="315989" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1055149/tms320f28379d-reprogramming-flash-for-cpu1-and-cpu2/3904811 #3904811"]此处不清楚、如果 CPU1在重新启动前不空闲、它处于什么状态? 基于这一点、这里的情况似乎就是这样:
[引用 userid="315989" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1055149/tms320f28379d-reprogramming-flash-for-cpu1-and-cpu2/3904811 #3904811"]CPU1为 CPU2提供 SPI-A 所有权、将 IPC0标志发送到 CPU2、然后保留 SD 卡读取功能。 我没有重新启用中断、因此 CPU1处于"空闲"状态、因为我的软件基于外部中断。 CPU1执行主循环(内部无函数)[/quot]为此:
[引用 userid="315989" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1055149/tms320f28379d-reprogramming-flash-for-cpu1-and-cpu2/3904811 #3904811]CPU2端:是否可以在此处不重复重写之前在 CPU2操作中执行相同的功能? 在 CPU2开始执行之前、是否使用新映像正确写入闪存-您可能正在从擦除的闪存读取?
谢谢、
Anu
您好!
[引用 userid="453770" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1055149/tms320f28379d-reprogramming-flash-for-cpu1-and-cpu2/3905854 #3905854"]这可能是您要写入闪存的新十六进制文件的一部分。 这些指令可以放在 init 函数之后。[/quot]可以、但只有在我们进行重新编程时、才能执行这些函数(将 IPC 标志发送到 CPU2并将 SPI-A 所有权更改为 CPU2)。
在正常操作(重新启动时不重新编程)中、CPU1必须驱动 SPI-A、并且不会向 CPU2发送 IPC0标志。
如果有重新编程,则在 CPU1重新引导后:
如果没有重新编程,则在简单重新启动后:
为了解决这个问题、如果我有一个重新编程、但在所有重新编程过程之前、我在闪存的一部分写入一个值(在重新编程期间不会被擦除)。
当我重新启动 CPU 时、我读取了这个值、我知道是否有重新编程。
希望我对此很清楚。
我遇到的主要问题是 CPU 重新启动。 正如我在下面解释的那样、当我移除闪存(擦除和写入)操作并重新启动时、CPU1和 CPU2之间的循环正确完成。
如果我在调试模式下使用重新启动功能,在 Code Composer 上有中断是正常的? 我尝试仅在 CPU1上执行闪存操作和重新引导,我有此中断:
// // Illegal Operation Trap // interrupt void ILLEGAL_ISR(void) { // // Insert ISR Code here // // // Next two lines for debug only to halt the processor here // Remove after inserting ISR Code // asm (" ESTOP0"); for(;;); }
我的 CPU1重新启动功能是否正确?
EALLOW; WdRegs.SCSR.all = 0x0000; // Configuration : Generate a reset signal EDIS; EALLOW; WdRegs.WDKEY.all = 0x0055; // Clear the WDCNTR bits WdRegs.WDKEY.all = 0x00AA; // Clear the WDCNTR bits EDIS; EALLOW; WdRegs.WDCR.all = 0x0028; // Enable the watchdog EDIS; EALLOW; WdRegs.WDKEY.all = 0x0055; // Do not clear the WDCNTR bits to generate the reset signal WdRegs.WDKEY.all = 0x0000; // Do not clear the WDCNTR bits to generate the reset signal EDIS;
WD 是否仅重新引导 CPU1或两个 CPU?
此致、
您好!
我 将检查在调试模式下重新启动 CPU 是否会导致 ITRAP。 此链接还可以帮助您了解 CPU 加入 ITRAP 的原因: https://software-dl.ti.com/C2000/docs/c28x_interrupt_faq/html/index.html
是否正在尝试生成看门狗超时? 您似乎在按照正确的步骤操作。
看门狗复位会按如下方式影响 CPU1和 CPU2:
谢谢、
Anu
Anu、您好!
是的、我只希望 CPU 重新启动、这就是我使用看门狗超时的原因。 这是正确的方法吗?
好的、CPU1上的看门狗复位会影响两个 CPU。
因此 ,如果我想使用调试模式并在重新启动后执行联机测试,我需要在运行前为两个 CPU 设置仿真闪存启动,对吗?
我做了一个非常简单的测试:
我如何知道我在计划中的位置?
我是否需要将此指令用于 CPU1?
CpuSysRegs.RESC.bit.WDRSn = 1;
同时等待您对 ITRAP 的回答。
感谢您的支持。
此致、
您好!
在调试模式下自行重新启动 CPU 不会导致 ITRAP -闪存入口点是否填充了 CODE_START 函数? 如果 codestartbranch 文件的内容未写入闪存入口点、CPU 可能正在执行一些垃圾指令、这可能是生成 ITRAP 的原因。 您能否检查应在重新引导后运行的映像的映射文件、并查看 codestartbranch 文件是否映射到闪存入口点?
要产生看门狗超时、对 SCSR 寄存器和 WDCR 寄存器的写入应该足够了。
要查看您在程序中的位置、在 ITRAP 期间查看栈的内容可能也很有帮助、返回地址应该在那里。
谢谢、
Anu
Anu、您好!
正如我解释的那样,在我上次测试期间,我不再使用 ITRAP,但我不知道我的程序是否正确重新启动;我的过程(下面)是否正确 ?
[引用 userid="315989" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1055149/tms320f28379d-reprogramming-flash-for-cpu1-and-cpu2/3907468 #3907468"]我做了一个非常简单的测试:
感谢您的支持。
此致、
我将与一名员工核实、并在几天内回复您。
谢谢
Anu
您好!
是否有更新?
此致、
您好!
Anu 今天不在办公室。 我们将在 下周早些时候进行回顾并与您再次进行讨论。
谢谢、此致、
Vamsi
您好!
任何更新?!
此致、
您好!
很抱歉耽误你的回答。
[引用 userid="315989" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1055149/tms320f28379d-reprogramming-flash-for-cpu1-and-cpu2/3910034 #3910034"]在这种情况下,CPU1是否在从 SD 卡读取信息后经过复位周期? 重新引导后停止 CPU 时,PC 值是多少?
此致、
Vivek Singh
好的、我从您的原始帖子中看到您正在使用 WD 重置重新启动 CPU1。 您还了解 CPU1 WD 重置将重置 CPU1和 CPU2、因此我希望您在流程中进行了更改、以便对 CPU1和 CPU2进行编程、然后使用 WD 重置重新启动 CPU1、这也将重新启动 CPU2。
是这样吗?
此致、
Vivek Singh
您好、Vivek、
是的、我使用 WD 来重置 CPU1。 我很清楚、CPU1 WD 也会重置 CPU2。
首先我要检查的是 WD 是否重新启动 CPU1;这是我继续执行的方法:
您知道原因吗? 我希望我对我的解释很清楚。
这是第一个要解决的问题、在我解释我要继续对两个 CPU 进行编程时、我将进行解释。
此致、
WD 复位(用于重新启动)后,是否已检查 仿真闪存启动 (EMU_BOOT_FLASH)是否仍然设置? 当您停止 CPU1时,它在何处停止(PC 值)? 请在暂停后检查 RESC 和 NMISHDFLG 寄存器中的值。
此致、
Vivek Singh
您好、Vivek、
如何在复位后检查仿真闪存启动?
我将于周一进行测试
此致、
您好!
[引用 userid="315989" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1055149/tms320f28379d-reprogramming-flash-for-cpu1-and-cpu2/3934322 #3934322"] 复位后如何检查仿真闪存启动?您在复位矢量(在引导 ROM 中)中放置了一个硬件断点(基本上是 CPU 在您发出调试复位后指向的 PC)、CPU 应该在 WD 复位后暂停、然后您可以检查该值。 您还可以检查新映像并查看其编程是否正确。
此致、
Vivek Singh
您好、Vivek、
当我停止 CPU1时,寄存器的值为:
程序在中断中停止,这意味着 它在 Init 之后没有在我的点(ASM (" ESTOP0")中停止;),它 真的会重新启动?
抱歉,如何继续操作? 我以前从未这么做过。
此致、
CPU 在上述点暂停后,您是否检查了地址0xD00的值?
此致、
Vivek Singh
您好、Vivek、
您是说当我暂停 CPU 时? 明天我将检查 EMUBOOTCTRL (地址0xD00)的值
如何继续在复位矢量中放置硬件断点?
感谢 Vivek 的支持。
此致、
如前所述、当您复位 CPU 时、将断点置于 PC 指向的位置(打开反汇编视图并添加断点)。
报
Vivek Singh
Vivek、
很抱歉、如果我问一些问题、我不太清楚。
如果我理解,我必须第一次重置 CPU,请参阅 PC 指向的位置(通过打开反汇编视图),并添加一个断点?
如何在 反汇编视图中添加断点?
那么我必须重新启动我的程序吗?
感谢您的支持、很抱歉回答这些问题。
此致、
只需双击要设置断点的行。
[引用 userid="315989" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1055149/tms320f28379d-reprogramming-flash-for-cpu1-and-cpu2/3938698 #39386989"]然后我必须重新启动我的程序?您不必重新启动该程序。 只需在设置断点后运行它。 程序已加载到闪存中、因此它应该可以正常工作。
此致、
Vivek Singh
您好!
您是否能够使其正常工作?
此致、
Vivek Singh
您好、Vivek、
很抱歉、我在度假。
旧问题得到解决、CPU1在仿真模式下的看门狗复位后重新启动。 但主要问题不是。 只是为了解释这种情况:
我想重新编程 CPU1和 CPU2;对于这两个 CPU,目标是转换十六进制文件中的.out 文件,将其存储在 SD 卡上,读取该文件,然后将十六进制文件写入闪存。
我有问题
2种不同的情况(我只解释 CPU1):
//IPCBootCPU2(C1C2_BROM_BOOTMODE_BOOT_FROM_FLASH);
我构建.out 文件、转换为.hex 文件、将其复制到 SD 卡上、读取 SD 卡、正确写入闪存。 它的工作原理。
IPCBootCPU2(C1C2_BROM_BOOTMODE_BOOT_FROM_FLASH);
我构建.out 文件、转换为.hex 文件、将其复制到 SD 卡上、读取 SD 卡、写入闪存;它不起作用。
.out 文件、即.hex 文件、并不完全相同、我同意这一点。
在我的.hex 文件中、某些行已更改、尤其是一行。
此行的字节数已更改、现在我已经在闪存中写入并发出了命令。
是因为我在 函数 Fapi_issueProgrammingCommand()中使用了 Fapi_AutoEccGeneration 吗?
要进行编程,我遵循第10章中的说明:
当我想对地址0x8BA66进行编程时、它不起作用。
您知道原因吗?
感谢您的支持。
此致
您好!
为什么需要在仿真模式下注释掉 IPC 引导命令代码。 您还应该能够在仿真模式下运行准确的代码、如果代码失败、则对其进行调试。 您应该能够重置 CPU1/CPU2、然后运行 CPU1、然后运行 CPU2、它应该像独立运行一样工作。
此致、
Vivek Singh
Vivek、
现在、我可以使用闪存模式重新引导进入仿真模式。 您说得对、我不必注释 IPC 引导命令代码。
但它不能解决我的问题。 我无法在闪存中写入某些数据,我不明白为什么:
闪存中的数据写入(.hex 文件):
擦除和重新编程后在闪存中写入的数据:
看起来@0x8BA66处的数据没有写入、但我不知道为什么。
此致、
您好!
现在您可以在连接了仿真器的情况下运行相同的代码、您应该能够单步执行代码并在尝试对闪存进行编程时找到错误代码。 我觉得奇怪的是、您只面临一个特定地址的问题。 我还将邀请我们的闪存专家来研究这一点。
此致、
Vivek Singh
您好!
在链接器 cmd 文件中、是否所有段都在128位边界上对齐? 您可以使用 align (8)来实现此目的。
请查看 C2000Ware 中提供的用于 alert()的基于闪存的链接器 cmd 文件。
谢谢、此致、
Vamsi
您好、Vamsi、
请在随附的我的 cmd 文件中找到。 我按照您的说明操作,地址有偏移量,但问题相同:
MEMORY { PAGE 0 : /* Program Memory */ /* Memory (RAM/FLASH) blocks can be moved to PAGE1 for data allocation */ /* BEGIN is used for the "boot to Flash" bootloader mode */ BEGIN : origin = 0x080000, length = 0x000002 RAMM0 : origin = 0x000122, length = 0x0002DE RAMD0 : origin = 0x00B000, length = 0x000800 RAMLS03 : origin = 0x008000, length = 0x002000 //RAMLS0 : origin = 0x008000, length = 0x000800 //RAMLS1 : origin = 0x008800, length = 0x000800 //RAMLS2 : origin = 0x009000, length = 0x000800 //RAMLS3 : origin = 0x009800, length = 0x000800 RESET : origin = 0x3FFFC0, length = 0x000002 /* Flash sectors */ FLASHABCDEFG : origin = 0x080002, length = 0x01FFFE /* on-chip Flash */ //FLASHA : origin = 0x080002, length = 0x001FFE /* on-chip Flash */ //FLASHB : origin = 0x082000, length = 0x002000 /* on-chip Flash */ //FLASHC : origin = 0x084000, length = 0x002000 /* on-chip Flash */ //FLASHD : origin = 0x086000, length = 0x002000 /* on-chip Flash */ //FLASHE : origin = 0x088000, length = 0x008000 /* on-chip Flash */ //FLASHF : origin = 0x090000, length = 0x008000 /* on-chip Flash */ //FLASHG : origin = 0x098000, length = 0x008000 /* on-chip Flash */ FLASHH : origin = 0x0A0000, length = 0x008000 /* on-chip Flash */ //FLASHI : origin = 0x0A8000, length = 0x008000 /* on-chip Flash */ FLASHK : origin = 0x0B8000, length = 0x002000 /* on-chip Flash */ FLASHL : origin = 0x0BA000, length = 0x002000 /* on-chip Flash */ FLASHM : origin = 0x0BC000, length = 0x002000 /* on-chip Flash */ FLASHN : origin = 0x0BE000, length = 0x002000 /* on-chip Flash */ PAGE 1 : /* Data Memory */ /* Memory (RAM/FLASH) blocks can be moved to PAGE0 for program allocation */ BOOT_RSVD : origin = 0x000002, length = 0x000120 /* Part of M0, BOOT rom will use this for stack */ RAMM1 : origin = 0x000400, length = 0x000400 /* on-chip RAM block M1 */ RAMD1 : origin = 0x00B800, length = 0x000800 RAMLS4 : origin = 0x00A000, length = 0x000800 RAMLS5 : origin = 0x00A800, length = 0x000800 RAMGS0 : origin = 0x00C000, length = 0x001000 RAMGS1_2_3 : origin = 0x00D000, length = 0x003000 RAMGS4_5_6 : origin = 0x010000, length = 0x003000 //RAMGS5 : origin = 0x011000, length = 0x001000 //RAMGS6 : origin = 0x012000, length = 0x001000 RAMGS7 : origin = 0x013000, length = 0x001000 RAMGS8 : origin = 0x014000, length = 0x001000 RAMGS9 : origin = 0x015000, length = 0x001000 RAMGS10 : origin = 0x016000, length = 0x001000 RAMGS11 : origin = 0x017000, length = 0x001000 RAMGS12 : origin = 0x018000, length = 0x001000 RAMGS13 : origin = 0x019000, length = 0x001000 RAMGS14 : origin = 0x01A000, length = 0x001000 RAMGS15 : origin = 0x01B000, length = 0x001000 CPU2TOCPU1RAM : origin = 0x03F800, length = 0x000400 CPU1TOCPU2RAM : origin = 0x03FC00, length = 0x000400 FLASHI : origin = 0x0A8000, length = 0x008000 /* on-chip Flash */ // for reboot mode FLASHJ : origin = 0x0B0000, length = 0x008000 /* on-chip Flash */ } SECTIONS { /* Allocate program areas: */ //.cinit : > FLASHABCDEFG PAGE = 0, ALIGN(4) /* initialization values for global and static variables */ //.pinit : > FLASHABCDEFG, PAGE = 0, ALIGN(4) /* tables for global constructors (C++) */ //.text : > FLASHABCDEFG PAGE = 0, ALIGN(4) /* Executable code and constants */ //codestart : > BEGIN PAGE = 0, ALIGN(4) .cinit : > FLASHABCDEFG PAGE = 0, ALIGN(8) /* initialization values for global and static variables */ .pinit : > FLASHABCDEFG, PAGE = 0, ALIGN(8) /* tables for global constructors (C++) */ .text : > FLASHABCDEFG PAGE = 0, ALIGN(8) /* Executable code and constants */ codestart : > BEGIN PAGE = 0, ALIGN(8) /* Allocate uninitalized data sections: */ //.stack : > RAMM1 PAGE = 1 /* stack space */ //.ebss : >> RAMLS4 | RAMLS5 PAGE = 1 /* global and static variables */ //.esysmem : > RAMGS0 PAGE = 1 /* memory for far malloc functions */ .stack : > RAMM1 PAGE = 1, ALIGN(8) /* stack space */ .ebss : >> RAMLS4 | RAMLS5 PAGE = 1, ALIGN(8) /* global and static variables */ .esysmem : > RAMGS0 PAGE = 1, ALIGN(8) /* memory for far malloc functions */ /* Initalized sections go in Flash */ //.econst : >> FLASHABCDEFG PAGE = 0, ALIGN(4) //.switch : > FLASHABCDEFG PAGE = 0, ALIGN(4) .econst : >> FLASHABCDEFG PAGE = 0, ALIGN(8) .switch : > FLASHABCDEFG PAGE = 0, ALIGN(8) .reset : > RESET, PAGE = 0, TYPE = DSECT /* not used, */ #ifdef __TI_COMPILER_VERSION__ #if __TI_COMPILER_VERSION__ >= 15009000 GROUP { .TI.ramfunc { -l F021_API_F2837xD.lib} } LOAD = FLASHABCDEFG, RUN = RAMLS03, LOAD_START(_RamfuncsLoadStart), LOAD_SIZE(_RamfuncsLoadSize), LOAD_END(_RamfuncsLoadEnd), RUN_START(_RamfuncsRunStart), RUN_SIZE(_RamfuncsRunSize), RUN_END(_RamfuncsRunEnd), PAGE = 0 #else GROUP { ramfuncs { -l F021_API_F2837xD.lib} } LOAD = FLASHABCDEFG, RUN = RAMLS03, LOAD_START(_RamfuncsLoadStart), LOAD_SIZE(_RamfuncsLoadSize), LOAD_END(_RamfuncsLoadEnd), RUN_START(_RamfuncsRunStart), RUN_SIZE(_RamfuncsRunSize), RUN_END(_RamfuncsRunEnd), PAGE = 0 #endif #endif /* The following section definitions are required when using the IPC API Drivers */ GROUP : > CPU2TOCPU1RAM, PAGE = 1 { PUTBUFFER PUTWRITEIDX GETREADIDX } GROUP : > CPU1TOCPU2RAM, PAGE = 1 { GETBUFFER : TYPE = DSECT GETWRITEIDX : TYPE = DSECT PUTREADIDX : TYPE = DSECT } //CPU1ExchangeBuffer : > RAMD1 PAGE = 1 //CPU1toCPU2Buffer : > CPU1TOCPU2RAM PAGE = 1 //CPU2toCPU1Buffer : > CPU2TOCPU1RAM PAGE = 1 //CalibrationTable : > RAMGS4_5_6 PAGE = 1 //SDCard_Memory : > RAMGS7 PAGE = 1 CPU1ExchangeBuffer : > RAMD1 PAGE = 1, ALIGN(8) CPU1toCPU2Buffer : > CPU1TOCPU2RAM PAGE = 1, ALIGN(8) CPU2toCPU1Buffer : > CPU2TOCPU1RAM PAGE = 1, ALIGN(8) CalibrationTable : > RAMGS4_5_6 PAGE = 1, ALIGN(8) SDCard_Memory : > RAMGS7 PAGE = 1, ALIGN(8) } /* //=========================================================================== // End of file. //=========================================================================== */
感谢您的支持。
此致、
您好!
1) 1)到目前为止、您正在使用自定义闪存编程器将十六进制映像加载到闪存-正确吗?
2) 2) 2)如果您使用 CCS 对十六进制映像进行编程、会发生什么情况? 它是否会导致相同的问题? 请检查并告知我。
谢谢、此致、
Vamsi
Vamsi Gudivada 您好、
1) 1)是的、我正在使用 SD 卡加载十六进制闪存映像。
2) 2)您是说我是否使用 CCS 加载十六进制映像? 如何继续操作?
谢谢、此致
您好!
2。 CCS 也允许您加载十六进制文件。 加载时是否遇到问题?
谢谢、此致、
Vamsi
Vamsi、
使用 CCS 加载 hex 文件时没有问题。
数据写入正确:
感谢您的支持。
此致、
您好!
那么、我 认为问题不在于十六进制文件或闪存。
谢谢、此致、
Vamsi
我同意, 那么错误可以从哪里来?!
目标是使用 SD 卡加载 hex 文件而不是 CCS、因此我的问题无法得到解决。
此致、
您好!
您需要从 SD 卡检查/调试加载程序/编程器。
谢谢、此致、
Vamsi
Vamsi、
这正是我在之前的帖子中所做的。 我将一些断点放在不同的位置以找到问题、但我找不到它。
这不是对齐内存问题。 我发现问题的地址是0x8BA6A,如下所述: e2e.ti.com/.../faq-faq-on-flash-api-usage-for-c2000-devices
(iii)如果地址为“128位对齐地址+2”,则一次最多可编程六个16位字。
我有16个要写入的字、因此我已经写入了2个字、4个字、4个字和2个字。 如上所述,2个字不是写的,但其他所有字都是:
有什么想法吗?
谢谢、此致。
您好!
感谢您阅读我的常见问题解答。
如果我理解正确、您将讨论最后两个未正确写入的字。
如果您使用 Fapi_AutoEccGeneration 或 Fapi_DataAndEcc 模式对 ECC 进行编程、则每当您对小于4个字(对齐64位)的字进行编程时、您需要 确保不会再次对该4个字(对齐64位)中的其余未编程位置进行编程-即使这些位置为0xFFFF、程序操作也将失败。 原因:假定在该64位内未提供数据为0xFFFF、已经为该64位对 ECC 进行了编程。 现在、当您尝试对这些被擦除的位置进行编程时、新的 ECC 值将与现有的 ECC 值相冲突-程序将失败。
谢谢、此致、
Vamsi
闪存常见问题解答: e2e.ti.com/.../faq-flash-frequently-asked-questions
Vamsi、
感谢您的解释、现在我很清楚。
我将使用 Fapi_DataOnly、它对我的应用更灵活。
此致、
您好!
很高兴它帮助了我们。
请注意: 无论您使用哪种编程模式(Fapi_DataOnly 或 Fapi_AutoEccGeneration 等)、都应对给定的128位对齐存储器进行编程、时间不超过4次(包括 ECC 写入)。
如果您有任何疑问、请告诉我。
谢谢、此致、
Vamsi
您好、Vamsi、
[引用 userid="16728" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1055149/tms320f28379d-reprogramming-flash-for-cpu1-and-cpu2/3956942 #3956942"]请注意: 无论您使用哪种编程模式(Fapi_DataOnly 或 Fapi_AutoEccGeneration 等)、都应对给定的128位对齐内存进行不超过4次编程(包括 ECC 写入)。 [/报价]为什么会这样呢? 我不会一次对128位对齐存储器进行编程、最大为64位对齐。
重启后(由于看门狗复位)、程序在 NMI 中断中停止。 是因为我使用 Fapi_DataOnly 而不是 Fapi_AutoEccGeneration 吗?
我禁用 ECC 来解决它。 是否有特定的地方可以编写此代码?
最后一个问题是,在擦除闪存并重新写入闪存后,程序在重新启动后停止,但我不知道问题是什么:
我已经检查了、所有闪存扇区 都进行了良好的编程。 是因为 ECC 吗?
感谢您的支持。
您好!
今天是我们的假期。 我将在一两天内回来。
谢谢、此致、
Vamsi
您好、Vamsi、
我已修改代码以使用 Fapi_AutoEccGeneration 而不是 Fapi_DataOnly。 我还删除了禁用 ECC 的函数。
我在 CPU1闪存写入函数的末尾放置了一个断点;闪存扇区似乎被很好地编程。
但是,当我重新启动 CPU1并重置看门狗时,我会收到以下消息:
可以帮帮我吗?
是否必须在 CPU1或 CPU2上使用"CpuSysRegs.RESC.bit.WDRSn = 1;"指令?
此致、
您好!
屏幕截图中的该地址是引导 ROM 空间中的 NMI 处理程序(根据 TRM 的4.9.2等待点部分)。
请检查 NMIFLG/NMISHDFLG 寄存器以了解 NMI 的原因并修复它。
谢谢、此致、
Vamsi