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

What happens on the background when mbed CLI flashes the chip?

虽然不是每个细节都与这个问题相关,但我还是会列出我的设置:

为了编译我的代码并将二进制文件闪存到芯片,我在我的 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)和目标板的配置文件(例如nucleo_f746zg.cfg)传递给它。最后,我不得不通过 Telnet 会话或 GDB 会话将二进制文件移交给 openocd。此处对所有内容进行了广泛描述:

看着 mbed CLI 闪烁芯片,我感到困惑。背景发生了什么?难道mbed CLI偷偷用openocd连接芯片?或者也许是 pyOCD?或者其他方式?

我还没有尝试过所有这些,但第一个当然是 mbed 支持的 nucleo 板显示为虚拟拇指驱动器,你只需复制 .bin 文件,从主机端没有真正的魔力没有除了操作系统已有的安装 USB 闪存驱动器之外,还需要其他软件。这些板上有一个调试头,即使没有,我知道有一个管理调试部分的 mcu,我称之为调试 mcu,然后是正在测试的 mcu 或您购买的演示板来玩。 mbed的一般都是arm,有swd(jtag-ish)接口,debug mcu很可能用那个接口。

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

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

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

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

虽然 mbed 沙箱可能很棒,但我建议您尝试其他选项,首先 mbed 构建二进制文件,然后复制它,mbed 构建它,也许 openocd 通过 stlink 将其写入闪存。 ST 和 NXP 部件传统上有一个支持 uart 协议的引导加载程序,您可以尝试使用它,因为如果您正在开发围绕其构建的某些产品,那么您很可能会使用或 swd 进入板上的芯片或者使用像这样的芯片但不是像 nucleos 那样的 hobby/eval 板。我还建议在没有库的情况下尝试裸机,只需阅读手册,我发现它比库更容易,YMMV,而且 ST 至少有一套自己的库我认为它们正在向软件解决方案过渡,也许两者都试试或尝试新的,因为另一个将失去支持。

您还可以获得 SWD 规范,还有 github 和其他开放项目可以提供帮助,使用您的 nucleo 板并在一个 mcu 上开发程序以与另一个 mcu 通信(mcus 具有 gpio 使其成为bit bang 的简单方法,你可以 bit bang 一个 ftdi 部分或做其他不必使用 mcu 的事情)并尝试 learn/understand 该协议本身。到目前为止,它被所有的 cortex-ms 使用。

还有一个像stlink这样的usb协议是arm在推的,较新的MSP432 launchpad都在使用或者支持。就此而言,stlink 协议本身。

无论如何我通过(调试)usb 离题了 nucleo 有 stlink 协议并且我是一个拇指驱动器的东西,所以 mbed 工具可能使用其中一个可能是后者,因为 stlink 可能在非-st 产品。调试 mcu 很可能正在使用 swd 对 development/demonstration mcu 进行编程,不知道它会怎么做。

mbed-cli 是开源的,你可以找到存储库here。如果您搜索 "def compile_",您会找到当您 运行 mbed compile.

时发生的事情的具体代码

mbed-cli 使用 mbed-ls to detect your board and htrun to flash it. htrun has a variety of plugins 复制到不同的板,包括 pyocd,但在最基本的情况下,它只是复制到用 mbed-ls 检测到的磁盘。