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

发布者:Jinghua6666最新更新时间:2024-12-12 来源: elecfans关键字:GD32F303 手机看文章 扫描二维码
随时随地手机看文章

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进行连接。

wKgaomaGAHCAVBTIAACywOVWKjY019.png?imageView2/2/w/1000


连接成功后,显示如下图所示,connect按钮变成disconnect,且在左下角显示芯片信息。

wKgaomaGAI2AZ7MuAAC3sempS_o859.png?imageView2/2/w/1000


右侧栏目即为USB IAP可实现的功能,主要包括载升级代码,其他功能为灰色不能操作。点击Browse选择下载bin或者hex文件,之后点击download即可进行下载,下载完成后,进度条显示100%,即完成升级下载。

wKgZomaGAJuAOvBaAADCpKjlR5w856.png?imageView2/2/w/1000

关键字:GD32F303 引用地址:【GD32F303红枫派开发板使用手册】第二十九讲 USB-IAP升级实验

上一篇:【GD32F303红枫派开发板使用手册】第二十六讲 EXMC-液晶驱动实验
下一篇:【GD32F303红枫派开发板使用手册】第二十三讲 SDIO-SD卡读写实验

推荐阅读最新更新时间:2026-03-23 11:24

GD32F303红枫开发板使用手册】第十一讲 ADC-电源电压单通道ADC检测实验
通过本实验主要学习以下内容: ADC的简介 GD32F303 ADC工作原理 查询方式实现ADC单通道采样 11.2实验原理 11.2.1ADC原理 我们知道,自然界中有非常多的模拟信号,比如上一节提到的光照强度,还有其他的例如温度、声音等等,那么人们是怎么来衡量一个模拟信号的呢? 我们通常会说今天光照度达到了3万Lux(照度单位),现在测量到的体温是36.5℃,我们所处的环境是40分贝,没错,人们就是通过将这些模拟信号数字化,从而达到衡量这些模拟信号的目的。那对于MCU来说,如果要测量一个模拟量,可以通过自带的ADC(Analog-to-Digital converters)模块,即模-数转换器将模拟量转化为可以被M
[单片机]
【<font color='red'>GD32F303</font><font color='red'>红枫</font><font color='red'>派</font><font color='red'>开发板</font>使用手册】第十一讲 ADC-电源电压单通道ADC检测<font color='red'>实验</font>
GD32F303红枫开发板使用手册】第二十一讲 I2C-EEPROM读写实验
21.1实验内容 通过本实验主要学习以下内容: AT24C16 EEPROM的工作原理; IIC模块原理以及IIC驱动原理。 21.2实验原理 21.2.1AT24C16 EEPROM的工作原理 下图为AT24CXX系列EEPROM相关参数,由该图可知,AT24C16的存储容量为16Kbit,共2048字节,共128页,每页为16字节。 由下图可知,AT24C16由8块组成,每块256字节。 I2C开始信号后,第一个字节为器件地址,由1010+3位块地址+1位读写标志组成,3位块地址刚好可以表示8个块, 所以一次写完256字节,换到下一下块的时候,要重新更改器件地址。 AT24C16支持页写入模式,一次最多可支持
[单片机]
【<font color='red'>GD32F303</font><font color='red'>红枫</font><font color='red'>派</font><font color='red'>开发板</font>使用手册】第二十一讲 I2C-EEPROM读写<font color='red'>实验</font>
GD32F303红枫开发板使用手册】第十二讲 ADC-双轴按键摇杆多通道循环采样实验
12.1实验内容 本实验是通过ADC规则组多通道循环采样方式实现双轴按键摇杆传感器x和y轴电压值的读取,通过本实验主要学习以下内容: 双轴按键摇杆传感器工作原理 DMA原理 规则组多通道循环采样 12.2实验原理 12.2.1双轴按键摇杆传感器工作原理 摇杆一般在航模中的无人机、电玩、遥控车、云台等设备上应用广泛,很多带有屏幕的设备也经常使用摇杆作为菜单选择的输入控制。 双轴按键摇杆主要由两个电位器和一个按键开关组成,两个电位器随着摇杆扭转角度分别输出X、Y轴上对应的电压值,在Z轴方向上按下摇杆可触发轻触按键,在配套机械结构的作用下,无外力扭动的摇杆初始状态下,两个电位器都处在量程的中间位置。 12.2.2DMA原
[单片机]
【<font color='red'>GD32F303</font><font color='red'>红枫</font><font color='red'>派</font><font color='red'>开发板</font>使用手册】第十二讲 ADC-双轴按键摇杆多通道循环采样<font color='red'>实验</font>
GD32F303红枫开发板使用手册】第四讲 GEXTI-按键中断检测实验
4.1实验内容 通过本实验主要学习以下内容: EXTI中断原理; 按键中断检测原理; 4.2实验原理 4.2.1NVIC中断向量控制器 介绍EXTI之前,首先为各位读者介绍NVIC中断向量控制器,NVIC为M4内核组件,用于实现高效的异常和中断处理。NVIC可以支持抢占以及咬尾中断,具有多达68种外设中断以及4位中断优先等级配置(最多支持16个中断有限等级),当中断或异常产生时,系统自动将当前处理器工作状态压栈,在执行完中断服务子程序(ISR) 后自动将其出栈。 GD32F303系列MCU的中断向量表如下表所示(包含异常中断)。 有关NVIC中断相关配置函数可参考gd32f30x_misc.c,其中主要有以下几个函数
[单片机]
【<font color='red'>GD32F303</font><font color='red'>红枫</font><font color='red'>派</font><font color='red'>开发板</font>使用手册】第四讲 GEXTI-按键中断检测<font color='red'>实验</font>
GD32F303红枫开发板使用手册】第十三讲 ADC-内部温度传感器和参考电压采样实验
13.1实验内容 本实验是通过ADC注入组采样内部温度传感器和参考电压,通过本实验主要学习以下内容: 内部温度传感器和参考电压简介 ADC注入组采样配合ADC中断应用 13.2实验原理 13.2.1内部温度传感器和参考电压简介 GD32F303有两个内部通道,分别为内部温度传感器(ADC0_CH16)和内部参考电压Vrefint(ADC0_CH17)。 温度传感器可以用来测量器件周围的温度。温度传感器的输出电压随温度线性变化,由于生产过程的多样化,温度变化曲线的偏移在不同的芯片上会有不同(最多相差45°C)。内部温度传感器更适合于检测温度的变化,而不是测量绝对温度。如果需要测量精确的温度,应该使用一个外置的温度传感器来校准这
[单片机]
【<font color='red'>GD32F303</font><font color='red'>红枫</font><font color='red'>派</font><font color='red'>开发板</font>使用手册】第十三讲 ADC-内部温度传感器和参考电压采样<font color='red'>实验</font>
GD32F303红枫开发板使用手册】第三十讲 CAN -CAN通信实验
30.1实验内容 通过本实验主要学习以下内容: CAN的简介 GD32F303 CAN工作原理 通过CAN实现回环收发 30.2实验原理 30.2.1CAN概述 CAN 是Controller Area Network的缩写,是由德国BOSCH公司开发的,已成为ISO国际标准化的串行通信协议。其主要应用场合为汽车和工业控制。CAN具有传输距离长,传输可靠、强大的纠错机制等特点,其高性能和可靠性已被广泛认同,现在已经成为汽车、工业自动化、医疗设备等领域应用最广泛的总线之一。 30.2.2CAN总线拓扑 CAN总线拓扑图如下: CAN 控制器根据两根线上的电位差来判断总线电平,一般将两根线分别命名为CAN_H和CAN_L。
[单片机]
【<font color='red'>GD32F303</font><font color='red'>红枫</font><font color='red'>派</font><font color='red'>开发板</font>使用手册】第三十讲 CAN -CAN通信<font color='red'>实验</font>
GD32F303红枫开发板使用手册】第六讲 PMU-低功耗实验
6.1实验内容 通过本实验主要学习以下内容: PMU原理; 低功耗的进入以及退出操作; 6.2实验原理 6.2.1PMU结构原理 PMU即电源管理单元,其内部结构下图所示,由该图可知,GD32F303系列MCU具有三个电源域,包括VDD/VDDA电源域、1.2V电源域以及电池备份域,其中,VDD /VDDA域由电源直接供电。在VDD/VDDA域中嵌入了一个LDO,用来为1.2V域供电。在备份域中有一个电源切换器,当VDD/VDDA电源关闭时,电源切换器可以将备份域的电源切换到VBAT引脚,此时备份域由VBAT引脚(电池)供电。 VDD/VDDA电源域 VDD 域为数字电源域包括HXTAL(高速外部晶体振荡器)、LDO
[单片机]
【<font color='red'>GD32F303</font><font color='red'>红枫</font><font color='red'>派</font><font color='red'>开发板</font>使用手册】第六讲 PMU-低功耗<font color='red'>实验</font>讲
GD32F303红枫开发板使用手册】第三讲 GPIO-按键查询检测实验
3.1实验内容 通过本实验主要学习以下内容: GPIO输入功能原理; 按键查询输入检测原理; 3.2实验原理 3.2.1GPIO输入功能原理 GD32F303系列MCU GPIO输入配置结构如下图所示,输入可配置上下拉电阻,通过施密特触发器后可通过备用功能输入或者通过输入状态寄存器进行读取。 输入状态寄存器为GPIOx_ISTAT,其状态位定义如下图所示,每个控制位对应相应引脚的输入电平状态。 GPIO引脚输入电平判断阈值如下图所示,当输入电平小于0.3VDD时,可被内部有效识别为低电平;当输入电平大于0.7VDD时,可被内部有效识别为高电平。 3.3硬件设计 GD32F303红枫派开发板具有四个按键,对应电路图
[单片机]
【<font color='red'>GD32F303</font><font color='red'>红枫</font><font color='red'>派</font><font color='red'>开发板</font>使用手册】第三讲 GPIO-按键查询检测<font color='red'>实验</font>
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved