STM32 USB DFU功能

2023-11-10


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仓库

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32 USB DFU功能 的相关文章

  • 如何禁用 Android 设备 USB 端口

    我正在尝试搜索是否有一种方法可以禁用 Android 设备 USB 端口 主要是软件级别 因此用户仍然可以为 Android 设备充电 但无法再与 PC 通信 我得到了一些线索link1 https groups google com fo
  • USB 控制传输能否保证交付?

    USB 2 0 指定 http www usb org developers docs usb20 docs 4 种传输类型 第 5 4 节传输类型 控制转移 同步传输 中断传输 批量转账 第 5 8 节规定批量转账提供 在带宽可用的基础上
  • 如何检查 Android 上是否启用 USB 连接模式?

    我在 Android 市场上有一个应用程序 用户经常将他们的设备连接到计算机以将音乐添加到应用程序文件夹中 我在说明中特别指出 当启用 USB 连接模式时 Android 应用程序无法与 SD 卡通信 显然这还不够愚蠢的证据 有没有办法在j
  • 使用“设备过滤器”解决方案时如何处理 Android 上的 USB 权限对话框事件?

    当我将 已知 USB 设备连接到 Android 手机时出现的自动权限对话框中 用户按下 确定 或 取消 时 我试图处理该事件 我正在使用 android usb host 库 可以在 Android 手机和设备之间发送和接收 此外 我使用
  • ALSA 记录 - 了解内存映射

    我尝试使用 ALSA 从 USB 音频设备获取输入并将其作为一系列内容写入磁盘signed short价值观 我最终得到的是看似有效的数据块 其中散布着大块的零 我猜测我的缓冲区设置不正确并且没有正确使用内存映射 我正在尝试什么 采样率 8
  • USB 传输数据

    我正在尝试通过 USB 发送和接收数据 我的设备 Acer Iconia A500 拥有连接到设备所需的一切 一切都很好并且工作正常 但是当我尝试发送和接收数据时 它的行为并不像预期的 这是我的代码 for this is the main
  • 是否有可通过 USB 密钥在 Mac OS X 10.6 上运行的便携式 python 解释器?

    我一直在努力寻找一个可以通过工作计算机上的 USB 密钥运行的便携式解释器 Work comp 运行的是 Mac OS X 10 6 环境相当受限 无法访问终端 无法安装应用程序 但我知道便携式应用程序可以从 USB 驱动器运行 我一直在使
  • adb 未检测到 micromax a111

    最近我购买了 micromax a111 Android 设备 我是安卓开发者 因此尝试使用该设备进行调试选项 但 adb 无法检测到该设备 我也更改了设置 但没有成功 如果有人有解决方案 请帮助我解决这个问题 micromax没有官方的P
  • USB 调试 - 安装 Epson Moverio 驱动程序时出现问题

    Android 开发新手 我使用以下命令制作了一个小应用程序Eclipse http en wikipedia org wiki Eclipse 28software 29在虚拟 Android 设备上完美运行 现在 我想在真实的设备上运行
  • STM32内部时钟

    我对 STM32F7 设备 意法半导体的 Cortex M7 微控制器 上的时钟系统感到困惑 参考手册没有充分阐明这些时钟之间的差异 SYSCLK HCLK FCLK 参考手册中阅读章节 gt RCC 为 Cortex 系统定时器 SysT
  • Android:与充当主机的 USB 设备通信

    我们制作了一个可以充当 USB 主机或从机并处理其接收到的数据的设备 我想使用Android手机通过USB向其发送数据 我的研究使我得出结论 如果不修改硬件或操作系统 我们就无法在 USB 主机模式下使用 Android 设备 这样做不是一
  • PWM DMA 到整个 GPIO

    我有一个 STM32F4 我想对一个已与掩码进行 或 运算的 GPIO 端口进行 PWM 处理 所以 也许我们想要 PWM0b00100010一段时间为 200khz 但随后 10khz 后 我们现在想要 PWM0b00010001 然后
  • 在 Contiki 程序中使用 malloc

    考虑以下 Contiki 程序 include
  • 使用 STM32 USB 设备库将闪存作为大容量存储设备

    我的板上有这个闪存IC 它连接到我的STM32F04 ARM处理器 处理器的USB端口可供用户使用 我希望我的闪存在通过 USB 连接到 PC 时被检测为存储设备 作为第一步 我在程序中将 USB 类定义为 MSC 效果很好 因为当我将主板
  • 适用于 Android 的 USB 主机

    I am trying to communicate with my freeduino board which is similar to arduino uno via usb through android device nexus
  • 哪些变量类型/大小在 STM32 微控制器上是原子的?

    以下是 STM32 微控制器上的数据类型 http www keil com support man docs armcc armcc chr1359125009502 htm http www keil com support man d
  • 如何查找USB盘符?

    我正在编写一个安装程序来将应用程序安装到 USB 驱动器 该应用程序只能从 USB 驱动器使用 因此它可以通过自动选择要安装的 USB 驱动器来为用户节省额外的步骤 我可能会尝试使用 Nullsoft 或 MSI 进行安装 但由于我最熟悉
  • LibUsb 声明接口访问被拒绝 Java

    我希望能够从 USB 计步器读取数据 我正在 Java 中尝试此操作 并且使用 LibUsb 和 Usb4Java 库 我似乎无法认领 USB 管道或类似的东西 我正在使用的代码 final Context context new Cont
  • libusb 和轮询/选择

    我正在使用 Linux 操作系统 想知道是否有任何文件描述符可以轮询 选择 当数据等待从 USB 设备读取时会触发这些文件描述符 我也在使用 libusb 库 但尚未找到可以使用的文件描述符 Use libusb 的轮询函数 http li
  • 使用 Windows 原始访问 API 直接访问 USB 驱动器

    在USB物理驱动器的末尾 我想使用Windows原始访问API直接写入数据 我不想使用内核驱动程序来做到这一点 据我所知 出于安全原因 Windows XP SP2 或 SP3 阻止了 HDD 直接访问 我不确定 USB 驱动器是否如此 请

随机推荐

  • 对象,我遇见了你

    对象 什么是对象 对象属性 Object assign Object create Object is Object keys Object values Object entries Object fromEntries Object t
  • Day 21 B. T-primes

    Problem We know that prime numbers are positive integers that have exactly two distinct positive divisors Similarly we l
  • Windows下安装nvm及搭建Angular环境的步骤整理

    环境 操作系统 windows 8 1 安装nvm nvm windows 下载https github com coreybutler nvm windows releases 我把nvm noinstall zip解压到c dev nv
  • PS2汉化1 字库处理

    引语 其实字库处理很难说有一个统一的方法 不同的程序都需要不同方法来处理 关于常见位图字库的详细信息 下面是字库存在于ELF ERX文件时的处理思路 字模替换 最天真朴素 最通用的处理方式 适用于原字库大小能够塞下汉化所用的全部文字的情况
  • XSS、CSRF攻击以及预防手段

    文章目录 XSS 反射型 持久型 DOM型 XSS如何防御 CSRF XSS XSS全程Cross Site Scripting 名为跨站脚本攻击 是一种常见于 Web 应用中的计算机安全漏洞 恶意攻击者往 Web 页面里嵌入恶意的客户端脚
  • 【VBA编程】VBA基础语法(一)

    一 VBA中的数据类型 VBA里的数据类型有 字节型 Byte 整数型 Integer 长整数型 Long 单精度浮点型 Single 双精度浮点型 Double 货币型 Currency 小数型 Decimal 字符串型 String 日
  • 《数据清洗》第五章操作实例

    案例一介绍 通过Kettle工具 消除CSV文件merge csv中完全重复的数据 1 打开Kettle工具 创建转换 通过使用Kettle工具 创建一个转换repeat transform 并添加 CSV文件输入 控件 唯一行 哈希值 控
  • 把多页Word文档缩小打印到同一张纸上

    方法一 首先要确定纸张的大小和方向 系统默认的是 A4 纸 方向纵向 如果要改变 可单击 文件 页面设置 进行相应的更改 单击 插入 文本框 横排 然后在刚才新建的文档中画出一个文本框 大小大约为这页纸的四分之一 然后将鼠标放到该文本框的边
  • 关于某些特殊时候按钮disabled属性失效时的解决办法

    今天遇到了一个BUG 导致下一步按钮中的属性即时有disabled时 点击按钮依然会触发按钮的点击事件 以下为下一步按钮的JS代码 下一步 btn step click function e if this hasClass layui b
  • 常见排序算法--合并排序

    思路 将一个无序的序列分组 直至分为每两个元素一组 如果有单个元素剩余 则可以剩余的单个元素自己一组 小组内排序 然后合并成一个有序的序列 例子 排序过程如图所示 图片摘选自 https blog csdn net ZY cat artic
  • 腾讯云nginx配置ssl证书实现https

    1 申请证书 2 下载证书 签发后 里面包含nginx 1 1 域名 bundle crt 2 2 域名 key 3 配置nginx文件 在配置ssl证书之前 要确保你的nginx已经安装了ssl模块 如果没有请安装 gt sbin ngi
  • rstudio导入txt文件_r语言怎么读取txt文件

    展开全部 1 r语言62616964757a686964616fe59b9ee7ad9431333431376533读取txt文件的方法 首先根据下图图片中的命令代码进行输入 2 然后这样就可以读取txt文件了 结果图如下 3 R读取csv
  • 模拟网盘(基于多线程TCP)

    题目描述 模拟一个网盘实现以下功能 用户可以注册 登录 上传和下载文件 用户可以实现类似 ls的功能查询文件信息 多用户间文件可以共享 要求 基于TCP协议 server端要用多线程实现 在linux下用C语言实现 需要实现的功能 服务器端
  • 基于java的支付宝即时到账支付

    java实现支付宝即时到账支付 演示地址 支付宝电脑网站支付 支持回调 支付成功后即可回到自己自定义的回调页面 下载地址 java实现支付宝即时到账支付 源码世界 下载后在本地只需把你的几个配置参数改成自己的即可完美实现在线支付 应用ID
  • Java封装的概念

    封装是面向对象的三大特征之一 封装 继承 多态 概念 封装就是将类里的某些信息隐藏 不允许外部程序直接调用 可以对成员变量更准确的控制 举例 通过以上代码 可以看到 如过X类的成员变量直接被调用 那么可能会出现赋值越界的情况 年龄不可能小于
  • MongoDB分片实战(一):集群搭建

    随笔 97 文章 9 评论 337 MongoDB分片实战 一 集群搭建 环境准备 Linux环境 主机 OS 备注 192 168 32 13 CentOS6 3 64位 普通PC 192 168 71 43 CentOS6 2 64位
  • Maven 4、JDK配置

    当你的idea中有多个jdk的时候 就需要指定你编译和运行的jdk 在settings xml中配置
  • 使用命令把类打成jar包

    测试用类 public class Hello public static void main String args System out println hello world 一般的Jar包 生成class文件 在命令行中输入下面代码
  • windows桌面应用自动化测试

    1 AutoIt3 原理 使用spy抓应用的hwnd 根据hwnd获取窗口信息 模拟发送鼠标按键 移动窗口实现自动化操作 缺点 获取到的信息少 编程实现复杂 2 UIAutomation msdn介绍 Microsoft UI Automa
  • STM32 USB DFU功能

    STM32 USB DFU功能 工具的安装配置 CubeMX上配置 完善接口 工具使用 HEX固件转为DFU文件 更新固件 DFU特点 工程代码 DFU的全称为 DownLoad Firmware Update即固件升级 以下配置以STM3