STM32 Nucleo系列的板子如何实现拖固件至U盘升级固件的呢?

STM32 Nucleo的开发板,装完驱动后,接入电脑,此时电脑会模拟一个容量较小的U盘,这个容量应该就是MCU内部flash剩余的空间大小了。

我们可以通过mbed或MDK-ARM编译一个bin文件,然后直接把该bin文件拖到该MCU模拟的U盘目录中即可完成MCU固件的烧录,请问此方式是如何实现的呢?哪有相关的资料?

ST的UM0412手册讲述了通过DFU方式升级固件,DFU和上述显然不同,DFU使用起来更加复杂。

是否是如下实现呢:

STM32 Nucleo板子都有一个编程器(可掰开的上半部分),一般由F103充当,F103具有usb-device功能,即Nucleo板子的编程器实现了一个usb-device,当发现有固件放入usb-device后便,它开始把接受到的固件按照其它方式(比如ISP的方式)烧写到评估的MCU中去。这种方式下,Nucleo板子可以随时接受一个固件并烧录,因为编程器一直模拟为一个usb-device。

如果我想实现一个不带编程器的、通过拖固件至U盘的方式实现固件烧写的功能,那么该如何实现呢?

就是有一个用户场景,产品只有一个MCU(不可能产品上还带有编程器部分),当用usb线缆接入电脑后,电脑模拟一个U盘,然后通过拖动固件的方式完成固件的升级。

ST的AN4657中有一个图:

可以在IAP代码区中实现usb-device,但它需要通过一个按键来执行IAP代码,否则跳过IAP进入User代码区,这个很难实现开发板一直模拟U盘且开发板一直在运行用户程序(不同于Nucleo开发板可以一直有U盘出现在电脑上且Nucleo开发板也在正常使用中--比如闪烁程序)。

有没有相关的usb-device方式的IAP示例呢?

  • 您好!

    1. 程序烧录功能类似于DAPLINK,详情可参考https://github.com/mbedmicro/DAPLink

    2. IAP中带USB可以,但是无法跟用户程序同时运行。要实现用户程序和USB一直同时运行,而且更新不需要额外操作,一个方法就是USB在用户程序中实现,采用类似OTA的方法。flash中的user application code部分空间需要分成两半,一半是跑用户程序,一半作为backup用来接受来自USB的更新程序。IAP的逻辑是reset时判断是否要更新。这里比较灵活。