Embedded 当mbed CLI刷新芯片时,在后台会发生什么?

Embedded 当mbed CLI刷新芯片时,在后台会发生什么?,embedded,mbed,openocd,Embedded,Mbed,Openocd,尽管并非每个细节都与此问题相关,但我仍将列出我的设置: Nucleou_F746ZG微控制器板() 我运行mbed CLI()对芯片进行编程 我的操作系统是Windows 10,64位 为了编译代码并将二进制文件闪存到芯片中,我在cmd终端中发出以下命令: > mbed compile -t GCC_ARM -m NUCLEO_F746ZG --flash 我得到以下输出: ... +------------------+-------+-------+-------+ | Mod

尽管并非每个细节都与此问题相关,但我仍将列出我的设置:

  • Nucleou_F746ZG微控制器板()
  • 我运行mbed CLI()对芯片进行编程
  • 我的操作系统是Windows 10,64位
为了编译代码并将二进制文件闪存到芯片中,我在cmd终端中发出以下命令:

> mbed compile -t GCC_ARM -m NUCLEO_F746ZG --flash
我得到以下输出:

...

+------------------+-------+-------+-------+
| Module           | .text | .data |  .bss |
+------------------+-------+-------+-------+
| [fill]           |   130 |     4 |    10 |
| [lib]\c.a        | 24965 |  2472 |    89 |
| [lib]\gcc.a      |  3120 |     0 |     0 |
| [lib]\misc       |   252 |    16 |    28 |
| mbed-os\drivers  |   658 |     4 |   100 |
| mbed-os\features |    74 |     0 | 12556 |
| mbed-os\hal      |  2634 |     4 |    66 |
| mbed-os\platform |  2977 |     4 |   270 |
| mbed-os\rtos     | 15887 |   168 |  5989 |
| mbed-os\targets  | 16013 |     4 |  1052 |
| source\main.o    |   244 |     4 |    84 |
| Subtotals        | 66954 |  2680 | 20244 |
+------------------+-------+-------+-------+
Total Static RAM memory (data + bss): 22924 bytes
Total Flash memory (text + data): 69634 bytes

Image: .\BUILD\NUCLEO_F746ZG\GCC_ARM\nucleo_f746zg_demo.bin
[mbed] Detected "NUCLEO_F746ZG" connected to "E:" and using com port "COM10"
        1 file(s) copied.
我对最后几行特别感兴趣,芯片的实际闪烁发生在这几行:

Image: .\BUILD\NUCLEO_F746ZG\GCC_ARM\nucleo_f746zg_demo.bin
[mbed] Detected "NUCLEO_F746ZG" connected to "E:" and using com port "COM10"
        1 file(s) copied.
我从以前的经验(在mbed CLI存在之前)中知道,将二进制文件闪存到芯片上有很多事情要做。例如,我必须启动openocd,将程序员的配置文件(例如
stlink-v2-1.cfg
)和目标板的配置文件(例如
nucleof746zg.cfg
)传递给它。最后,我不得不通过Telnet会话或GDB会话将二进制文件移交给openocd。这里详细介绍了所有内容:


看着mbed CLI闪烁的芯片,我感到困惑。背景上发生了什么?mbed CLI是否秘密使用openocd连接到芯片?或者也许是pyOCD?或者其他方法?

我没有尝试所有这些方法,但第一种,当然是mbed支持的NucleoBoard,显示为虚拟拇指驱动器,您只需复制.bin文件,主机端没有真正的魔力,除了安装usb闪存驱动器的操作系统已有的软件外,不需要其他软件。这些电路板上有一个调试头,即使我所知道的电路板上没有一个管理调试部分的mcu,我称之为调试mcu,那么还有一个正在测试的mcu,或者是你买的要玩的示范mcu。mbed通常是arm,有一个swd(jtag ish)接口,调试mcu很可能使用该接口

openocd只是一个了解swd协议的工具,这并不意味着他们必须在mcu上运行openocd。您可以将自己的软件写入bit bang或与ftdi芯片对话,以使用mpsse或其他解决方案在该总线上生成swd协议转换

最简单的情况是,特定核子电路板的固件只需知道它正在编程的一个stm32,不需要知道更多,但一个swd有点通用,可能需要一个更通用的调试mcu固件

现在,这些NUCLEO和其他STM32调试MCU也使用stlink,它与固件分离,看起来像是一笔拇指驱动器交易。Stlink是一个协议,主机可以使用它来要求调试mcu做一些事情,就像mpsse是一个协议/指令集,您可以使用它来要求一些ftdi部件为您做一些事情(有点不同,但在概念上讲,一个协议可以让代理为您做一些事情)

这个mbed cli可能只是在为您复制文件,您可以自己完成。或者可能是说其他一些协议,第一个MBED基于NXP部分而不是ST,因此前端没有stlink协议。他们只是复制了二进制文件,我记得有人在博客上看到过,所以他们可能雇佣了那个人或者借用了那个开源项目

虽然mbed沙箱可能很好,但我建议您尝试其他选项,首先mbed构建二进制文件,然后复制它,然后mbed构建它,或者通过stlink打开OCD将其写入flash。ST和NXP parts传统上都有一个支持uart协议的引导加载程序,您可以尝试一下,因为如果您正在开发某个围绕这些芯片而构建的产品,或者使用这些芯片,而不是像nucleos这样的业余爱好/评估板,您很可能会使用它,或者swd,将其插入到板上的芯片中。我还建议尝试不带库的baremetal,只需阅读手册,我发现比库更容易,YMMV,ST也有至少一套自己的库,我认为他们正在向软件解决方案过渡,可能两种都尝试,或者尝试新的,因为另一种将失去支持

你也可以获得SWD规范,还有github和其他开放项目可以提供帮助,拿着你的NucleoBoard,在一个mcu上开发一个程序,与另一个mcu对话(mcu有gpio,使之成为一种简单的方式,你可以对ftdi部件进行bit bang,或者做其他不必使用mcu的事情),并尝试学习/理解该协议本身。到目前为止,所有的大脑皮层ms都在使用它

arm还推出了一种usb协议,如stlink,较新的MSP432启动板使用或支持该协议。stlink协议本身就是这样


无论如何,我通过(调试)usb偏离了nucleo,它有stlink协议,并且有I是thumb驱动器,所以mbed工具可能使用其中一种,可能是后者,因为在非st产品上可能找不到stlink。很可能调试mcu正在使用swd对开发/演示mcu进行编程,不知道它是如何进行的。

我没有全部尝试过,但第一个,当然是mbed支持的核仁板显示为虚拟拇指驱动器,您只需复制.bin文件即可,从主机端看,它没有真正的魔力,除了操作系统在安装usb闪存驱动器方面已经具备的软件之外,不需要其他软件。这些电路板上有一个调试头,即使我所知道的电路板上没有一个管理调试部分的mcu,我称之为调试mcu,那么还有一个正在测试的mcu,或者是你买的要玩的示范mcu。mbed通常是arm,有一个swd(jtag ish)接口,调试mcu很可能使用该接口

openocd只是一个了解swd协议的工具,这并不意味着他们必须在mcu上运行openocd。您可以将自己的软件写入bit bang或与ftdi芯片对话以使用mpsse