如何修改USB DFU固件示例以使用STM32CubeProgrammer
在Cube固件包中,有一些应用程序内USB DFU的示例,这些示例最初是为与DFuse软件实用程序一起使用而创建的。DFuse现在不建议用于新的设计,所以本文的目的是展示这些设计是如何使用的。。。
在Cube固件包中,有一些应用程序内USB DFU的示例,这些示例最初是为与DFuse软件实用程序一起使用而创建的。DFuse现在不推荐用于新的设计,因此本文的目的是展示如何定制这些示例以使用STM32CubeProgram。
如何修改USB DFU固件示例以使用STM32CubeProgrammer
1.概述
- 此过程将在STM32L476 Discovery板上使用STM32CubeIDE和STM32CubeProgrammer进行演示。本文的目标是使用STM32CubeProgrammer的CubeL4固件包中的DFU_Standalone固件示例将应用程序二进制文件上传到板上。本文中使用的应用程序二进制文件是GPIO_IOToggle,它也可以在CubeL4固件包中找到。
- 由于DFU_Standalone示例最初是为使用不推荐使用的工具DFuse而设计的,因此本文旨在展示使此示例能够使用我们当前的工具STM32CubeProgramer的过程。
- 这种相同的工艺可以适用于其他板材和固件。
2.USB DFU固件的修改
- 打开STM32CubeIDE。导航到文件->从文件系统打开项目…
- 打开在默认位置找到的项目:
C: \用户\您的用户名\ STM32Cube\Repository\STM32Cube_FW_L4_V1.17.2\Projects\32L476GDISCOVERY\Applications\USB_Device\DFU_Standalone\SW4STM32\STM32L476G_Discovery_USBD-FS - 这个项目是USB DFU程序。由于它最初是为使用DFuse而创建的,因此需要对其进行修改以使用STM32CubeProgrammer。原始固件有一个检查,指示固件已上载。在正文c中,第76-90行
-
if(BSP_JOY_GetState()==JOY_NONE){/*测试用户代码是否从地址0x0800C000开始编程*/if((*(__IO uint32_t*)USBD_DFU_APP_DEFAULT_ADD)&0x2FFE0000)==0x20000000){/*跳转到用户应用程序*/JumpAddress=*(__IO uint32.t*)(USBD_DFD_APP_DEFAULT_ADD+4);JumpToApplication=(pFunction)JumpAddress;/*初始化用户应用程序的堆栈指针*/__set_MSP(*(__IO uint32_t*)USBD_DFU_APP_DEFAULT_ADD);JumpToApplication();}}
- 此检查仅在假设代码是通过DFuse上传的情况下有效。这将被修改为使用用户操纵杆按钮跳转到用户应用程序地址。这个解决方案故意不健壮,以保持简单,但在您自己的应用程序中,您可以添加任何您喜欢的专有解决方案,以表明用户固件已经下载。请将上述代码替换为以下代码:
-
/*检查是否按下了KEY按钮*/if(BSP_JOY_GetState()=JOY_SEL){/*跳转到用户应用程序*/JumpAddress=*(__IO uint32_t*)(USBD_DFU_APP_DEFAULT_ADD+4);JumpToApplication=(pFunction)JumpAddress;/*初始化用户应用程序的堆栈指针*/__set_MSP
- 此代码将使USB DFU引导加载程序在复位期间按下板上的用户操纵杆按钮时跳转到应用程序。
- 立即构建固件。确保在资源管理器中选择了项目,并点击工具栏中的锤子图标

3.应用程序固件的修改
- 对于通过USB DFU上传的应用程序固件,我们将使用固件示例GPIO_IOToggle。这只是一个例子;相同的过程可以用于任何固件。
- 导航到文件->从文件系统打开项目…
- 打开在默认位置找到的项目:
C: \Users\your_username\STM32Cube\Repository\STM32Cube_FW_L4_V1.17.2\Projects\32L476GDISCOVERY\Examples\GPIO\GPIO_IOToggle\SW4TM32\STM32L476G发现 - 首先,我们需要修改项目的链接器文件。默认链接器期望应用程序处于flash的开头:0x08000000。从文件STM32L476VGTx_FLASH.ld第41-46行以下为:
-
/*指定内存区域*/memory{FLASH(rx):ORIGIN=0x8000000,LENGTH=1024K RAM(xrw):ORIGIN=0x20000000,LENGHT=96K}
- 我们只需要将起始闪存地址更改为DFU固件期望应用程序所在的位置(0x800C000),并相应地调整长度。
0xC000=48K 1024K–48K=976 - 将上述代码替换为以下代码。
-
/*指定内存区域*/memory{FLASH(rx):ORIGIN=0x800C000,LENGTH=976K RAM(xrw):ORIGIN=0x20000000,LENGTH=96K}
- 最后,我们只需要将矢量表的地址重新定位到新固件的开头。在应用程序固件中,在main.c的开头,添加重定位作为main()的第一行:
-
int main(void){SCB->VTOR=0x800C000;…}
- 立即构建固件。确保在资源管理器中选择了项目,并点击工具栏中的锤子图标。

4.带STM32CubeProgramer的DFU工艺
- 随着这两个固件的构建,是时候将USB DFU固件加载到板上了。将STM32L476-DISCOVERY板通过CN1 ST Link USB连接器与USB类型a至迷你电缆连接至计算机。在CubeIDE中,在资源管理器中选择USB DFU项目,并使用Run As…->STM32 Cortex-M C/C++应用程序将固件上传到板上:


- 将运行配置保持在默认设置,然后选择“确定”。这将把USB DFU固件加载到板上。现在,通过USB a到micro电缆将USB USER CN7连接器连接到电脑。此电缆用于处理USB DFU数据传输。
- 现在打开STM32CubeProgrammer。在右侧面板中,在连接按钮旁边的下拉菜单中选择USB。现在按下端口字段旁边的刷新按钮,您应该会看到USB DFU端口显示USB1。按Connect(连接)。

- 连接后,导航至擦除和编程部分:

- 现在我们需要浏览到GPIO_IOToggle应用程序创建的二进制文件的文件路径。这可以在项目文件夹中的“调试”文件夹中找到。选择文件路径字段旁边的浏览按钮,然后导航到二进制文件:
GPIO_IO切换\SW4TM32\STM32L476G发现\调试\STM32L476G-Discovery.bin - 将开始地址设置为0x800C000,然后单击开始编程。

- 下载完成后,断开STM32CubeProgrammer的连接。按住控制板上的操纵手柄中心按钮,同时按下重置按钮。这将导致DFU固件跳转到GPIO_IOToggle应用程序,并且您应该看到用户LEDS LD4和LD5开始闪烁。如果在没有按下操纵杆按钮的情况下按下重置按钮,则板将再次处于USB DFU模式。
- 此示例旨在演示一个基本的USB DFU引导加载程序。在实践中,建议实现一种更健壮的方法来管理和检查上传的固件。