AT32 IAP using the USB HID

AN0007

应用笔记

AT32 IAP using the USB HID

前言

对于大多数基于闪存的系统,一项重要要求是能够在最终产品中安装固件时进行更新。此功能称为应用程序内编程(IAP)。

本应用笔记的目的是提供在AT32微控制器上创建IAP by USB HID应用程序的方法。

IAP_Programmer.exe上位机软件和嵌入式HID IAP示例的源代码位于BSP固件库的utilities文件夹

内。

支持型号列表:

支持型号

具备USB的型号

         注:仅支持有USB外设的型号

目录

1                   IAP 在线升级原理概述.. 5

2                   AT32 USB HID IAP快速使用方法.. 7

2.1        硬件资源... 7

2.2        软件资源... 7

2.3        IAP Programmer使用... 7

3                   AT32 USB HID IAP程序设置.. 9

3.1        地址分布... 9

3.2        bootloader project设置... 9

3.3        app设置... 9

3.4        IAP、APP与上位机通信流程... 10

4                   USB HID IAP Protocol 13

4.1        命令列表... 13

4.2        命令详解... 13

5                   版本历史.. 15

表目录

表1. 地址分布... 9

表2. 文档版本历史... 15

图目录

图1. IAP 代码执行流程... 5

图 2. IAP demo上位机... 8

图 3. bootloader project中add1在Keil设置... 9

图 4. bootloader project中add2在程序中设置... 9

图 5. app project中add2在Keil设置... 10

图 6. app源程序设置... 10

图 7. 上位机通信流程... 11

图 8. IAP端下位机通信流程... 12

  1. IAP 在线升级原理概述

IAP(In Application Programming)即在应用编程,IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级。通常实现IAP功能时,即用户程序运行中作自身的更新操作,需要在设计固件程序时编写两个项目代码,第一个项目程序不执行正常的功能操作,而只是通过某种通信方式(如USB、USART)接收程序或数据,执行对第二部分代码的更新;第二个项目代码才是真正的功能代码。这两部分项目代码都同时烧录在User Flash中,当芯片上电后,首先是第一个项目代码开始运行,它作如下操作:

  1. 检查是否需要对第二部分代码进行更新,
  2. 如果不需要更新则转到 4
  3. 执行更新操作
  4. 跳转到第二部分代码执行

1. IAP 代码执行流程

在图上图所示流程中,AT32复位后,还是从0X08000004地址取出复位中断向量的地址,并跳转到复位中断服务程序,在运行完复位中断服务程序之后跳转到IAP的main函数,如图标号①所示。在执行完IAP以后(即将新的APP代码写入AT32的FLASH,灰底部分。新程序的复位中断向量起始地址为0X08000004+N+M),跳转至新写入程序的复位向量表,取出新程序的复位中断向量的地址,并跳转执行新程序的复位中断服务程序,随后跳转至新程序的main函数,如图标号②和③所示,同样main函数为一个死循环,并且注意到此时AT32的FLASH,在不同位置上,共有两个中断向量表。

在main函数执行过程中,如果CPU得到一个中断请求,PC指针仍强制跳转到地址0X08000004中断向量表处,而不是新程序的中断向量表,如图标号④所示;程序再根据我们设置的中断向量表偏移量,跳转到对应中断源新的中断服务程序中,如图标号⑤所示;在执行完中断服务程序后,程序返回main函数继续运行,如图标号⑥所示。

通过以上两个过程的分析,我们知道IAP程序必须满足两个要求:

  1. 新程序必须在IAP程序之后的某个偏移量为x的地址开始
  2. 必须将新程序的中断向量表相应的移动,移动的偏移量为x
  1. AT3 USB HID IAP快速使用方法
    1. 硬件资源

文档中是用AT-START-AT32F403A 实验板的硬件条件为例,IAP demo 源代码还包括AT32 其他型

号,用户只需编译对应型号工程烧录于AT-START 实验板运行即可。

  1. 指示灯LED2/LED3/LED4
  2. USB(PA11/PA1
  3. AT-START实验板
    1. 软件资源
  1. APP_Release
  1. IAP_Programmer.exe  PC机tool
  1. source_code
  1. bootloader,IAP源程序,运行LED2闪烁 
  2. app_led3_toggle,app1 LED3闪烁源程序
  3. app_led4_toggle,app2 LED4闪烁源程序

注:源码位于AT32F403A_407_Firmware_Library_V2.x.x\utilities\at32f403a_407_usb_iap_demo\source_code示例工程基于keil v5IAR8.2建立,若用户需要在其他编译环境上使用,请参考AT32F403A_407_Firmware_Library_V2.x.x\project\at_start_f403a\templates中各种编译环境(例如IAR6/7/8,keil 4/5,eclipse_gcc)进行对应修改即可。

    1. IAP Programmer使用
  1. 打开bootloader源程序,编译后下载到实验板
  2. 打开IAP Programmer.exe
  3. 如图,选择USB设备,使用的是HID设备,因此不需要驱动
  4. 选择APP下载地址(下载地址需要与IAP设置的下载地址相同)和bin文档,选择是否需要CRC校验,点击Download下载
  5. 观察LED2/3/4闪烁,LED2闪烁-bootloader工作,LED3闪烁-app1工作,LED4闪烁-app2工作
  6. 支持断电保护,当程序没有download成功时,下次启动还在IAP模式

2. IAP demo上位机

  1. AT2 USB HID IAP程序设置
    1. 地址分布

1. 地址分布

ITEM

Address and Size

app code

Add2:0x800 4000 ~

bootloader code

Add1:0x800 0000   size:0x4000(16K Byte)

Note     :bootloader区域最后一个扇区,用于放置防掉电丢失的flag,用户修改bootloader时请勿操作该段地址。

    1. bootloader project设置
  1. Keil设置

3. bootloader project中add1在Keil设置

  1. bootloader源程序修改

hid_iap_user.h文件中

4. bootloader project中add2在程序中设置

#define FLASH_APP_ADDRESS                0x08004000

    1. app设置

该demo提供了2个app程序供测试用,皆以add2(0x800 4000)为起始地址。app1 LED3闪烁,app2 LED4闪烁。以app LED3为例,设计步骤如下:

  1. Keil工程设置

5. app project中add2在Keil设置

  1. app 源程序设置

修改main.c 中的中断向量偏移

图 6. app源程序设置

中断向量表的偏移量设置

/* config vector table offset */

nvic_vector_table_set(NVIC_VECTTAB_FLASH, 0x4000);

  1. 编译生成bin文件

通过在User选项卡,设置编译后调用fromelf.exe,根据.axf文件生成.bin文件,用于IAP更新。

以上3个步骤,我们就可以得到一个.bin的APP程序,通过bootloader程序即可实现更新。

  1. 开启debug app code功能

如果在设计app code过程中需要对app project进行单独调试,请按照以下操作。

  1. 下载bootloader project
  2. 第一次使用debug功能需要IAP Programmer .exe 成功下载一次app.(成功下载之后会写flag,表示下次从app启动。默认flag会从bootloader启动)
  3. debug app project
    1. IAP、APP与上位机通信流程
  1. 上位机通信流程

7. 上位机通信流程

 

  1. IAP 端下位机通信流程

8. IAP端下位机通信流程

注意:具体协议请参考AT32_HID_IAP_Protocol.pdf

  1. USB HID IAP Protocol

本节描述USB HID 升级协议,使用此协议与上位机进行通信,达到升级固件的目的。

    1. 命令列表

命令值

描述

0x5AA0

进入IAP模式

0x5AA1

开始下载

0x5AA2

设置地址(按1K对齐)

0x5AA3

下载数据命令

0x5AA4

下载结束

0x5AA5

CRC校验

0x5AA6

跳转命令(跳转到用户code)

0x5AA7

获取IAP设置的User Code地址

注意1HID MaxPacket = 64Byte

注意2:每一个包的前面两个Byte固定为命令

注意3:命令按照MSB,LSB的顺序传输

ACK0XFF00 NACK0x00FF

    1. 命令详解
  1. 0x5AA0进入IAP模式

作为一个特定的命令,当用户APP收到这个命令之后将进入IAP模式。实现方式为收到这个命令之后擦除flag然后reset

上位机:[0x5A, 0xA0]

IAP设备响应:[0x5A, 0XA0, ACK/NACK]

  1. 0x5AA1 开始下载

上位机:[0x5A,0xA1]

IAP设备响应: [0x5A,0xA1,ACK/NACK]

  1. 0x5AA2设置下载地址

设置下载地址需按照1KB对齐,每下载1Kbyte数据之后,都需要重新设置下载地址。

上位机(命令+地址):[0x5A, 0xA2, 0x08, 0x00, 0x40, 0x00]

IAP设备响应:[0x5A,0xA2, ACK/NACK]

  1. 0x5AA3 下载数据命令(1KB 对齐多个包发送)

下载数据命令采用 命令+长度+数据的格式进行发送,每包最大数据量为60Byte (64 – 命令 – 长度),当发送数据达到1KB时,上位机需要等待设备的ACK响应。此时设备需将1KB的数据写到FLASH。

上位机(命令(2Byte)+长度(2 Byte)+数据(n byte)):[0x5A,0xA3,LEN1, LEN0,DATA0….DATAn]

收完1KB数据后IAP设备响应:[0x5A, 0XA3, ACK/NACK]

  1. 0x5AA4 下载结束

上位机:[0x5A, 0xA4]

IAP设备响应:[0x5A, 0xA4, ACK/NACK]

  1. 0x5AA5 固件CRC校验

上位机传输固件起始地址和固件大小/1KB(固件大小按1KB对齐,不足补0xFF),由IAP计算CRC之后返回给上位机。

上位机:[0x5A,0xA5, 0x08, 0x00, 0x40, 0x00, LEN1, LEN0]

IAP设备响应: [0x5A, 0xA5, ACK/NACK, CRC3, CRC2, CRC1, CRC0]

  1. 0x5AA6 跳转命令

跳转命令将跳转到用户代码进行运行

上位机:[0x5A,0xA6, 0x08, 0x00, 0x40, 0x00]

IAP设备响应: [0x5A,0xA6,ACK/NACK]

  1. 0x5AA7 获取IAP设置的app地址

返回IAP设置的app地址

上位机:[0x5A, 0xA7]

IAP 设备响应:[0x5A, 0xA7, ACK/NACK, 0x08, 0x00, 0x40, 0x00]

  1. 版本历史

2. 文档版本历史

日期

版本

变更

2021.09.02

2.0.0

初始版本

2022.01.17

2.0.1

修改截图中芯片型号

2023.02.08

2.0.2

增加sourcecode在BSP中的路径描述

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值