在stm32平台上测试dfu的功能

Posted yd的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在stm32平台上测试dfu的功能相关的知识,希望对你有一定的参考价值。

概述

基于stm32的硬件平台,在rtthread、HAL库、DFU库(st官方)的软件支撑下,使用RT-Thread Studio 和Cubemx软件, 测试DFU功能。

环境:

  1. 主控芯片:stm32f407VE

  2. 操作系统: rt-thread:nano、rt 4.0.3

  3. 软件库版本:1.26.xx

创建demo工程

rtthread主线版本

1、根据芯片型号,创建一个基础工程;

2、双击RT-Thread Studio 工程中的cubemx settings图标,进入软件驱动配置界面

配置usb驱动,选择配置usb为设备模式,使能中断

 

 

在middleware中选择usb_device,选中DFU功能

 

 

至于时钟,串口等其他配置,根据自己的板子配置后,生成代码。

3、配置环境

因为RT-Thread Studio自动添加、排除代码,我们上一步选中的dfu库会被排除编译,所以每次重配置工程后,都需要手动操作下面步骤

移除排除编译的DFU库文件

 

 

添加头文件路径信息(这一步做过一次,重配置后不需要做了)

 

 

到这一步,代码应该可以编译通过了,但是因为初始化代码和中断函数没有实现,所以插入usb还是没有响应。

在usb_device.c中添加初始化函数,并添加自动初始化宏修饰,路径:cubemx/src/

int dfu_init(void)
{
   MX_USB_DEVICE_Init();
   return 0;
}
INIT_BOARD_EXPORT(dfu_init);

添加中断函数:

新建一个源代码文件,实现usb中断函数

/*
* Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date           Author       Notes
* 2021-05-30     yd       the first version
*/
#include <rtthread.h>
#include "board.h"
extern PCD_HandleTypeDef hpcd_USB_OTG_FS;


/**
 * @brief This function handles USB On The Go FS global interrupt.
 */
void OTG_FS_IRQHandler(void)
{
 /* USER CODE BEGIN OTG_FS_IRQn 0 */
 rt_interrupt_enter();
 /* USER CODE END OTG_FS_IRQn 0 */
 HAL_PCD_IRQHandler(&hpcd_USB_OTG_FS);
 /* USER CODE BEGIN OTG_FS_IRQn 1 */
 rt_interrupt_leave();
 /* USER CODE END OTG_FS_IRQn 1 */
}

至此,重新编译后,烧写到板子,连接硬件后,PC就会识别到DFU的usb设备:

 

 

如果有感叹号,没有安装驱动,需要下载ST提供的DFU上位机软件,DfuSe v3.0.6,更新驱动就Ok,

 

 

nano版本

nano版本和主版本一样的操作,也是可以实现功能。

 

以上是关于在stm32平台上测试dfu的功能的主要内容,如果未能解决你的问题,请参考以下文章

STM32 DFU模式烧录代码

STM32 USB编程,跳转到DFU的bootloader

STM32 demo USB-DFU boot loader如何检查是不是加载了用户代码?

stm32 dfu升级一定要配置成虚拟串口吗?可不可以配置成HID

如何在 STM32 F072 的软件中跳转到引导加载程序(DFU 模式)?

STM32CubeMX学习笔记(50)——USB接口使用(DFU固件升级)