【GD32F303红枫派使用手册】第二十九节 USB-IAP升级实验

29.1 实验内容

通过本实验主要学习以下内容:

  • USB IAP升级操作

29.2 实验原理

USB IAP升级本例程中使用的是Custom HID中的IAP设备类,其设备类协议的实现与HID的类似,主要包括GET_REPORT/GET_IDLE/GET_PROTOCOL/SET_REPORT/SET_IDLE/SET_PROTOCOL/USB_GET_DESCRIPTOR等。IAP的功能为通过USB接口通信的方式对app端代码进行更新。

29.3 硬件设计

USB虚拟键盘实验章节已介绍。

29.4 代码解析

IAP主函数如下所示,开始主要为delay延迟配置以及按键配置,之后判断KEY1按键是否被按下,如果KEY1按键没被按下,将会进入到跳转代码段,如果APP_LOADED_ADDR(0x08008000U)地址中有对应APP的堆栈指针,则认为APP段有数据可直接跳转执行。如果堆栈指针校验异常,则跳出判断执行后续代码;如果KEY1按键被按下,则跳过跳转语句段,直接运行USB IAP的升级代码。通过RCU/USB等相关配置后,在PC端将会识别一个USB IAP设备。

C
int main(void)
{uint32_t app_address;app_func application;uint32_t sram_sect = REG32(APP_LOADED_ADDR);driver_init();/* configure KEY1 key to run firmware */bsp_key_init(&KEY1);/* KEY1 key must be pressed on board when power on */if(SET !=bsp_key_state_get(&KEY1)) {/* test if user code is programmed starting from address 0x8008000 */if((sram_sect >= SRAM_BASE_ADDR) && (sram_sect < SRAM_END_ADDR)){app_address = *(__IO uint32_t*) (APP_LOADED_ADDR + 4U);application = (app_func) app_address;/* initialize user application's stack pointer */__set_MSP(*(__IO uint32_t*) APP_LOADED_ADDR);/* jump to user application */application();}}/* system clocks configuration */rcu_config();/* GPIO configuration */gpio_config();/* USB device configuration */usbd_init(&usbd_iap, &iap_desc, &iap_class);/* NVIC configuration */nvic_config();/* enabled USB pull-up */usbd_connect(&usbd_iap);while (1){}
}

HID报文描述符如下所示,该报文描述符描述了收发数据类型以及长度,其中,主机发送的IAP命令和数据长度为63个字节,MCU从机回复的状态数据长度为16个字节。

C
const uint8_t iap_report_desc[USB_DESC_LEN_IAP_REPORT] =
{0x05, 0x01,     /* USAGE_PAGE (Generic Desktop) */0x09, 0x00,     /* USAGE (Custom Device)        */0xa1, 0x01,     /* COLLECTION (Application)     *//* IAP command and data */0x85, 0x01,     /* REPORT_ID (0x01)          */0x09, 0x01,     /* USAGE (IAP command)       */0x15, 0x00,     /* LOGICAL_MINIMUM (0)       */0x25, 0xff,     /* LOGICAL_MAXIMUM (255)     */0x75, 0x08,     /* REPORT_SIZE (8)           */0x95, 0x3f,     /* REPORT_COUNT (63)         */0x91, 0x82,     /* OUTPUT (Data,Var,Abs,Vol) *//* device status and option byte */  0x85, 0x02,     /* REPORT_ID (0x02)               */0x09, 0x02,     /* USAGE (Status and option byte) */0x15, 0x00,     /* LOGICAL_MINIMUM (0)            */0x25, 0xff,     /* LOGICAL_MAXIMUM (255)          */0x75, 0x08,     /* REPORT_SIZE (8)                */0x95, 0x10,     /* REPORT_COUNT (16)              */0x81, 0x82,     /* INPUT (Data,Var,Abs,Vol)       */0xc0            /* END_COLLECTION            */
};

MCU接收到主机发送的数据后,将会进入iap_data_out回调函数,其中实现了IAP download(数据下载)、IAP Erase(擦除操作)、IAP OPTION BYTE(获取选项字节)、IAP LEAVE(退出IAP模式)、IAP GETBIN ADDRESS(获取APP起始地址)几个功能。

C
static void iap_data_out (usb_dev *udev ,uint8_t ep_num)
{usbd_iap_handler *iap = (usbd_iap_handler *)udev->class_data[USBD_IAP_INTERFACE];if (0x01U == iap->report_buf[0]) {switch(iap->report_buf[1]) {case IAP_DNLOAD:iap_req_dnload(udev);break;case IAP_ERASE:iap_req_erase(udev);break;case IAP_OPTION_BYTE:iap_req_optionbyte(udev);break;case IAP_LEAVE:iap_req_leave(udev);break;case IAP_GETBIN_ADDRESS:iap_address_send(udev);break;default:break;}}usbd_ep_recev(udev, IAP_OUT_EP, iap->report_buf, IAP_OUT_PACKET);
}

29.5 实验结果

将本实验历程烧录到红枫派开发板中,打开GD32 ALL IN One上位机,如下图所示,接口选择USB,Bootloader协议选择IAP,之后点击connect进行连接。

 连接成功后,显示如下图所示,connect按钮变成disconnect,且在左下角显示芯片信息。 右侧栏目即为USB IAP可实现的功能,主要包括载升级代码,其他功能为灰色不能操作。点击Browse选择下载bin或者hex文件,之后点击download即可进行下载,下载完成后,进度条显示100%,即完成升级下载。

 由聚沃科技原创,来源于【红枫派开发板】第二十九讲 USB-IAP升级实验 - 苏州聚沃电子科技有限公司 (gd32bbs.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/40305.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Qt知识】qrc机制

在Qt中&#xff0c;qrc机制是一种资源管理系统&#xff0c;它允许你将应用程序所需的静态资源&#xff0c;如图像、样式表、字体和音频文件&#xff0c;嵌入到可执行文件中而不是作为外部文件存在。这样做的好处是资源管理更加安全&#xff0c;因为它们不会丢失或被意外修改&am…

git基本使用(一):git的基本概念

Git 是一种分布式版本控制系统&#xff0c;最初由 Linus Torvalds 于 2005 年为 Linux 内核开发。它主要用于跟踪文件的更改&#xff0c;特别是在软件开发过程中&#xff0c;可以帮助团队成员协同工作。它在实际项目开发中&#xff0c;应用非常广泛&#xff0c;我们这一节来掌握…

qt 滚动区域简单实验

1.概要 有些时候&#xff0c;想用一个有限的区域显示更多的内容&#xff0c;且内容不固定用滚动区域控件是一个不错的选择&#xff0c;我今天就用一个图片简单的实验一下。 2.代码&#xff08;关键代码&#xff09; #include "widget.h" #include "ui_widget…

flutter开发实战-Webview及dispose关闭背景音

flutter开发实战-Webview及dispose关闭背景音 当在使用webview的时候&#xff0c;dispose需要关闭网页的背景音或者音效。 一、webview的使用 在工程的pubspec.yaml中引入插件 webview_flutter: ^4.4.2webview_cookie_manager: ^2.0.6Webview的使用代码如下 初始化WebView…

uni-app上传失败超出文件限制解决方法-分包处理-预加载

分包背景 当你的上传出现一下错误&#xff1a; Error: 系统错误&#xff0c;错误码&#xff1a;80051,source size 2089KB exceed max limit 2MB [20240703 10:53:06][wxbf93dfb6cb3eb8af] [1.06.2405010][win32-x64] 说明你主包太大需要处理了&#xff0c;一下两种方法可以…

Day03-Jenkins与集成案例

Day03-Jenkins与集成案例 6. CD持续交付&#xff0c;持续部署实现方案7. 案例04: basketball案例,搭建开发测试专用的任务7.1 任务要求7.2 步骤7.3 详细步骤1&#xff09;安装插件2&#xff09;创建任务 7.4 gitlab配置钩子1) 解除钩子局域网访问限制2) gitlab配置钩子 7.5 与部…

网络基础:OSPF 协议

OSPF&#xff08;Open Shortest Path First&#xff09;是一种广泛使用的链路状态路由协议&#xff0c;用于IP网络中的内部网关协议&#xff08;IGP&#xff09;。OSPF通过在网络中的所有路由器之间交换路由信息&#xff0c;选择从源到目的地的最优路径。OSPF工作在OSI模型的第…

Nginx系列(二)---Mac上的快速使用

一、安装 前置软件&#xff1a;Homebrew 安装方法&#xff1a;终端输入/bin/bash -c "$(curl -fsSL <https://cdn.jsdelivr.net/gh/ineo6/homebrew-install/install.sh>)"更新&#xff1a; brew update 设置中科大镜像源&#xff1a;git -C "$(brew --r…

昇思25天学习打卡营第10天 | 自然语言处理:RNN实现情感分类

1. RNN实现情感分类 1.2 概述 情感分类是自然语言处理中的经典任务&#xff0c;是典型的分类问题。本节使用MindSpore实现一个基于RNN网络的情感分类模型&#xff0c;实现如下的效果&#xff1a; 输入: This film is terrible 正确标签: Negative(负面) 预测标签: Negative输…

初识Spark

一、简介 官网&#xff1a;Apache Spark™ - Unified Engine for large-scale data analytics Apache的顶级项目&#xff0c;用于大规模数据处理的统一分析引擎。 支持语言&#xff1a;Java、Scala、Python和R (源码为Scala) 高级工具&#xff1a; 1、SparkSQL用于SQL和结构…

Linux中cat命令的英文含义

我之前一直在想cat不是猫的意思吗&#xff0c;但是cat命令在Linux中并不是指"猫"这个动物&#xff0c;而是来源于它的功能&#xff1a;concatenate&#xff08;连接&#xff09;和typeset&#xff08;打印&#xff09;。这个命令的名称是这两个功能的首字母缩写。尽管…

DevExpress WPF中文教程:Grid - 如何显示摘要(设计时)?

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

Mac/Linux安装JMeter压测工具

Mac安装JMeter压测工具 介绍 Apache JMeter™应用程序是开源软件&#xff0c;是一个100%纯的Java应用程序&#xff0c;旨在加载测试功能行为和衡量性能。它最初是为测试Web应用程序而设计的&#xff0c;但后来扩展到其他测试功能。 我能用它做什么&#xff1f; Apache JMet…

vue高德地图使用

先根据官方方法给vue项目引入高德 高德文档地址 做好准备后使用 初始化地图 AMap.plugin(AMap.MoveAnimation, () >{//地图this.map new AMap.Map("mapContainer", {resizeEnable: true,center: [116.397447,39.909176],//地图中心坐标zoom:12,//缩放值});this.…

Appium+python自动化(三十九)-Appium自动化测试框架综合实践 - 代码实现(超详解)

1.简介 今天我们紧接着上一篇继续分享Appium自动化测试框架综合实践 - 代码实现。由于时间的关系&#xff0c;宏哥这里用代码给小伙伴演示两个模块&#xff1a;注册和登录。 2.业务模块封装 因为现在各种APP的层出不群&#xff0c;各式各样的。但是其大多数都有注册、登录。为…

走在健康前沿:低GI食品认证与现代饮食的新篇章

随着现代社会节奏的加快&#xff0c;人们对健康饮食的追求也日益增强。在众多饮食理念中&#xff0c;低血糖生成指数&#xff08;GI&#xff09;食品凭借其对控制血糖和预防慢性疾病的潜在益处&#xff0c;逐渐成为健康饮食领域的明星。 GI的科学解码 GI&#xff0c;即食物血糖…

CTFHUB-SSRF-URL Bypass

开启题目 给出提示&#xff0c;url参数的值中必须包含有 http://notfound.ctfhub.com &#xff0c;可以采用&#xff0c;也就是 HTTP 基本身份认证绕过 HTTP 基本身份认证允许 Web 浏览器或其他客户端程序在请求时提供用户名和口令形式的身份凭证的一种登录验证方式。 也就是…

AIGC文生图lora微调训练案例;SD-Train界面训练stable Diffusion lora模型

lora仓库&#xff08;1000多个lora微调模型分享&#xff09;&#xff1a; https://lorastudio.co/models 1、命令代码方式&#xff1a;文生图lora微调训练案例 主要用huggingface相关包&#xff1a;peft、accelerate、diffusers 参考&#xff1a; https://huggingface.co/blo…

Swift 6:导入语句上的访问级别

文章目录 前言示例启用 AccessLevelOnImport破坏性变更采用这些更改总结前言 SE-0409 提案引入了一项新功能,即允许使用 Swift 的任何可用访问级别标记导入声明,以限制导入的符号可以在哪些类型或接口中使用。由于这些变化,现在可以将依赖项标记为对当前源文件(private 或…

PostgreSQL的pg_filedump工具

PostgreSQL的pg_filedump工具 基础信息 OS版本&#xff1a;Red Hat Enterprise Linux Server release 7.9 (Maipo) DB版本&#xff1a;16.2 pg软件目录&#xff1a;/home/pg16/soft pg数据目录&#xff1a;/home/pg16/data 端口&#xff1a;5777pg_filedump 是一个工具&#x…