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.

[参考译文] CC2640R2L:无法启动可更新固件

Guru**** 2387060 points
Other Parts Discussed in Thread: CC2640R2L, BLE-STACK, UNIFLASH
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1048479/cc2640r2l-updateable-firmware-does-not-start

器件型号:CC2640R2L
Thread 中讨论的其他器件: BLE-STACKUNIFLASH

您好!

我提出了支持请求,但他们告诉我,我必须在这个论坛上发布我的请求。 在原始请求中、我上传了我的工作区、以确保提供任何重要信息。 在这里我不想这样做,但我试图把所有重要的东西都放在这份案文之下。 -->如果您需要更多信息,请告诉我。

为了扫描我们的其中一款产品的 BLE 信标、我们使用了 cc2640R2L。 要对固件进行编程、我从 simple_observer 示例开始、并采用 UART 协议与另一个主微控制器进行通信。 到目前为止、它运行良好、但在固件更新方面开始出现问题。

我们希望使用两个映像来实现固件更新。 1)引导加载程序映像、位于闪存的开始位置;2)上面提到的可更新程序、位于引导加载程序的后面。  
由于 simple_observer 示例出现在“堆栈库配置”中,因此 iCall-或 ble-stack 的其他闪存部分就我所知而言是不必要的。

更新映像将由主微控制器通过 UART 提供、整个更新过程将由引导加载程序管理。

为了完成此操作、我首先要做的是引导加载程序跳转到可更新的程序。 在这种情况下、uniflashtool 会刷写两个映像。 配置字节(闪存结束)
我单独刷写了。 为了查看这是否成功,我注释了大多数代码并添加了一些调试代码,这样引导加载程序就不会比通过 UART 输出“Hallo”多了几秒钟  
它应该跳转到可更新映像,而可更新映像应该不会比通过 UART 输出“Tschoe”多得多。

将引导加载程序映像刷写到地址0且更新映像地址0x8000之后、我通过将 RESET 引脚接地来重新寻址 μ µC。  
在我用来查看 UART 输出的终端中,我看到了很多“Hallo”,这表示引导加载程序正在运行,直到它跳到或应该跳转到可更新的映像为止。  
然后 UART óutput 结束、这表示可更新的映像未运行。

之后、我还使用 uniflashtool 检查闪存内容、但我无法注意到奇怪的情况。  

如果您能帮助我解决这个问题、那将会非常好。

此致!

主循环(可更新程序):

mainloop (引导加载程序):

 

e2e.ti.com/.../bootloader_5F00_command_5F00_file.txt

e2e.ti.com/.../updateable_5F00_firmware_5F00_command_5F00_file.txt

e2e.ti.com/.../updateable_5F00_firmware_5F00_config_5F00_file.txt

e2e.ti.com/.../binary_5F00_bootloader.txt

e2e.ti.com/.../binary_5F00_updateable_5F00_firmware.txt

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

    您好!

    让我确保我正确理解您的情况:

    1.您将主线程作为"bootloader"刷写、而将 mainloop 作为"updatable program"单独刷写

    2.您无法从主线程跳转到主循环,而您正尝试对 jumpToPrgEntry()进行调用。 您进入该函数调用、然后 UART 不会输出任何内容。

    如果这是准确的、我建议查看存储器中的代码、看看在分支到的0x8000地址处是否有正确的代码。  您能否在那里放置一个断点以查看是否已达到该点?

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

    你好 Nathan! 感谢你的答复。

    1)是的、我使用 TI 提供的 Uniflash 工具将引导加载程序和可更新程序分别刷写为.bin 文件。 引导加载程序 I 从地址"0"开始闪存、 可更新程序从地址0x8000开始。 它们是两个不同的项目。 为了开发可更新程序、我从简单的 obeserver 示例开始、而为了开发引导加载程序、我从 uartecho 示例开始。 在显示工作区的 IDE 屏幕截图中、您可以看到这一点、因为我保留了示例的名称。

    mainThread()是 引导加载程序的主函数(以前是 uartecho 示例)。 我也从示例中保留了这个名称"mainThread()"。 我不知道为什么它包含"...Thread"、因为正如您在屏幕截图中看到的、我采用了 no RTOS 示例。 因此、它实际上不是线程、而是可更新程序的主循环(让我们将其称为固件)位于一个线程函数"simple_observer _taskFxn ()"中、我显然也从示例中保留了该函数。

    2)我不是直接跳转到固件的主循环、而是开始(至少我正在尝试)。 但是、如果一切正常、这应该会在它的 mainloop 中结束。是的、在 jumpToPrgEntry()调用之后、UART 没有任何内容表明我们没有在它的 mainloop 中结束。 因为在这种情况下、UART 的输出是它的主循环应该无限执行的操作。

    建议) 下面是0x8000及其周围的存储器的屏幕截图。

    至少有一些东西。 对我来说、这是很难说的。 据我所知、无法在该处添加断点、因为无法在 IDE 中调试类似这样的固件更新(在我的情况下为 CCS)、 但是、我以前在 IDE 中以调试模式单独测试了两个映像、并且它们实现了预期的效果。

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

    此外、这里是 UART 输出。 我认为这表示已达到函数调用。

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

    此外、我必须说这一点

    也不起作用、因为它会导致该 UART 输出

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

    Daniel、您好!

    您是否可能初始化 UART 两次? 进入引导加载程序并进入应用程序? 这可能是问题的根源。 此外、如果您按照 此处 OAD SimpleLink Academy 实验第4节中的步骤操作、则可以调试代码。

    如果您能够使用这些工具/提示进行进一步调试、请告诉我。 如果您可以让调试器工作、我认为这应该会变得更加清晰。

    最棒的

    不需要

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

    您好、Nathan、感谢您的技巧。 我不知道这是可能的、我认为这会非常有用。 当我这么做是因为我在"jumpToPrgEntry (uint32_t prgEntry)"函数中放置了一个断点。 到达后、我进入函数   

    通过单步执行、我单步执行到该函数的最后一行、即实际跳转。

    然后、我执行了另一个单步执行、 最后 显示了该屏幕。

    当我单击"View Disassambly"按钮时、我会看到这个屏幕。

    之后、我不再能够通过断点跟踪程序。 我之前在其他项目中看到过这种行为、例如与运行时错误(例如、在不存在的数组索引上写入)结合使用。 简而言之、我会说 这意味着程序此时崩溃、但老实说、我无法更准确地说这意味着什么。 也许你可以告诉我它到底意味着什么,也许你甚至可以说这个更安全的巨人意味着什么。 但我认为在这种情况下、两次初始化 UART 不可能成为问题、因为我认为崩溃在跳转后直接出现、但从现在开始、我只初始化一次、以避免出现另一个问题。

    TYI:与我尝试跳转到地址0之前的最新测试类似、因为我希望引导加载程序映像内部的跳转比从一个映像跳转到另一个映像更容易实现。

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

    Daniel、您好!

    [引用 userid="502824" URL"~/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1048479/cc2640r2l-updateable-firmware-does-not-start/3883317 #3883317">您可能可以告诉我它的确切含义、甚至可以说这种 assambler gibberish 的含义。 [/报价]

    据我了解、故障 ISR 向我指示您跳转到无效位置。  

    [引用 userid="502824" URL"~/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1048479/cc2640r2l-updateable-firmware-does-not-start/3883317 #3883317"]与我尝试跳转到地址0之前的最新测试类似,因为我希望引导加载程序映像内部的跳转比从一个映像跳转到另一个映像更容易实现。

    这是否起作用? 或者您是否遇到相同的故障?

    我建议您尝试在发送给我的反汇编窗格中查找您要访问的代码、并进行检查以确保其与您的预期一致。 您还可以查阅工程的.map 文件以查看存储器内容、并确保跳转到预期的位置。

    最棒的

    不需要

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

    像这样跳转:

    asm ("MOV R0、#0x1234");//更改地址
    asm ("LDR R1、[R0、#0x4]");
    asm ("LDR SP、[R0、#0x0]);
    asm ("BX R1");

    您只需将地址更改为目标固件即可。 JumpToPrgEntry 已损坏。