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.

[参考译文] TM4C123BH6ZRB:在读取 Intel hex 文件时、Uniflash 不会对前1KB 闪存进行编程

Guru**** 2585275 points
Other Parts Discussed in Thread: UNIFLASH

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1125983/tm4c123bh6zrb-uniflash-doesn-t-program-the-first-1kb-of-flash-memory-when-reading-intel-hex-file

器件型号:TM4C123BH6ZRB
主题中讨论的其他器件:UNIFLASHCCStudio

你好

我有一个最小的程序、适合第一个 KB。 hex-tools 输出会生成 Intel hex 文件。 应加载 Uniflash。

但是、.hex 文件不会被写入、从0x00到0x400的存储器区域保持被清除(0xff)。

如果我尝试使用.out 文件、它会起作用。 如果我尝试使用更大的.hex 文件(合并多个十六进制文件、0x400之后的区域是 written.e2e.ti.com/.../0640.uniflash_5F00_gui_5F00_debug_5F00_log.txt

 选择 verbose 时、控制台输出也不显示警告或错误。

我使用 Blackhawk 提供的 XDS200调试探针(USB)。

感谢你的任何帮助

此致

Lothar

e2e.ti.com/.../7823.ds.log

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

    我刚刚下载了 Uniflash、因此拥有最新版本(8.0.0.4026)。

    巧合的是、我找到了一个旧版本(7.0.0.3615)。 使用这个、一切都很好。

    因此、它似乎在中间的某个位置发生了 uniflash 中断。

    不能真正解决我的问题、但目前还不错。

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

    Lothar、

    我会尝试一下。  我应该能够快速重现这一点、然后将测试案例汇总在一起、以便我们的 UniFlash 团队查看。  诀窍是找到 TM4C123G 板。  我在某个地方有一个。  我创建了程序和.hex、只需找到一个板即可进行测试。

    此致、

    John

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

    Lothar、

    我发现了一个 LM4F120电路板、似乎让我加载小型 TM4C123G 程序。

    使用 UniFlash、我可以加载.out 和原始二进制.bin。  低地址正在被编程正常。

    对于十六进制文件、您能否向我发送要传递给 armhex 的选项?  我想确认我是以相同的方式生成的。

    此致、

    John

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

    尊敬的 John:

    感谢您的努力。 该实用程序设置如下:








    ROM 和 mem 宽度主要设置为8 (有一个非常奇怪的默认值、导致输出拆分为4个十六进制文件)。

    我附加了十六进制文件、无法通过 uniflash 对其进行编程。 抱歉、"附加功能不起作用"、我只需粘贴即可:

    :20000000000200205D02000063020000630200006302000063020000630200000000000066
    :2000200000000000000000000000000063020000630200000000000063020000630200002C
    :20004000454A40F60121D16042F8080C4348106010688008FCD25068014214BF4FF0FF3035
    :2000600000207047F8B517463B4A844642F2016E02F1180040F80CECD7B1384B5B1E21F0DD
    :200080007F0440F8204C06E05CF8044B02F1F805091D3F1FAC5111F07C0601D105690DB9B6
    :2000A000002FF1D1036004686408FCD2002FE6D150F8140C1EEA000F14BF4FF0FF30002080
    :2000C000F8BDF0B5264D2949A8688D442549814210D12868B0F5806F0CD9296828686A68F2
    :2000E000121A4FF4806000F0A7F888B94FF47F30FFF7A6FF1C494FF4806000240860D4F874
    :20010000000480F30888D4F80404804720461FE02E684FF480676868B042DED96C68A41B0C
    :20012000B4F5806F88BF4FF4806431466846E41C24F00304224600F01BF83846FFF780FF1B
    :20014000394668462246FFF78DFF36193F19E2E7064949428D44F0BD08D00F40020042A4B1
    :20016000E4FF03004433221108ED00E0FCFBFFFF002A4AD05FEA000C8B071CD1830722D190
    :20018000102A08D370B4103A78C978C0103AFBD270BC103238D0042A2CD3082A05D30C2A69
    :2001A00024BF08C908C008C908C008C908C092072AD0920F22E00B780370491C401C521E34
    :2001C00022D08B07F7D1C30714D18307D8D0121F12D308C903801B0C4380001D121FF8D286
    :2001E0000AE008C903701B0A43701B0A83701B0AC370001D121FF4D2121D05D00B7803707B
    :20020000491C401C521EF9D160467047084880F308880849086840F47000086000BF00BFE8
    :2002200000F020F80020FFF74CFF012000F01CF80008002088ED00E010B50346002A08BFB4
    :2002400000200AD05B1E491E11F8014F13F8010F844201D1521EF7D1001B10BDFFF7D6BF0D
    :0C0260007047FEE70120704700BFFEE77A
    :00000001FF

    此致、

    Lothar

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

    LOther、

    好的、这是我的测试。

    首先、我擦除闪存。

    然后、我使用 UniFlash 中的"Memory"视图来读取它、并确保它为空

    接下来、我加载.out

    读取内存

    现在、我再次擦除存储器并读回它

    接下来、我加载.hex

    读取内存

    因此、对于我来说、将.hex 加载到低内存中工作正常。  请注意、我不选中文件是二进制文件的复选框、因为它不是二进制文件。

    我还生成了.bin 文件。  测试它

    擦除存储器

    选择此选项可加载.bin、选中二进制复选框并将 加载地址指定为0x0000000

    读取内存

    因此、对于我来说、我在 LM4F120上使用 UniFlash 8.0获得了.out、.hex 和.bin 的相同结果

    此致、

    John

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

    你(们)好

    感谢您提供测试结果。 同时、我卸载了 Uniflash 的两个版本并重新安装了 Uniflash 8.0。

    对我来说仍然是一样的。 但是、我测试了另外两个按预期工作的图像(.hex)。 这只是我在上一篇文章中发布的图像、不知怎么说它不会闪烁。 我开始逐个删除一行、直到它正常工作。 删除第11行至第20行后、一切都正常。 我在校验和中没有发现任何错误、即使是出于目的而写入错误的校验和、也可以正常工作。 它甚至在单独删除行号11时起作用。 因此、这条线似乎是问题的原因。

    感谢您的进一步建议

    此致、

    Lothar

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

    Lothar、

    因此、如果我将.hex 替换为您的内容、我将看到相同的内容。  加载后、存储器仍为全部 FFFFFFFF。

    尝试读回存储器时、我还会看到此错误:

    [8/15/2022、11:58:58M] [错误] Cortex_M4_0:错误:发生调试端口错误。

    真的很奇怪。

    此致、

    John

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="3175" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1125983/tm4c123bh6zrb-uniflash-doesn-t-program-the-first-1KB of flash-memory-time-readings#178027"英特尔文件

    尝试读回存储器时、我还会看到此错误:

    [8/15/2022、11:58:58M] [错误] Cortex_M4_0:错误:发生调试端口错误。

    [/报价]

    如果按照 缺陷报告和日志记录中的说明为 Uniflash 启用"Debug Server Logging"、这是否提供了有关调试端口错误原因的更多信息?

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

    你(们)好

    很高兴听到这不仅仅是我。

    如果我进行编程、然后验证我是否得到以下内容(设置为详细):

    [16.8.2022、07:26:16] [INFO_Cortex_M4_0:写入闪存@长度为0x0000026c 的地址0x00000000
    [16.8.2022、07:26:16] [INFO_Cortex_M4_0:对闪存执行整体擦除
    [16.8.2022、07:26:16] [成功]程序加载已成功完成。
    [16.8.2022、07:26:31] [错误] Cortex_M4_0:文件加载器:验证失败:地址0x00000000处的值不匹配请验证目标存储器和存储器映射。

    这是有道理的、因为存储器仍为0xff。

    我启用了"Debug Server Logging"、并在第一个帖子中添加了输出以及 GUI 日志。 文件很大、我没有发现任何明显的错误、除了百分比始终保持为0 ("Percent ":0)、而在工作示例中、百分比有时显示不同的值。

    此致

    Lothar

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

    不同 M4F 器件(本例中为 CC1352R1)上的相同.hex 工作正常。

    对于 LM4、我将 LaunchPad 与 ICDI 调试探针配合使用。  我可以在 ds.log 中看到一些其他错误、这些错误是我发送给团队查看的。

    John

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

    其他有趣的东西。  我可以在 CCSv12中加载.hex。  调试连接无错误、内存看起来正确。

    但是、在 CCS 中、如果我断开连接然后再次连接、闪存全部为 FFFF。

    如果我在 CCS 中清除此选项、那么当我断开连接并再次连接时、闪存不会被擦除:

    在较新版本的 UniFlash 中、它会在闪存后断开连接、然后进行连接。 这将擦除闪存。

    因此、切换回 UniFlash 可以使事情正常工作。

    首先、我单击右上角的"Cortex_M4_0"、然后选择保持连接:

    然后、我还清除了"Reset target during program load to Flash memory"选项

    此致、
    John

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

    好的、我们对正在发生的情况有了更多的了解。

    在 UniFlash 7.1中、有一项更改、即我们不会在程序加载后自动执行复位。

    因此、您加载十六进制文件会发生什么情况。  PC 被设置为0x0、然后当它从那里运行时、闪存被擦除。  您实际上可以在 CCS 中更好地看到这一点、因为您可以加载.hex、然后只执行 ASM 步骤、直到看到它被擦除。  为什么程序这么做不是我能回答的问题。

    但是、如果您加载.hex、然后执行内核复位、PC 会被设置为0x25C、这是擦除闪存的代码之后的值。

    因此、比我上面所说的更简单的解决方法是单击"重置选项"下方、以获取可用重置的列表。

    然后选择在程序加载后执行内核复位、因为这将确保它从0x25C 而不是0x0运行。

    此致、

    John

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

    尊敬的 John:

    非常感谢您的调查。 我测试了它、它工作正常、完美!

    那么、它基本上会写入闪存、如果不执行复位、则会立即擦除闪存?

    为什么一个图像会发生这种情况、而另一个图像不会发生这种情况?

    我实际上不知道如何在通过调试探针刷写代码的同时执行代码。 是否加载了一个程序、该程序随后会实际闪烁?

    虽然它解决了我的问题、但它在默认情况下不起作用、解决方案也不明显、这让我有点担心。

    此致

    Lothar

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

    Lothar、

    至于为什么一个图像会发生这种情况、但另一个图像不会发生这种情况、我认为触发擦除的是图像本身。

    在这两种情况下、 程序在刷写后运行、但在没有复位的情况下、它从0x0运行。  因此、一个映像中介于0x0和0x25C 之间的某个内容会导致擦除。  我假设您可以在 CCS 中加载映像、然后打开反汇编视图并将起始地址放在0x0、它将显示指令。

    此致、

    John

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

    啊、我知道、是应用程序意外地擦除自身。

    它实际上 内部有 tivaware FlashEras()函数。 从 PC=0x00开始、矢量表作为一些随机代码执行、但以某种方式它会运行到  FlashEras()函数中、然后该函数会擦除自身...

    通过复位、PC 被从矢量表中正确加载、程序正常运行、因此不会擦除自身。

    为什么默认情况下会从随机地址(0x00)运行程序?

    这是否意味着我必须使用 一些函数参数值来保护 FlashEras()函数?

    非常感谢以上指针。

    此致、

    Lothar