AT32 MCU如何使用USB MSD 进行IAP升级?

电子说

1.3w人已加入

描述

IAP在线升级原理概述

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

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

MSD 图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

AT32 USB MSD IAP简介

USB MSD IAP是一个固件升级工具,它不依赖于其它上位机工具,可直接接入到PC或手机上进行设备的固件升级。

实现原理:将FLASH虚拟成一个存储设备让PC访问。

极其简单的操作步骤:

1) 将USB接口接入PC
2) PC识别到盘符“AT32 IAP”
3) 将需要升级的固件拷贝到AT32 IAP盘符里面
4) 升级完成

AT32 USB MSD IAP设计功能特点

IAP目前保留使用20K byte空间,APP的起始地址需在20K以后

使用USB大容量存储设备进行虚拟设备

升级后自动reset USB设备并返回升级状态

支持下载后自动读回进行CRC校验,保证固件正确性

支持设置下载地址(需按照page 2K对齐,并要大于IAP保留地址)

支持各种系统windows,linux,Android等

支持升级完成之后跳转到APP运行

支持BIN文件升级

支持HEX文件升级(后续版本添加)

支持加密文件升级(后续版本添加)

程序设计

地址空间

MSD 表1. 地址空间分布

升级状态

当连接Host之后,在盘符里面会对应有当前状态的TXT文档,根据文档名称不同来确定当前的状态。

准备升级状态(Ready.TXT)
升级成功(Success.TXT)
升级失败(Failed.TXT)
未知文件或错误(Unknown.TXT)
升级文件大于FLASH大小(Large.TXT)
注意:设备必须在Ready.TXT状态下才能进行升级,否则不会升级。

升级BIN档文件名格式

需指定下载地址(格式1)
文件名格式:(1Byte)A+(6Byte)offset+.BIN
如:要下载一个BIN文件到0x08005000为起始的地址空间去
文件名为:A005000.BIN

注意6Byte的offset地址需要保证在APP可使用的范围之内,否则将使用IAP内部默认的APP起始地址进行升级

当不满足格式1时,IAP 将使用内部默认APP的起始地址进行升级:

如:ABCDEFG.BIN,A11111.BIN,jkakkkddkfj.BIN

升级HEX档文件格式(后缀.HEX)

后续版本添加

升级加密档文件格式(后缀.SEC)

后续版本添加

使用Option Byte标志判断当前是否升级

IAP中使用Option Byte中HID[0]记录升级是否成功,当进入IAP时,设置HID[0]=1,当升级完成时设置HID[0]=0;当设备启动时,会自动判断HID[0]是否已升级固件,如果是,就跳转到APP地址执行,否就继续运行IAP。

跳转到APP code执行

当成功下载固件到FLASH之后,如果需要跳转到用户code执行,有两种方法:

1) Reset
2) 向识别到的AT IAP虚拟磁盘上拷贝一个JUMP.TXT的文件,注意这个文件的大小不能为0

使用AT32 USB MSD IAP进行升级

硬件资源

1) 指示灯LED2/LED3/LED4

2) USB(PA11/PA12)

3) AT-START-F403AV1.0实验板

MSD 图2. AT-START-F403A

注:该IAP demo是基于AT32F403A的硬件条件,若使用者需要在AT32其他型号上使用,请修改相应配置即可。

软件资源

1) SourceCode

AN0012_SourceCode_V2.0.0utilitiesAN0012_demo,IAP源程序

AN0012_SourceCode_V2.0.0libraries,AT32外设库

AN0012_SourceCode_V2.0.0middlewares,其他资源

2) Doc
《AN0012_USB_MSD_IAP_V2.x.x.docx》

Note:所有project都是基于keil 5而建立,若用户需要在其他编译环境上使用,请参考AT32F403A_407_Firmware_Libraryprojectat_start_f403atemplates中各种编译环境(例如IAR6/7/8,keil4/5)进行简单修改即可。

使用流程

1) 进入IAP Mode方式

如果已经升级过固件,一直按住User按键,再按Reset键,进入IAP模式(LED4闪烁),未升级时直接reset就会进入IAP模式。

MSD 图3. 进入IAP Mode按键

2) 连接USB设备到PC

MSD 图4. USB设备与PC连接

3) PC识别到AT32 IAP可看到Ready.TXT

MSD 图5. PC识别到AT32 IAP

4) 拷贝BIN档到磁盘目录下

MSD 图6. 拷贝Bin文件

5) 设备升级完成之后将Reset USB

此时重新打开磁盘,会有Success.TXT

MSD 图7. 设备升级完成提示

6) 升级结束

此时Reset或向识别到的AT IAP虚拟磁盘上拷贝一个大小不为0的JUMP.TXT文件,即可跳转到用户代码。

如果升级一次之后,不管是成功还是失败,如果需要再次升级,需要reset整个设备。设备进入Ready.TXT状态。

来源:AT32 MCU 雅特力科技
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理

 

审核编辑 黄宇

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分