本帖最后由 林堪堪 于 2023-3-21 14:09 编辑
完整文档及工具及示例代码,请下载附件。
前言 对于AT32 MCU,除了出厂固化的bootloader,用户也可以在应用程序中编写自己的bootloader程序,用于最终产品的固件更新。此功能称为应用程序内编程(IAP)。 本应用笔记的目的是提供在AT32微控制器上创建IAP应用程序的一般准则。 AT32微控制器可以运行用户特定的固件来对微控制器中嵌入的闪存执行IAP。此功能可以使用产品可用和支持的任何通信接口。本应用笔记使用自定义CAN协议实现IAP功能。 此应用笔记包含如下程序: l IAP_Programmer.exe上位机软件和 l 嵌入式IAP CAN示例的源代码 l 嵌入式APP CAN示例的源代码 l USB转CAN示例源代码
支持型号列表:
目录 1 概述... 5 1.1 AT32 CAN IAP快速使用方法... 5 1.1.1 硬件资源... 5 1.1.2 软件资源... 5 1.2 IAP demo使用... 6 2 AT32CAN IAP程序设置.. 7 2.1 地址分布... 7 2.2 执行流程... 7 2.3 bootloader project设置... 7 2.4 app project设置... 8 3 BootloaderCAN通信协议.. 10 3.1 上位机升级流程... 10 3.2 IAP 端下位机通信处理流程... 10 3.3 升级命令详解... 11 3.3.1 Get Info 命令... 11 3.3.2 UpgradeStart 命令... 12 3.3.3 ReadMmeory 命令... 12 3.3.4 WriteMemory命令... 12 3.3.5 Get CRC命令... 13 3.3.6 JUMP命令... 13 3.3.7 UpgradeFinish 命令... 13 4 USB转CAN桥接... 14 4.1 数据转发流程... 14 4.2 USB CAN数据转发... 14 5 版本历史.. 16
1 概述1.1 AT32 CAN IAP快速使用方法使用CAN进行IAP升级,此示例使用PC上位软件(IAP_Programmer.exe)通过一个USB转CAN的桥接设备和目标板进行通信, IAPDemo和桥接设备默认CAN 波特率使用500K。
如下是连接示意图: l PC 通过USB连接USB to CAN Bridge(使用AT-START实现一个转接设备,代码参考usb_vcp_bridge_can源代码) l USB to CAN Bridge 通过CAN Transceiver 连接 CAN 目标板(注意使用CAN必须要使用CAN Transceiver, CANL连接CANL, CANH连接CANH) 图1 连接示意图
1.1.1 硬件资源1. USB转CAN桥接板 (目前使用一块AT-START-AT32F403A实现USB转CAN) 1) USB(PA11/PA12) 2) CAN(PB8/PB9) 3) 指示灯 LED2/LED3/LED4 4) AT-START实验板
2. AT-START-AT32F403A CAN IAP目标板 1) 指示灯LED2/LED3/LED4 2) CAN(PB8/PB9) 3) AT-START实验板 3. CAN Transceiver 转接板 CAN Transceiver 转接板用于USB to CAN Bridge 和 CAN 目标板的连接 注意:USB转CAN桥接板的波特率和CAN IAP目标板波特率要配置一致 另外要使用CAN通信,必须外接CAN转换芯片。 1.1.2 软件资源 1) ToolRelease n IAP_Programmer.exe,PC机tool,用于演示IAP升级流程 n IAP_Programmer_V2.x.x,PC tool 源代码 2) SourceCode\utilities n can_iap_demo,IAP源程序,运行LED2闪烁 n usb_vcp_bridge_can,USB转CAN桥接源程序 n can_app_led3_toggle,app1源程序,运行时LED3闪烁 n can_app_led4_toggle,app2源程序,运行LED4闪烁 注:示例工程基于keil v5建立,若用户需要在其他编译环境上使用,请参考AT32F403A_407_Firmware_Library_V2.x.x\project\at_start_f403a\templates中各种编译环境(例如IAR6/7/8,keil 4/5, eclipse_gcc)进行对应修改即可。
1.2 IAP demo使用1) 打开can_iap_demo工程源程序,选择对应MCU型号的target编译后下载到实验板 2) 打开usb_vcp_bridge_can工程源程序,下载到USB转CAN转接板 3) 连接转接板和目标板的CANH/CANL 4) 将转接板USB接入到PC,可以看到会有对应的虚拟串口设备COMxx 5) 打开IAP_Programmer.exe 6) 选择正确的串口、APP下载地址和bin文档,点击Download下载,如下图 7) 观察LED2/3/4闪烁,LED2闪烁canIAP工作,LED3闪烁-app1工作,LED4闪烁-app2工作 图2. IAPdemo上位机
2 AT32 CAN IAP程序设置2.1 地址分布表1. 地址分布 ITEM | | | address 2: 0x800 4000 size: 0x40000(256K Byte) | | address 1: 0x800 0000 size: 0x4000(16K Byte) |
注:bootloader区域最后一个扇区,用于存放防止升级过程掉电的flag,用户编译修改bootloader时,要保证不覆盖flag的地址。
2.2 执行流程IAP分为Bootloader和App两部分,应用在App中执行,升级过程在bootloader中执行。程序执行整体流程框图如下:
2.3 bootloader project设置1) Keil设置 图4. bootloader project中address 1在Keil设置
2) bootloader源程序修改Iap.h文件中 bootloaderproject中address 2在程序中设置: /*app start address*/
#define FLASH_APP_ADDRESS 0x08004000
2.4 app project设置IAP demo提供了2个app程序供测试用,皆以address 2(0x800 4000)为起始地址。app1 LED3闪烁,app2 LED4闪烁。以app1为例,设计步骤如下: 1) Keil工程设置 图6. app project中address 2在Keil设置
2) app1 源程序设置 图7. appproject向量表偏移在程序中设置 中断向量表偏移地址修改:
3) 编译生成bin文件 通过User选项卡,设置编译后调用fromelf.exe,根据.axf文件生成.bin文件,用于IAP更新。 通过以上3个步骤,我们就可以得到一个.bin的APP程序,通过bootloader程序即可实现更新。 4) 开启debugapp code功能 如果在设计app code过程中需要对app project进行单独调试,请按照以下操作。 a) 先下载bootloader工程 b) 再调试app工程
3 Bootloader CAN通信协议3.1 上位机升级流程如下下图是上位机升级流程: l 获取设备信息:包括app起始地址,app flash size大小,sector size 大小 l 发送开始升级命令 l 写存储器 l 获取CRC进行校验 l 发送升级完成命令 l 跳转到APP执行 具体命令操作参考命令详解 图8. 上位机升级流程
3.2 IAP 端下位机通信处理流程IAP下位机端会通过接收主机端发送的命令做数据处理,包括读写数据,crc校验等。 图9. IAP 端下位机命令
注: ACK: 0x79 NACK: 0x1F
3.3 升级命令详解本节主要说明CAN IAP每条协议命令的作用和使用方法,包括主机端和设备端对命令解析的流程。 所有命令通过CAN标准帧的ID 来确定,CAN每一包数据最大8字节,例如Get Info命令,此时CAN 标准帧的ID 为0。 注意:所有命令都使用标准帧数据帧来传递 如下是命令列表 命令 | | | | | 获取APP信息,app起始地址,app flash size,sector size | | | | | | | | | | | | | | | | | | | | | |
3.3.1 Get Info 命令此命令用于获取APP信息,包括APP起始地址,app flash size 大小,sector size大小 主机端协议发送流程: 发送消息 | | | | | | |
| | | | |
| | | | | 当收到NACK时,等待1s,继续发送Get info 命令,一直到回ACK之后再走后面流程。
|
| | | | 1: Address MSB 2: Address
3: Address
4: Address LSB 5: app size MSB 6: app size
7: app size
8: app size LSB
| |
| | | | 1: Sector size MSB 2: Sector size
3: Sector size
4: Sector size LSB
| |
3.3.2 Upgrade Start 命令获取设备信息之后,可以发送此命令开始升级,设备端收到此命令之后会去删除一个app的标志,标志在开始升级。 主机端协议发送流程:
3.3.3 Read Mmeory 命令此命令用于读取app flash 数据 主机端协议发送流程: [td] 发送消息 | | | | | | |
| | | 1: Address MSB 2: Address
3: Address
4: Address LSB 5: Length MSB
6: Length LSB
| |
| | | | | |
| | | | | |
| | | | | |
| |
| | | |
3.3.4 Write Memory命令此命令用于写APP数据到存储器,注意每次写入的地址必须sector对齐(sector大小可通过Get Info获取),数据的长度为1个sector大小或者小于1个sector。每个sector的数据最好是一次发完。 主机端协议发送流程: 发送消息 | | | | | | |
| | | 1: Address MSB 2: Address
3: Address
4: Address LSB 5: Length MSB
6: Length LSB
| |
| | | | | | |
| | | | | |
| | | | | |
| | | | |
| | | | | |
3.3.5 Get CRC命令此命令用于获取指定地址指定大小数据的CRC,地址和大小必须4字节对齐
主机端协议发送流程: 发送消息 | | | | | | |
| | | 1: Address MSB 2: Address
3: Address
4: Address LSB 5: Length MSB
6: Length 7: Length
8: Length LSB
| |
| | | | | |
| | | | | |
3.3.6 JUMP命令此命令用于跳转到APP代码执行 主机端协议发送流程: 发送消息 | | | | | | |
| | | 1: Address MSB 2: Address
3: Address
4: Address LSB
| |
| | | | | |
3.3.7 Upgrade Finish 命令此命令用于设置升级完成标志。 主机端协议发送流程:
4 USB转CAN桥接USB 转CAN桥接使用一块AT32F403A的AT-START开发板实现,USB端实现一个虚拟串口设备,转接板通过USB与PC上位机通信,然后通过CAN与下位机进行通信,实现USB与CAN数据的透传功能。注意转接板的CAN波特率与下位机的CAN波特率要配置相同。
4.1 数据转发流程如下是数据转发流程 图 10 数据转发流程
4.2 USB CAN数据转发USB转CAN桥接按照CAN协议进行封装,封装格式: 标准帧ID(1字节)+帧长(1字节)+数据(数据最大8字节)
USB 数据转到CAN总线: USB到CAN按照一包USB数据转成一帧CAN数据。 收到一包USB数据如:0x01 0x02 0x11 0x22 0x01:表示标准帧ID 0x02:表示数据长度 0x11,0x22:表示具体数据
转换成CAN 帧后: ID=0x01 DLC=0x02 DATA0=0x11 DATA1=0x22
CAN总线数据转到USB: CAN同样按照一帧数据转换成一包USB数据: 收到一帧CAN数据:ID=0x02,DLC=0x03, DATA0=0x11, DATA0=0x22 ,DATA0=0x33
转换成USB包之后:0x02 0x03 0x11,0x22,0x33 0x02:表示标准帧ID 0x03:表示数据长度 0x11,0x22,0x33:表示具体数据
以Write Memory为例写32字节数据到0x08004000 主机端流程: 发送1:0x31 0x6 0x08 0x00 0x40 0x00 0x00 0x20 (ID+长度+6字节数据) 接收1:0x31 0x01 0x79 (ID+长度+ACK) 发送2:0x31 0x8 0xAA 0xAA 0xAA 0xAA 0xAA 0xAA 0xAA 0xAA(ID+长度+8字节数据) 发送3:0x31 0x8 0xAA 0xAA 0xAA 0xAA 0xAA 0xAA 0xAA 0xAA(ID+长度+8字节数据) 发送4:0x31 0x8 0xAA 0xAA 0xAA 0xAA 0xAA 0xAA 0xAA 0xAA(ID+长度+8字节数据) 发送5:0x31 0x8 0xAA 0xAA 0xAA 0xAA 0xAA 0xAA 0xAA 0xAA(ID+长度+8字节数据)
|
很好的资源,学习啦~~