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:USB-Stick 更新问题

Guru**** 2446680 points
Other Parts Discussed in Thread: EK-TM4C1294XL

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/619053/tm4c1294ncpdt-usb-stick-update-issue

器件型号:TM4C1294NCPDT
Thread 中讨论的其他器件:EK-TM4C1294XL

你好。 我不熟悉 TM4C1294xl Launchpad、我正在尝试使用示例代码。 我目前一直停留在 USB_stick_update 示例中。 我已更改中的代码以根据我的需求工作。 我的代码会不断检查是否有切换按压,如果检测到该按压,则会跳转到 Updateermain()函数,然后从该函  数跳转到 ConfigureUSBInterface()函数,再跳转到 UpdateerUSB()函数。 直到这里代码工作正常、然后它不断检查是否有 USB 记忆棒被插入。  

我的问题是,我要按照下列正确步骤行事。

首先、我将复制画笔驱动器中的二进制文件、其中包含代码中定义的正确名称。

其次,我将下载 Launchpad 内已修改的 USB_stick_update 代码,该代码可在 UpdateerUSB()函数上正常运行。

我将使用外部电源为 Launchpad 供电。 此外、跳线位于 OTG 端口。

然后、当代码位于 UpdateerUSB()函数内时、我将 OTG 挂起到 Tiva-C 的"Target USB"端口中

我没有检测到任何 USB_stick 的响应、程序只是在持续检查 USB 器件。

我是否使用了错误的 USB 设备、或者端口和跳线连接中是否存在任何逻辑错误?

我们将感谢您的任何帮助。

谢谢!  

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

    您说过您已根据自己的需求修改了代码。 除了更改您将要使用的.bin 文件的名称之外、您还制作了其他模板吗?

    如果是、您能否使用原始示例进行测试以确保该示例有效? 这将排除 USB 记忆棒存在问题。

    您还提到了使用外部电源为 LaunchPad 供电-这意味着什么? 您的意思是将调试端口连接到 PC 以便调试/单步执行代码,或者是否正在使用其他电源,如果是,如何验证代码是否在 UpdateerUSB()函数中?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Ralph、
    我正在使用电源引脚上的外部电源为电路板供电、并通过 LED 指示检查程序的执行流程。
    演示代码正在检查进入引导加载程序模式的3种方法。 我刚刚使用了开关按压模式、在板载 LED 的帮助下、我可以很好地看到执行流程。
    它正确到达 UpdateerUSB()函数,并持续轮询 USB。
    我的问题是将板载跳线更改为 OTG、然后将 OTG 挂起到"Target USB"端口上。 此方法是否正确?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Nishit、您好!

    OTG 的跳线用于电路板电源、因此我怀疑这是正确的选择、不过如果您的 LED 亮起、这似乎表明至少有一些代码正在运行?

    您说过您使用电源引脚提供外部电源、您的意思是什么引脚? BoosterPack 引脚? 如果是、您需要使用 BoosterPack 选择进行电源选择。 也许您可以提供有关此电源设置的更多详细信息、以便我可以尝试和复制。

    将 OTG Pendrive 连接到目标 USB 端口是读取 USB 数据的正确方法。

    我还想再次验证您是否使用 TI 默认示例通过 USB/ICDI 正常供电来测试了 USB 记忆棒、以确保 USB 记忆棒作为基准被识别并正确地将程序加载到您的 LaunchPad。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我尝试了默认的 USB_host_msc 示例代码、该代码检测 USB 并通过串行终端进行通信。 它工作正常。 控制器能够检测到 Target_USB 端口上的 USB 记忆棒。

    现在、当我下载 USB_stick_update 代码时、它不会检测到 USB。

    我无法粘贴整个代码、因为示例代码非常大。 我正在发布我在代码中所做的更新。

    INT 条件= 0;
    while (condition =0)//这将持续检查 Switch1按压操作

    if (ROM_GPIOPinRead (GPIO_PORTJ_BASE、GPIO_PIN_0)=0)

    UpdateerMain();
    条件= 1;


    //
    //如果我们到达这里,这意味着没有应该出现的任何情况
    //原因更新为 true。 因此、调用应用程序。
    //
    CallApplication (APP_START_ADDRESS);

    这是我所做的唯一更改。 在开关后,按 UpdateerMain()被调用,在该配置中,ConfigureUSBInterface()被调用,最后是 UpdateerUSB()。

    无效
    UpdateerUSB (空)

    //
    //循环永久、运行 USB 主机驱动程序。
    //
    while (1)

    USBHCDMain();

    //
    //检查 USB 驱动程序的状态变化。
    //
    switch (g_Estate)

    //示例代码的其余部分

    它不检测进入开关内部所需的状态变化。

    USB 或 OTG 电缆中没有任何连接错误或故障的问题、因为 USB_host_msc 示例工作正常。

    请帮助... 谢谢你。

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

    我测试了将该条件 while 循环添加到 USB_stick_update 示例的按钮按压评估中、没有问题。

    我在本演示中采取的步骤是:

    1)编译 USB_stick_demo
    2) 2)从示例(USB_stick_demo.bin)中获取.bin、并根据 USB_stick_update 的预期重命名该.bin (默认为 firmware.bin)
    3) 3)将 FIRMWARE.bin 加载到 USB 闪存驱动器上
    4) 4)使用 USB_stick_update 示例代码刷写 EK-TM4C1294XL LaunchPad (我通过对按钮进行条件检查来执行此操作)
    5) 5)上拉 UART 终端并重启 LaunchPad
    6) 6)将 USB 闪存驱动器插入目标 USB 端口
    7) 7)按照提示按 SW1按钮、为我加载新固件而不会出现问题
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    ***类似***

    绝对"清晰"-列出清晰、有序的步骤-确保海报(和后续读者)成功。

    "基于段落"的叙述虽然有时很有帮助、但无法与您的顺序列表的精确度相媲美-做得好!

    BTW -海报的问题描述非常好-但他的"主题行:TM4C:TM4C "非常糟糕-不会/零地激励(任何人)打开。   他是否不应(以官方的方式)得到这样的建议?   (最近(不想要的)引发的另一个恐怖事件声称是"论坛升级"。   (不!)

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

    我启动了一个新代码。 我的目标是、我应该能够通过我正在执行的 USB_stick_update 代码加载 blinky.bin 文件。
    我启动了一个新项目并按照您提到的步骤进行操作。

    现在,当我放置断点并执行一些步进时,我发现执行会进入开关中的 else 部分,这意味着执行 ReadAppAndProgram()例程时没有任何错误。

    在 else 部分中有一条软件复位语句。 那么、我的问题是、我如何将上传的代码称为闪烁代码、这是从现在开始加载的代码? 我要做的是可行/可实现的事情,还是需要对地址进行更改?

    此致、

    Nishit。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很抱歉、CB1_MOBILE。 这是我在这个论坛上的第一个帖子。 我将在以后考虑这些因素。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我的朋友-不需要"悲伤"。   您对您的问题描述得相当好-但请务必承认您所制作的主题行-完全没有引起他人的兴趣-它会"不遗余力"销售您的帖子!   (此类销售吸引了最合格或最感兴趣的人员和/或最近遇到您(确切)问题的人员。 (笑声) 即那些"最想"阅读并对您的帖子做出反应的人!)

    "主题行"是可编辑的-您可以将其更改为"USB-Stick-Update Issue"-这会更好地传达您的主题...

    [编辑] CST 07:40 -现在你已经"完成了"-这个帖子变得更加明显-对他人来说-很有趣-很好!

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

    Nishit、您好!

    默认情况下、我不认为 Blinky 会执行您希望它执行的操作。

    此处需要记住的几件事:

    1) 1) USB_stick_demo 示例是 SWR1按钮按压的来源、根据示例注释:

    //! 此程序只会在屏幕上显示一条消息并提示用户
    //! 按 USR_SW1按钮。 按下按钮后、控制就会通过
    //! 返回到仍然是闪存的 USB_stick_update 程序、它将是闪存
    //! 尝试从记忆棒加载另一个程序。 这显示了如何操作
    //! 用户应用程序可以强制从记忆棒进行新固件更新。

    2) 2)要使用 USB_stick_update、必须满足以下要求:

    //! 当此应用程序尝试执行更新时、它将等待
    //! USB 记忆棒的 USB 记忆棒。 一个 USB 记忆棒
    //! 它将在根目录中搜索特定的文件名
    //! 默认为\e firmware.bin。 该文件必须是的二进制映像
    //! 要加载的程序(.bin 文件)、链接为从正确位置运行
    //! 地址、位于\b APP_START_ADDRESS。

    关于第2点、此要求修改了闪烁示例(blinky_ccs.cmd)的.cmd 文件。

    您需要更换

    #define APP_BASE 0x00000000 

    使用

    #define APP_BASE 0x00008000 

    此外、您需要确保将 blinky.bin 重命名为 firmware.bin、或按如下方式更新 USB_update_filename:

    #define USB_update_filename "Blinky bin" 

    进行这些更改后、我可以将闪烁示例添加到闪存中、但它不是基于 USB_stick_demo 示例中的按钮按压操作。

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

    您好 Ralph、

    我在其他帖子中看到了这个问题、并发现了这个部分。 也感谢您的详细解释。

    我也做了同样的事情。 我更改了 blinky_ccs.cmd、并将 app_BASE 更改为0x00008000。 然后、我构建了项目并取出 bin 文件、将其粘贴到 USB 记忆棒上、对名称进行了适当的更改并执行了代码。

    我还在调试窗口中检查了 Tiva-C 中这些闪存位置的 bin 文件的内容

    现在我做了一个小的更改,而不是进行软件复位,而是调用了 CallApplication()函数。 我假设现在执行将从0x00008000开始、Blinky 将执行。

    但它显示了未在0x86b6上预设源代码的错误。 当我将 APP_BASE 保持为0x00009000时、内存位置0x96b6也出现此错误。 我不想将这里的问题与之关联起来。 在我使用 bin 文件和调试中的 MEMORY 部分验证的位置存在适当的代码。 此外,在出错之前,PC 指向该地址,这意味着 CallApplication()函数将一直执行到该点。  

    此外、在 Launchpad 上、LED 亮起、然后由于错误"未找到源代码"而停止执行、并且保持亮起状态。  

    此致、  

    Nishit。

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

    Nishit、您好!

    [引用用户="Nishit"]

    现在我做了一个小的更改,而不是进行软件复位,而是调用了 CallApplication()函数。

    [/报价]

    我想您的前面跳得太多了。 首先让我们在进行任何修改之前为您完成此工作。 一旦我们确认您可以使用 USB_stick_update 上传闪烁项目而无需修改、那么我们就可以考虑启用您所需的功能。 请让我们一次执行一个步骤、否则、对于问题源而言、我们可能会有太多问题、无法建设性地调试我们的示例并为您提供指导。

    您能否尝试以下操作:

    1) 1)根据 TivaWare 使用 USB_stick_update、但不更改任何内容  

    #define USB_update_filename "Blinky bin" 

    2) 2)使用带我在上面突出显示的更改的 blinky 项目、为应用程序基址为0x00008000的 USB 记忆棒重新创建一个新的.bin 文件。

    3) 3)验证此项目在没有断点的情况下运行时、是否会加载闪烁项目?

    • 注意:如果进行调试、则必须让代码到达 ResetISR、然后从那里恢复、以使加载变得闪烁。 如果您断开与调试器的连接、那么每次按下重置按钮时、闪烁项目都将重新加载(您可以通过按住重置来观察闪烁停止来看到这一点)

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

    [引用用户="Ralph Jacobi"]……您的前面跳得太多了。   首先让我们进行任何修改之前为您完成此工作。   一旦我们确认您可以使用 USB_stick_update 上传闪烁项目而无需修改、那么我们就可以考虑启用您所需的功能。   请让我们一次执行一个步骤、否则我们可能会遇到太多问题[/报价]

    或者-用一个词说-使用"kiss!"   这里禁止 "吻"与最近禁止 "类似"同样有意义-两者都导致了巨大且持续的低效!  

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

    您好 Ralph、

    我再次尝试创建一个新项目、然后在这些文件中进行了必要的修改(cmd)、现在示例代码和修改后的代码都正常工作。 现在、要编程的新文件将在0x00008000处刷写、并且闪烁灯正在工作。 现在、我要做的更改如下。 您能告诉我这是不是可能的吗?

    假设我有一个从内存位置0x00加载到0x00003000的演示程序、并且我希望在远离演示应用程序代码的任何位置(例如0x00008000)出现 USB_Stick 更新代码。 在任何给定的时间、我希望演示代码运行、当我按下按钮时、它会进入 ISR、然后作为例程执行 USB_stick_update 代码、并在该演示代码的顶部闪存一个 bin 文件、而不会影响0x00008000 IE 的代码 USB_stick_update 例程。  

    我的问题是如何在单独的存储器位置写入演示代码和 USB_stick_upadate 代码、因为我到目前为止已经注意到、每次闪存任何程序时、代码都会按顺序加载到闪存中。 我想实现的目标是可行的还是不可行的? 如果不是、那么您是否可以建议使用其他资源丰富的方法来实现这种情况?  

    此致、  

    Nishit。

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

    原则上、我认为这应该可以、但我想我的主要问题是、为什么您不希望引导加载程序位于0x0000? 这是一个很好的位置、因为您将知道它有多大、然后可以为您的应用映射它上面的存储器。 否则、如果将引导加载程序放置在0x8000、如果应用突然是0x10000字节的闪存、会发生什么情况? 然后会破坏引导加载程序。

    无论如何、除此之外、我确实做了一些快速测试来修改.cmd 文件、但当它位于非0x0000的 app_base 时、它看起来像是 USB_stick_update 示例不起作用。 我还没有弄清楚导致这种情况的原因(如果有其他设置、或者器件不支持闪存引导加载程序的非0x0000位置)。 doc 文件夹中包含名为 SW-TM4C-BOOTLDR-UG-2.1.4.178.pdf 的 TivaWare 的完整引导加载程序指南。 您现在可能需要尝试阅读此内容。

    我计划很快再研究 USB_stick_update 示例、但在此期间、您或许可以在我自己有时间深入研究之前在用户指南中发现答案。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Ralph、

    是的、我还尝试将 APP_BASE 更改为0x00007000和0x00006000、并且 USB_stick_update 在该位置不起作用。 要使其正常工作、最少的内存位置应为0x00008000。 我想知道这背后的原因是什么。 是的、我考虑了这个问题(闪存应用程序大小与 Stick_update 进行了散列)。 一种解决方案是了解引导加载程序代码的大小、然后将其保存在存储器中非常远的位置。 无论如何、感谢您提供的所有支持。 我通过尝试这个示例学习了很多概念。

    我还将再次参考引导加载程序文档。 如果您找到该 Stick_update 问题(app_BASE)的答案、请告知我、因为我想知道原因。 我还将尝试计算这个东西。

    谢谢你。

    此致、

    Nishit。