STM32 USB DFU功能

  • 工具的安装配置
  • CubeMX上配置
  • 完善接口
  • 工具使用
    • HEX固件转为DFU文件
    • 更新固件
  • DFU特点
  • 工程代码

DFU的全称为:DownLoad Firmware Update即固件升级
以下配置以STM32F103ZET6为例。

工具的安装配置

DfuSe v3.0.5 直接到ST官网下载,下载完成后找到目录下的驱动并安装

CubeMX上配置

开启USB外设

配置中间件,USB协议栈
这里配置使用默认即可,暂时先不改,原始配置烧录进设备后,USB应枚举成功,请求描述符失败情况应注意堆栈调整

在枚举成功的情况下,此处配置的修改:

USBD_DFU_MEDIA Interface描述的含义:0x08000000 为起始地址。“a”代表的是Read-only,“g”代表Read/Write/Erase。也就是说,“a”所指明的区域应该为
Bootloader 的空间不可擦除或者修改,“g”所指明的区别为用户代码空间。大小由前面的数字决定,乘号“*”前面的为Sector 的个数,后面
的为Sector 的大小,这里的意思就是从0x08000000 开始,前面3 个Sector(每个Sector 为16k 字节)为Read-only,后
面1 个Sector(每个Sector 为16k 字节)为Read/Write/Erase,等等。

示例

“@Internal Flash /0x08000000/120*128Ba,1416*128Bg”
含义:
从0x08000000 开始,前面120 个Sector(每个Sector 为128 字节)为Read-only,后
面1416 个Sector(每个Sector 为128 字节)为Read/Write/Erase。

注意点

当设置为Read-only属性的Sector,不可烧写!否则会报如下错误:


它如何知道你烧写的地址与只读属性区域产生冲突的?

因为你生成的hex文件已经定义了程序的起始地址,或者你生成的Bin文件转为DFU文件时设置的

当然我所说的这些,在CubeMX工具里都有的说明

USBD_DFU_APP_DEFAULT_ADD设置

此处设置的值应为你升级下载存放的起始地址,对于字段中APP字眼切勿认为需要填写APP程序的起始地址,其实它的作用就是触发DFU传输升级时告诉你应该擦除哪片区域地址,因为大多数DFU功能都在应用在Bootloader工程中,相对于Bootloader,在运行DFU升级,应该简单直接(直接擦除或写入APP区域地址的数据,而不是在APP中运行DFU升级,不能直接擦除APP自身代码,而是中转一下,下载到下载区或者其他不干涉APP程序代码的区域)

下图是未做调整,只为验证枚举成功的CubeMX初始配置

堆栈设置,因为DFU默认使用了1K的缓冲区(USBD_static_malloc),所以栈区的大小一定大于2K才能不会出现问题,这里大小设置可以编译后查看map文件,查看栈的使用情况。

确认中断使能

完善接口

在CubeMX配置完成后,完善以下接口,位于usbd_dfu_if.c

MEM_If_Erase_FS,//擦除相关区域
MEM_If_Write_FS,//写入新固件到相关区域
MEM_If_Read_FS,//读取相关区域,返回写入完成后的数据

参考如下:

/*** @brief  Erase sector.* @param  Add: Address of sector to be erased.* @retval 0 if operation is successful, MAL_FAIL else.*/
uint16_t MEM_If_Erase_FS(uint32_t Add)
{/* USER CODE BEGIN 2 */Update_Port_Write_New_Frimware_Info("app v2.0", Flash_Port_Get_Partition_Size("download"), "download");if(Flash_Port_Erase_Partition("download", true) == false){return (USBD_FAIL);}/*预先写入下载成功标识*/Update_Port_Write_Download_Complete_Flag();Write_Data_Index = 0;Read_Data_Index = 0;return (USBD_OK);/* USER CODE END 2 */
}/*** @brief  Memory write routine.* @param  src: Pointer to the source buffer. Address to be written to.* @param  dest: Pointer to the destination buffer.* @param  Len: Number of data to be written (in bytes).* @retval USBD_OK if operation is successful, MAL_FAIL else.*/
uint16_t MEM_If_Write_FS(uint8_t *src, uint8_t *dest, uint32_t Len)
{/* USER CODE BEGIN 3 */if(Flash_Port_Write_Partition_Data("download", src, Write_Data_Index, Len, true) == -1){return (USBD_FAIL);}Write_Data_Index += Len;return (USBD_OK);/* USER CODE END 3 */
}/*** @brief  Memory read routine.* @param  src: Pointer to the source buffer. Address to be written to.* @param  dest: Pointer to the destination buffer.* @param  Len: Number of data to be read (in bytes).* @retval Pointer to the physical address where data should be read.*/
uint8_t *MEM_If_Read_FS(uint8_t *src, uint8_t *dest, uint32_t Len)
{/* Return a valid address to avoid HardFault *//* USER CODE BEGIN 4 */if(Flash_Port_Read_Partition_Data("download", dest, Read_Data_Index, Len) == -1){return dest;}Read_Data_Index += Len;return dest;/* USER CODE END 4 */
}

APP固件中,中断向量表的调整,放置在main.c中起始处,此处的设置必须和你的Flash设置的起始地址一致

/********************************************************************* @brief   中断向量表迁移* @param   [in]None* @return  None.* @author  aron566* @version V1.0* @date    2021-02-25*******************************************************************/
void User_InterruptVectorTable_Move(void)
{SCB->VTOR = (0x8000000+(128*1024));
}

烧写完成后,新App应用即程序跳转执行,代码放置的位置,应当在固件下载完成之后,执行。

typedef void (*pFunction)(void);
/* Test if user code is programmed starting from USBD_DFU_APP_DEFAULT_ADD address */
if(((*(__IO uint32_t*)USBD_DFU_APP_DEFAULT_ADD) & 0x2FFE0000 ) == 0x20000000)
{ /* Jump to user application */ JumpAddress = *(__IO uint32_t*) (USBD_DFU_APP_DEFAULT_ADD + 4); JumpToApplication = (pFunction) JumpAddress; /* Initialize user application's Stack Pointer */ __set_MSP(*(__IO uint32_t*) USBD_DFU_APP_DEFAULT_ADD); JumpToApplication();
}

Bootloader参考这里

工具使用

HEX固件转为DFU文件


更新固件

打开DfuSeDemo,结合下图步骤,点击’Choose’加载之前转换的.dfu文件;选择配置;点击’Update’完成擦除与下载;另外,可以通过点击’Verify’验证是否下载成功

DFU特点

由于DFU是USB差分传输,相对而言速率和通讯稳定性上相当于UART更加快与稳定,
但是由于设备端不知道待接收文件的大小,何时传输结束,只为传输而传输,相比较带有完整文件传输协议而言(Ymodem、Xmodem等)这个差太多,不过CDC可以替代解决这个问题

工程代码

github H743VIT6仓库
github F103ZET6仓库

STM32 USB DFU功能相关推荐

  1. STM32 USB VCOM和HID的区别,配置及Echo功能实现(HAL)

    STM32 USB VCOM和HID的区别,配置及Echo功能实现(HAL ) STM32的USB功能模块可以配置为虚拟串口(VCOM: Visual Port Com)或人机交互设备(HID: Hu ...

  2. STM32实现USB转串口功能(含源码)

    之前的文章中介绍过STM32的USB接口虚拟串口的功能.<STM32CubeMX之USB从机>.本篇文章在此基础上,以STM32F407为例,介绍USB转串口功能的实现. 要实现USB转串 ...

  3. STM32F4XX的DFU功能

    相当部分的 STM32芯片都带USB模块,有时我们会考虑利用STM32芯片的USB模块进行程序代码的下载或升级.USB协议中有专门针对设备固件升级的类协议,即可以通过DFU类协议进行产品固件的加载或更 ...

  4. 关于对飞控芯片(STM32)DFU模式升级的认识

    [举报再看养成习惯,噢 不对,点赞再看 养成习惯.感谢支持] 首先:飞控只是一个开发板,大家都可以开发!开发就要把自己的程序下载进去,所以我们来看一下在没有Jlink帮助,只使用飞控上的USB口升级飞 ...

  5. STM32 USB虚拟串口原理(上)

    USB虚拟串口是使用USB的CDC(CDC为communication device class(virtual port com))类实现的一种通讯接口.使用STM32自带的USB slave功能可 ...

  6. 基于STM32的多功能MP3设计 毕业设计(论文)开题报告

    中国计量学院 毕业设计(论文)开题报告 学生姓名:卢杰学 号:XXXXXXXXX 专    业:电子科学与技术 班    级:10电子1 设计(论文)题目: 基于STM32的多功能MP3设计 指导教师 ...

  7. STM32 USB Host 同时连接多个设备样例(如鼠标和键盘)--原创

    STM32 USB Host 同时连接多个设备样例(如鼠标和键盘) 在网上搜了很多都是USB Host单独连接鼠标或键盘的样例, 而当前很多无线鼠标键盘都是并到一个USB口上的, 也就是同一个USB有 ...

  8. 62 stm32 usb自定义hid复合设备修改实验

    1.引言 最近因为项目需要,我们希望单片机既能有hid键盘功能,又能有hid设备的功能.即单片机的一个usb接口插入电脑后,电脑能识别出键盘设备和hid设备,两者同时存在的. 基于项目只是要求实现功能 ...

  9. stm32 USB HID+CDC 鼠标键盘串口 组合设备配置解析

    前言 查阅网上的博客与代码,很多都是关于USB的鼠标配置.USB的键盘配置.USB的虚拟串口配置,稍微深入一点的会将鼠标键盘合在一起,但移植起来就会报很多错误,要么是检测不到,要么是警告,这很正常,因 ...

  10. STM32 USB使用记录:使用CDC类虚拟串口(VCP)进行通讯

    文章目录 目的 基础说明 使用STM32CubeIDE配置生成代码 用户代码分析 回环测试 串口参数设置 USB HS使用与演示 通讯速率测试 测试代码 USB FS测试 USB HS测试 影响速度的 ...

最新文章

  1. fiddler自动响应AutoResponder之正则匹配Rule Editor
  2. 20. A *p=NULL,p 可以调用 A 类里面的函数嘛?
  3. c语言 宏教程 pdf,C语言之详解_ifdef等宏.pdf
  4. java集合——树集(TreeSet)+对象的比较
  5. Linux的bc命令计算π的值预估系统算力
  6. 执行Dockerfile构建基础镜像,建立python工作环境
  7. 移动游戏加载性能和内存管理全解析 学习
  8. JAVA中增强循环中用线程_在Java中以循环方式运行线程
  9. BUAA_OO_博客作业3——规格
  10. 万万没想到:从啤酒评分 app 中竟能找到情报人员和军人的敏感信息
  11. web系统服务器登录不上去,宝塔面板严重错误登录不上怎么办
  12. 声笔飞码6.00版使用指南
  13. pmp华为内部资料,成功的项目管理是怎样的?
  14. InDesign转曲字体 导出PDF的技巧
  15. ImageJ批量操作时常见报错及其原因
  16. 金士顿 U盘群联 ps2251_60 量产
  17. Promise 是什么?
  18. 计算机主机自动关机如何设置,如何设置自动关机(如何设置电脑的自动关机和自动开机)...
  19. win10 outlook2016 如何删除IMAP文件夹 (脑残党操作)
  20. 产品经理到底是做什么的?|️ 什么是产品经理?

热门文章

  1. BLE 技术(四)--- 链路层五种通信模式和空口协议设计 (Core_v5.2)
  2. S5P4418裸机之SDIO程序
  3. 有关Cidaemon.exe服务占用大量CPU资源的解决办法
  4. 错误:1 error and 0 warnings potentially fixable with the `--fix` option. 报错问题解决方法
  5. 洗内衣、白鞋、羊毛衫……需要专用清洁剂吗
  6. 808通讯协议技术规范消息ID:0x0704数据分析,后附go代码
  7. 教育知识与能力-第七章 中学德育
  8. MIN-MAX归一化
  9. .NET反编译:使用NET.Reflector+Reflexil插件相结合实现对DLL文件的修改操作
  10. c语言求绝对值作业,C语言求绝对值