Thread 中讨论的其他器件:EK-TM4C1294XL、 TM4E129BNCZAD、TM4C1294KCPDT
工具/软件:
、芯片寄存器 FMPRE0 至 FMPRE7 可进行编程、但数据无法写入 FMPRE8 至 FMPRE15。
2、芯片寄存器 FMPPE0 至 FMPPE7 可进行编程、但数据无法写入 FMPPE8 至 FMPPE15。
3 μ s、FMPRE0 寄存器完全设置为 0、则芯片将被永久锁定、无法再次进入编程/调试模式。
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.
工具/软件:
、芯片寄存器 FMPRE0 至 FMPRE7 可进行编程、但数据无法写入 FMPRE8 至 FMPRE15。
2、芯片寄存器 FMPPE0 至 FMPPE7 可进行编程、但数据无法写入 FMPPE8 至 FMPPE15。
3 μ s、FMPRE0 寄存器完全设置为 0、则芯片将被永久锁定、无法再次进入编程/调试模式。
、芯片寄存器 FMPRE0 至 FMPRE7 可进行编程、但数据无法写入 FMPRE8 至 FMPRE15。
2、芯片寄存器 FMPPE0 至 FMPPE7 可进行编程、但数据无法写入 FMPPE8 至 FMPPE15。
[/报价]您好、
您能否说明如何将寄存器 FMPRE0 编程到 FMPRE7? 您是如何 将 FMPRE8 编程为 FMPRE15 的? 您是否已 将编程“提交“到这些寄存器? 您需要提交 才能使设置成为永久设置。
3、如果 FMPRE0 寄存器完全设置为 0、则芯片将被永久锁定、无法再次进入编程/调试模式。
当您将 FMPRE0 设置为 0 时、FMPPE0 的设置是什么? 我想您正在尝试启用仅执行保护、对吧? 您需要确保在编译代码时、不会对限制为仅执行的块进行字面数据访问。 对仅执行块的任何字面数据访问都将被阻止。 有关详细信息、请参阅数据表。
8.2.3.5 仅执行保护
仅执行保护可防止对受保护的闪存块进行修改和可见性。 减少
MODE 用于器件需要调试功能的情况、但属于的一部分
必须保护应用程序空间不受外部访问的影响。 这方面的一个例子是公司
希望销售 具有预编程专有软件的 TivaTM C 系列器件、但又允许销售
最终用户将自定义代码添加到闪存的不受保护区域(例如电机控制
模块、具有可定制电机配置部分(位于闪存中)。
文字数据使保护机制变得复杂。 编译 C 代码和
链接的文字数据(常量等)通常放置在文本段中函数之间、
直接计算。 在运行时通过使用 LDR 指令访问字面数据、
它使用 PC 相对存储器地址从存储器加载数据。 LDR 的执行
指令在 Cortex-M3 的 DCode 总线上生成一个读取事务、该事务受于
仅执行保护机制。 如果访问的块被标记为“仅执行“、则表示事务
会被阻止、并且会阻止处理器加载常量数据、从而被抑制
正确执行。 因此、使用仅执行保护需要处理文字数据
方式不同。 有三种方法可以解决这一问题:
1.使用编译器将字面数据收集到放入 1 的单独段中
更多支持读取的闪存块。 请注意、LDR 指令可能使用 PC 相对地址、
在这种情况下、字面池不能位于偏移量或软件的范围之外
可保留一个寄存器以指向文字池的基地址、并且 LDR 偏移量为
相对于池的开头。
2.使用从算术指令立即数据和生成文字数据的编译器
后续计算。
3.使用方法 1 或 2,但在汇编语言中,如果编译器不支持这两种方法。
当您将 FMPRE0 设置为 0 时、FMPPE0 的设置是什么? 我想您正在尝试启用仅执行保护、对吧? 您需要确保在编译代码时、不会对限制为仅执行的块进行字面数据访问。 对仅执行块的任何字面数据访问都将被阻止。 有关详细信息、请参阅数据表。 [/报价]您好、
当 FMPRE0 的值为 0x00000000、FMPPE0 的值为 0xFFFFFFFF 时、写入闪存的数据全为 0xFF。 完成上述数据编程后、SWD 接口无法停止启用。请帮助分析可能的原因。
[/quote]您能说明如何将寄存器 FMPRE0 编程为 FMPRE7 吗? 您是如何 将 FMPRE8 编程为 FMPRE15 的? 您是否已 将编程“提交“到这些寄存器? 您需要提交 才能使设置成为永久设置。 [/报价]您好、
我们通过 SWD 接口对芯片进行编程。 编程操作请参考以下说明。 数据可以成功写入芯片的 FMPRE0 到 FMPRE7、但数据无法写入 FMPRE8 到 FMPRE15。 FMPPE 也会出现同样的问题。
您好、
当 FMPRE0 的值为 0x00000000、FMPPE0 的值为 0xFFFFFFFF 时、写入闪存的数据全为 0xFF。 完成上述数据编程后、SWD 接口无法停止启用。请帮助分析可能的原因。
[/报价]这是一种不切实际的组合 (FMPRE0=0 和 FMPPE0=1)、允许对闪存进行编程/擦除、但不允许读取。 请参阅数据表。

我们将通过 SWD 接口对芯片进行编程。 编程操作请参考以下说明。 数据可以成功写入芯片的 FMPRE0 到 FMPRE7、但数据无法写入 FMPRE8 到 FMPRE15。 FMPPE 也会出现同样的问题。
我不知道为什么无法写入 FMPRE8-15。 您能否先解锁器件、以便所有非易失性寄存器都恢复到其出厂设置全 1。 解锁操作完成后、只需对 FMPRE8-15 进行编程即可。 您看到它们编程了吗?
这是一种不切实际的组合 (FMPRE0=0 且 FMPPE0=1)、即允许对闪存进行编程/擦除而不是读取。 请参阅数据表。 [/报价]在相同情况下、使用 0x00000000 编程 FMPRE1-7 不会影响芯片、因此问题可能不会由您描述的场景引起。
我不知道为什么 FMPRE8-15 不能写。 您能否先解锁器件、以便所有非易失性寄存器都恢复到其出厂设置全 1。 解锁操作完成后、只需对 FMPRE8-15 进行编程即可。 您看到他们编程了吗?在编程之前、我们已经对芯片执行了解锁操作。 编程 FMPRE8-15 和 FMPRE0-7 之间是否有任何区别? 由于我们同时对这 16 个寄存器进行编程、因此 FMPRE0-7 的数据可以写入芯片、但 FMPRE8-15 不能。 请提供这 16 个寄存器的编程过程的详细说明。 我想将其与我们的业务进行比较。 谢谢!
[/quote]
在相同情况下、使用 0x00000000 编程 FMPRE1-7 不会影响芯片、因此问题可能不是由您描述的场景引起
我很困惑。 在上一篇文章中、您说过“当 FMPRE0 的值为 0x00000000、FMPPE0 的值为 0xFFFFFFFF 时、写入闪存的数据全为 0xFF“。 这就是为什么我说这种结合是不现实的。

我们在编程之前对芯片执行了解锁操作。 编程 FMPRE8-15 和 FMPRE0-7 之间是否有任何区别? 由于我们同时对这 16 个寄存器进行编程、因此 FMPRE0-7 的数据可以写入芯片、但 FMPRE8-15 不能。 请提供这 16 个寄存器的编程过程的详细说明。 我想将其与我们的业务进行比较。 谢谢
这就是为什么我问您是否可以首先解锁设备、并且只对 FMPRE8-15 进行编程、而不对 FMPRE0-7 进行编程。 您可以尝试一下吗? 我想知道您是否只对 FMPRE8-15 进行编程而不是对 FMPRE0-7 进行编程、写入可以工作吗?
我很困惑。 在上一篇文章中、您说过“当 FMPRE0 的值为 0x00000000、FMPPE0 的值为 0xFFFFFFFF 时、写入闪存的数据全为 0xFF“。 这就是为什么我说这种结合是不现实的。
FMPRE1 为 0x00000000、FMPPE1 为 0xFFFFFFFF、对芯片没有影响。 但是、FMPRE0 为 0x00000000、FMPPE0 为 0x00000000、但芯片仍受影响。 因此、这不应是原因。
这就是为什么我问您是否可以首先解锁设备、然后只对 FMPRE8-15 进行编程、而不对 FMPRE0-7 进行编程 。 您可以尝试一下吗? 我想知道,如果你只编程 FMPRE8-15 而不是 FMPRE0-7,可以写工作吗?[/报价]我又试了一次,但 FMPRE8-15 仍然无法刻录到芯片中。
您好、
我对 FMPRE8-15 寄存器进行编程。 请参阅下面的第一张图。 它会一直工作到下一次下电上电。 请参阅第二张图。 下电上电后、FMPRE8-15 未提交。 我意识到这个问题是由于 MEM#18 勘误表造成的。 有关详细信息、请参阅勘误表。 上电后、每次在应用程序中重新提交寄存器。

下电上电后、FMPRE8-15 寄存器再次变为 0xFFFFFFFF。


下面是我使用程序 FMPRE8-15 的代码
HWREG(FLASH_FMA) = 0x10;
HWREG(FLASH_FMPRE8) = 0x0;
HWREG(FLASH_FMC) = FLASH_FMC_WRKEY | FLASH_FMC_COMT | FLASH_FMC_WRITE;
while(HWREG(FLASH_FMC) & FLASH_FMC_COMT)
{
}
HWREG(FLASH_FMA) = 0x12;
HWREG(FLASH_FMPRE9) = 0x0;
HWREG(FLASH_FMC) = FLASH_FMC_WRKEY | FLASH_FMC_COMT | FLASH_FMC_WRITE;
while(HWREG(FLASH_FMC) & FLASH_FMC_COMT)
{
}
HWREG(FLASH_FMA) = 0x14;
HWREG(FLASH_FMPRE10) = 0x0;
HWREG(FLASH_FMC) = FLASH_FMC_WRKEY | FLASH_FMC_COMT | FLASH_FMC_WRITE;
while(HWREG(FLASH_FMC) & FLASH_FMC_COMT)
{
}
HWREG(FLASH_FMA) = 0x16;
HWREG(FLASH_FMPRE11) = 0x0;
HWREG(FLASH_FMC) = FLASH_FMC_WRKEY | FLASH_FMC_COMT | FLASH_FMC_WRITE;
while(HWREG(FLASH_FMC) & FLASH_FMC_COMT)
{
}
HWREG(FLASH_FMA) = 0x18;
HWREG(FLASH_FMPRE12) = 0x0;
HWREG(FLASH_FMC) = FLASH_FMC_WRKEY | FLASH_FMC_COMT | FLASH_FMC_WRITE;
while(HWREG(FLASH_FMC) & FLASH_FMC_COMT)
{
}
HWREG(FLASH_FMA) = 0x1a;
HWREG(FLASH_FMPRE13) = 0x0;
HWREG(FLASH_FMC) = FLASH_FMC_WRKEY | FLASH_FMC_COMT | FLASH_FMC_WRITE;
while(HWREG(FLASH_FMC) & FLASH_FMC_COMT)
{
}
HWREG(FLASH_FMA) = 0x1c;
HWREG(FLASH_FMPRE14) = 0x0;
HWREG(FLASH_FMC) = FLASH_FMC_WRKEY | FLASH_FMC_COMT | FLASH_FMC_WRITE;
while(HWREG(FLASH_FMC) & FLASH_FMC_COMT)
{
}
HWREG(FLASH_FMA) = 0x1e;
HWREG(FLASH_FMPRE15) = 0x0;
HWREG(FLASH_FMC) = FLASH_FMC_WRKEY | FLASH_FMC_COMT | FLASH_FMC_WRITE;
您好、
我想再次与您确认、在 TM4C1290NCPDT 芯片的编程过程中无法设置 FMPRE8-15 寄存器。 是这样吗?
[引述 userid=“670216" url="“ url="~“~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1563903/tm4c1290ncpdt-read-write-protect-burn-failure/6026246
FMPRE1 为 0x00000000、FMPPE1 为 0xFFFFFFFF、对芯片没有影响。 但是、FMPRE0 为 0x00000000、FMPPE0 为 0x00000000、但芯片仍受影响。 因此、这不应是原因。
[/报价]
您好、
您能帮助分析此问题的原因吗? 如果 FMPRE0 为 0x00000000、则当通过 SWD 接口连接时、芯片无法发送启用暂停的命令。
您好 Xin、
很抱歉,因为我离开办公室,因为星期三只是回来了。
我想再次与您确认、在 TM4C1290NCPDT 芯片的编程过程中无法设置 FMPRE8-15 寄存器。 正确吗?
没错。 您需要在应用程序中复位后重新提交寄存器。
您能帮助分析此问题的原因吗? 如果 FMPRE0 为 0x00000000、则当通过 SWD 接口连接时、芯片无法发送启用暂停的命令。
半启用命令是什么意思?
当您使用 0 对 FPPRE0 进行编程时、这意味着您禁用对闪存前 64KB 的读取访问。 调试器无法读取闪存。 [/报价]您的理解不正确。 我说“发送命令停止内核并启用调试失败“、而不是“读取失败“。
在 TM4C1290NCPDT、TM4E129BNCZAD 和 TM4C1294KCPDT 芯片中将 0x00 写入 FPPRE0 后、发送停止内核并启用调试失败的命令。 将 0x00 写入 FPPRE1-7 不会导致此问题。 请帮助分析原因。 谢谢!
您好、
将 0xA05F0003 写入 0xE000EDF0 的命令、启用调试并请求内核停止、发送失败。
您能告诉我谁在写入 0xE000EDF0 吗? 这是 Cortex-M4F 处理器中的调试停止控制和状态寄存器。 通常、这由调试器写入。 您使用哪种调试器? 是否恰好打开 Memory Browser? 如果您打开了 Memory Browser、则调试器将读取闪存内容
如果您使用 CCS、则需要咨询我们的工具链专家、了解调试器如何写入调试停止寄存器、以及是否涉及任何读取操作、可能是它读取第一个 64KB 的闪存。

您能告诉我谁是 0xE000EDF0 的写入者吗? 这是 Cortex-M4F 处理器中的调试停止控制和状态寄存器。 通常、这由调试器写入。 您使用哪种调试器? 是否恰好打开 Memory Browser? 如果您打开了 Memory Browser、则调试器将读取闪存内容
我们使用类似于 J-link 的工具和与 Keil 类似的方法对芯片进行编程、然后遇到了此问题。 您能否使用 J-link 验证此问题?