当mbed CLI闪存芯片时,后台会发生什么?

时间:2018-02-09 17:40:04

标签: embedded mbed openocd

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

要编译我的代码并将二进制文件刷新到芯片,我在我的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。这里全面描述了所有内容:How to use the GDB (Gnu Debugger) and OpenOCD for microcontroller debugging - from the terminal?

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

2 个答案:

答案 0 :(得分:3)

mbed-cli是开源的,您可以找到存储库here。如果你搜索" def compile _"当您运行mbed compile时,您会找到具体的代码。

mbed-cli使用mbed-ls检测您的电路板,htrun使用它来闪烁。 htrun has a variety of plugins用于复制到不同的板,包括pyocd,但在最基本的情况下,它只是复制到用mbed-ls检测到的磁盘。

答案 1 :(得分:1)

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

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

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

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

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

虽然mbed沙箱可能很棒,但我建议您尝试其他选项,首先使用mbed来构建二进制文件,然后复制它,mbed以构建它,并且可能通过stlink openocd将其写入flash。 ST和NXP部件传统上都有一个引导加载程序,它可以支持你可以试用的uart协议,因为如果你正在开发一些产品,那么你很可能会使用或者swd来进入板上的芯片或者使用像这样的芯片,但不像核子那样有一些爱好/评估板。我还建议尝试没有库的baremetal,只需阅读手册,我发现比库更容易,YMMV,ST也至少拥有一套自己的库我认为它们正处于软件解决方案之间的转换,也许试试两者或尝试新的,因为另一个将失去支持。

你也可以获得SWD规范,还有github和其他开放项目可以提供帮助,带上你的核心板并在一个mcu上开发一个程序与另一个人交谈(mcus有gpio使它成为一个简单的方法来爆炸,你可以咬一个ftdi部分或做其他事情不必使用mcu)并尝试学习/理解该协议本身。到目前为止,它被所有皮质-ms使用。

还有一个类似于stlink的usb协议,它是由arm推动的,较新的MSP432启动板使用它或支持它。关于此事的stlink协议本身。

无论如何我通过(调试)usb离开核心有stlink协议并且我是拇指驱动器的东西,所以mbed工具可能使用其中一个可能是后者因为stlink很可能在非st上找不到产品。很可能调试mcu使用swd来编程开发/演示mcu,不知道它会怎么做。