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.

[参考译文] TM4C1294NCPDT:通过 sflash 在 Tiva TM4C1294NCPDT 控制器上引导加载程序不起作用

Guru**** 2538930 points
Other Parts Discussed in Thread: TM4C1294NCPDT, EK-TM4C129EXL, UNIFLASH, EK-TM4C1294XL, EK-TM4C123GXL

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/852072/tm4c1294ncpdt-rom-bootloader-on-tiva-tm4c1294ncpdt-controller-over-sflash-does-not-work

器件型号:TM4C1294NCPDT
主题中讨论的其他器件: UNIFLASHEK-TM4C129EXLEK-TM4C1294XLEK-TM4C123GXL

我在定制板上使用 Tiva TM4C1294NCPDT 控制器。 我已将 UART0连接到嵌入式 Linux 板的 UART。 在正常的操作系统操作期间,我可以通过调用  ROM_UpdateUART()来调用 ROM 引导加载程序,以使用 sflash 实用程序更新固件。 只要我的器件上已有某些固件、该方法就可以正常工作。  

我想使用 sflash 对原始设备进行编程。 为了测试这一点、我擦除闪存并通过 JTAG 确认0x0和0x4位置读取0xFFF_FFFF、并且 BOOTCFG 寄存器为0xFFF_FFFE。 在空白器件上、我希望器件保持在 ROM 引导加载程序中、以通过 UART 查找数据包。 但是、当我运行 sflash 时、我会得到"擦除"芯片消息、之后什么也没有。  

我还注意到,当使用 ROM_UpdateUART()调用引导加载程序时,如果固件更新中断并重新启动,设备将恢复固件更新并成功继续。 但是、如果中断后重启电源、则更新不会恢复。 症状与空白芯片盒中上述故障模式相似。 gurus 能否确认 ROM 引导加载程序和 sflash 组合是否能够抵抗电源中断? ROM 引导加载程序是否在更新结束时或之前写入0x0和0x4位置?

此外、对于器件为空时闪存和 ROM 引导加载程序为何不起作用有任何想法? 如何调试 ROM 引导加载程序?

提前感谢您投入宝贵的时间和投入、

Rajah

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

    您好 Rajah、

     运行 sflash 并收到"擦除"芯片消息后、是否有机会使用 JTAG 进行连接并查看实际发生了什么情况? 这意味着您在闪存中看到的是完全编程还是部分编程的内容? 您还可以在 LaunchPad 上尝试一下吗? 您会看到任何不同的结果吗? 我目前没有 Launchpad。 明天我也会尝试一下。

     关于引导加载中间的下电上电、我怀疑闪存已部分编程。 当您再次上电时、ROM 引导加载程序会看到具有非 F 值的0x0和0x4、而不知道引导加载中断。 如果您的引导加载过程可能会发生功率损耗、我建议您使用基于闪存的引导加载程序。 可以启用基于闪存的引导加载程序以包含校验和。 如果应用程序存在、则不仅会检查0x0和0x4、还会在引导加载后检查固件映像的 CRC。 如果 CRC 不正确、固件更新将再次挂起。  

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

    感谢 Charles 的输入。 我将检查 JTAG 并告知您。 对于电源中断情况、我刚才假设最后对0x0和0x4位置进行编程(在固件更新结束时)。 但是、根据您告诉我的情况、情况似乎并非如此。 我希望像您这样的 gurus 确认这一点。  

    从长远来看、我希望更多地使用基于闪存的引导加载程序、其中包含 CRC 和硬件引脚以强制引导。

    对于空白芯片编程、我正确地假设空白器件将通过 UART 侦听固件数据包、就在 ROM 引导加载程序上、对吧? 我想在生产中使用此选项(对于 eaxample 加载闪存引导加载程序)。

    谢谢、

    Rajah

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

    您好 Rajah、

     您的理解是正确的。 如果闪存为空、则 ROM 引导加载程序将通过 UART 侦听固件数据包。  

     另请查看以下文章、其中说明了 ROM 引导加载程序将侦听 firmware 更新包的不同通信接口的顺序。  

    https://e2e.ti.com/support/microcontrollers/other/f/908/t/621470?TM4C129-ROM-Bootloader

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

    您好 Rajah 和 Charles。  

    Rajah、正如 Charles 可能验证的那样、过去我也遇到过类似的问题、因此我决定基于 Tiva 库构建自己的引导加载程序、而忽略 ROM 引导加载程序。 我所做的是、对于每个新制造的板、在板上安装 TM4C1294NCPDT 并加载我的引导加载程序、使用 UNITFlash over JTAG。 因此、下次引导后、电路板将等待接收固件数据以加载到闪存中、在我的示例中为0x8000、我选择从引导加载程序固件内部的任何接口加载该数据。 但引导加载程序本身在引导时以及开始等待之前、会在您选择的 EEPROM 地址检查 FF 或0x0或0x1。 如果发现0xFF 或0x0、则进入等待模式并等待新固件。 加载新固件后、引导加载程序会转到该 EEPROM 地址并写入"1"、然后导致重新引导。 现在、电路板引导和引导加载程序在 EEPROM 检查地址处查找"1"、直接跳转到0x8000处的主固件引导。 [ Snowflake 链接文件中的链接器文件 RAM 地址和 固件主体中的 RAM 地址需要写入0x8000而不是0x0004/0x0000。 对于引导加载程序固件和主固件位置的地址空间使用情况、您可以随意进行谨慎操作]  

    然后、只要您需要更新新固件、您只需使用主运行固件内部的命令或 也从主固件内部检查的引脚使用情况、在特定 EEPROM 地址写入"0"、 下次引导后、您的电路板将再次进入引导加载程序固件更新等待模式。

    我希望这能有所帮助。 祝你好运、

    John

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

    尊敬的 John:

     感谢您为 OP 提供额外的想法。  

    您好 Rajah、

     我同时运行 sflash 和 LM flash 编程器、我看到如果闪存未被首先擦除、ROM 引导加载程序将不会继续。 我认为原因是 ROM 引导加载程序正在检查0x0和0x4是否是非 F 如果0x0处已经存在一个应用程序、那么它将只运行该应用程序。

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

    感谢您的意见 John。 我有一个可以与我的产品一起使用的引导加载程序。 我的产品具有嵌入式 Linux 微控制器和 Tiva 芯片。 我想使用嵌入式 Linux 首次使用 ROM 引导加载程序对我的引导和操作系统进行编程。 第一次之后、我可以在闪存中使用我的引导加载程序。 当产品完全组装时、芯片的编程将在 EOL 测试之前进行。 到达 JTAG 端口将非常困难。 我们还希望在开始生产后远程访问 JTAG 接头。 在制造中添加人员以进行连接和编程也会增加成本。 我刚才假设 ROM 中的引导加载程序工作正常。 如果 ROM 引导加载程序不起作用、我们必须更改生产工作流程以使用 JTAG。

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

    您好、Charles、

    我拥有 EK-TM4C129EXL Rev A 板、并使用 LM 闪存擦除芯片。 一旦芯片被擦除、我对电路板上电并尝试使用 sflash 将操作系统编程到闪存中。 我已将 USB 转串行适配器连接到 UART0 Tx 和 Rx 并将其连接到电路板(PA0和 PA1、试验板连接器上的引脚编号74和76、 http://www.ti.com/lit/ml/spmz862/spmz862.pdf、第19页表2-4)。 我使用 Uniflash 编程器擦除我的芯片、并将其空白部分选中。 然后、我对电路板进行下电上电并尝试运行 sflash。

    /sflash my.bin -d -b 9600 -p 0x0 -r 0x0 -c /dev/tty.usbserial

    我将示波器探针连接到 PA0和 PA1。 我可以看到串行线路 PA0上发送了两个字节、但我在 PA1上看不到任何内容。

    我在闪存源代码中添加了一些打印内容、并看到我没有从 MCU 获得 ACK。 因此、芯片看起来不在引导 ROM 中、或者引导 ROM 未检测到发送的字节。

    @Charles、是否有任何方法可以判断器件是位于 ROM 引导加载程序中还是位于任何 GPIO 引脚中、我可以探测这些引脚以获取有关 BootROM 状态机的详细信息?

    谢谢、

    Rajah

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

    您好 Rajah、

     是否可以尝试移除-d 开关并查看它是否会产生影响?

     此帖子提供了一些更多详细信息。  

    https://e2e.ti.com/support/microcontrollers/other/f/908/p/760322/2809102?tisearch=e2e-sitesearch&keymatch=disable%20auto%20baud%20support#2809102

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

    您好、Charles、感谢您的快速回答。 当我不包含-d 选项时、我看不到在范围上发送的任何数据包。 该命令会尝试一段时间、并显示一条失败消息(无法与电路板同步。)。 如果包含-d 命令、我可以在 Tx 线路上看到数据包。 实际上,当我使用 ROM_UpadateUART() API 来引导加载时,我使用相同的命令(使用-d 选项),所有命令都可以正常工作。  

    有没有人告诉我们我们是否在 ROM 引导加载程序中?

    谢谢、

    Rajah

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

    您好 Rajah、

     我会从您那里得到相反的结果。 请参见下图。 在调用 sflash 之前、我的闪存被完全擦除。 如果没有-d、它将进行编程、但使用-d、它将失败。 我在 Windows 机器上运行。 我不确定您是否修改了 sflash 源代码。 您是否有一台 Windows 计算机可以尝试调用现有的 bin/sflash.exe。 如果没有-d、则意味着它将启用自动波特率。 这使得 MCU 能够从主机中找出波特率时钟频率。 使用-d,您可以禁用自动波特率检测。 您可以将9600指定为波特率时钟。 但是、我认为 MCU 的默认波特率时钟不是9600。 我倾向于认为它是115200、尽管我不确定。 如果您想包含-d、请尝试115200并查看是否获得不同的结果。  

    当 MCU 仍在引导运行 ROM 代码时、很难了解 MCU。 没有 GPIO 信号或任何指示信号。  

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

    您好、Charles、感谢您花时间在您的最后尝试一下 我找到了一台 Windows 计算机、并尝试了屏幕截图中上面的命令。 在本例中、唯一的区别是 COM 端口、我在 COM15上。 如果没有-d 选项、则在命令之后看不到任何输出。 使用-d 选项时、在 Erasing 闪存消息之后、我在大约一分钟的尝试后收到"发送下载命令失败"。 我甚至有相同版本的 Tivaware。 对于 EK-TM4C129电路板、您能否确认引脚74和76是要在试验电路板连接器上使用的引脚?

    谢谢、
    Rajah

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

    您好 Rajah、

     您是否有其他 EK-TM4C1294XL 电路板可供尝试、或者您是否只有一个 Launchpad? 我在另一个 Launchpad 上尝试过、结果相同。 我只有两个 EK-TM4C1294XL 电路板。 我甚至在 EK-TM4C123GXL 板上尝试过、它也仅在没有-d 的情况下进行编程 我认为启用自动波特率是有道理的。 ROM 引导加载程序无法知道主机将使用的波特率。 当主机启用自动波特率时、它将首先发送一些0x5或0xA 脉冲序列。 这些时钟脉冲使得 ROM 引导加载程序能够确定正确的波特率来配置其 UART。 尽管如此、我不明白为什么您的电路板不像我的电路板那样工作。 我希望您还有其他板可以尝试。 如果您有其他板、并且它们始终表现出与第一个板相同的行为、那么我可以花更多的时间并与我的同事进行讨论。 遗憾的是、我的另外两位支持 TM4C 的同事目前都不在办公室。 下周之前、我无法挑选他们的大脑。  

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

    您好 Rajah、

     分线板上的引脚74和76是 PA0和 PA1、因此它们是正确的探针。 在查看原理图时、我会看到此注释。 我想知道您以前是否更改了跳线设置。 请恢复到原始跳线位置。  

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

    我只有 EK-TM4C1294XL 板、我没有 Launch Pad。

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

    让我检查一下跳线并返回给您。

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

    EK-TM4C1294XL 是 Launchpad。  

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

    您好、Charles、感谢您的投入和时间。 我检查了跳线、它们也很好。 我最终将问题缩小到了我使用的 USB-UART 软件狗。 我无法解释原因、但在显示用于运行代码的调试消息时似乎可以正常工作、但在使用进行引导加载时似乎不起作用。 如果我不得不猜测、问题可能仅与 UART 上的 Tx 到 USB 断开相关(因为 Rx 适用于调试消息)。 我将软件狗更改为我曾经使用过的另一个型号/品牌、它在第一次尝试时就能正常工作。 非常感谢你的帮助。 我在使用 ROM 引导加载程序时必须删除-d 选项。 此后、我将闪存引导加载程序移植到了应用程序、以实现更多控制。 现在、我已设置为使用 ROM 引导加载程序在制造过程中加载闪存引导加载程序、然后我可以使用闪存引导加载程序更新代码。