如何使用AT32F407以太网通信接口实现在应用中编程(IAP)

iap概述
工作原理
在应用中编程(iap)是一种在现场通过 mcu 通信接口(例如 usart、usb、can 和以太网)进行固件升级的方式。
启动微控制器时,可以选择让其在以下任一模式运行:
iap模式,用于执行iap代码
正常模式,用于执行应用程序代码
无论是iap代码还是应用程序代码都位于微控制器的内置flash中,iap代码通常存储在mcu flash的第一页,而用户应用程序代码则占据剩余的flash区域。
图1介绍了iap操作流程
使用mcu以太网接口实现iap
如果有以太网可用,则它通常是嵌入式系统中实现iap功能的首选接口,其优势包含:
高速通信接口(10/100 mbps)
通过网络(lan或wan)进行远程编程
可以使用ftp、tftp、http等基于tcp/ip栈的标准应用协议实现iap
通过以太网在at32f407上实现iap
本应用笔记将介绍两种使用以太网通信外设在at32f407上实现iap的解决方案:
使用tftp(简单文件传输协议)的iap
使用http(超文本传输协议)的iap
这两种解决方案均基于lwip栈(2.1.2), 它是轻量级的tcp/ip协议栈
使用tftp实现iap方法
使用tftp实现iap的方法广泛应用于需要具有固件升级功能的嵌入式系统应用中(例如,嵌入式linux bootloader中)。
tftp是一种在udp传输层上执行的简单文件传输协议。此协议非常适合在局域网环境中使用。它基于客户端/服务器架构,在这种架构中,客户端会向服务器发出文件传输请求(读取或写入操作)。为实现iap,需要在lwip协议栈上实现一个简单的tftp服务器,服务器只须处理来自pc的tftp客户端的写入请求即可。
使用http实现iap方法
使用http协议进行固件升级没有使用tftp常见,但是在需要通过internet进行远程编程时,这种解决方案就显得极为有用。这时,需要使用tcp传输协议来实现http服务。
http基于tcp协议运行,它提供了一个一种以html表单形式从web客户端(mozilla firefox或microsoft internet explorer)发送一个二进制文件的方式。这称为http文件上传(rfc1867)。
本文档中的后续章节将详细介绍这两种iap方法的实现,并会对如何使用软件进行说明。
使用tftp实现iap
tftp概述
tftp是一种基于udp的简单文件传输协议。文件传输由tftp客户端发起,会向tftp服务器发送读取或写入请求。服务器确认请求后,即开始进行文件数据传输。数据将以固定大小的块尽情发送(例如每块含512个字节)。
必须在每个发出的数据块都得到接收方确认后,才可以发送下一个数据块。这种确认机制通过随各个数据块一同发送的编块号来实现。数据块小于固定块大小表示文件传输的结束。
图2描述了各种tftp数据包的格式:
图2 tftp数据包
表1列出了tftp操作码。
表1 tftp操作码
使用tftp为at32f407实现iap
此iap实现由基于lwip tcp/ip栈的tftp服务器组成。
此服务器会对远程tftp客户端(pc)发来的写请求做出响应。
tftp读请求会被忽略。
tftp通常会将接收到的文件写入到文件系统,但是该服务器却并非如此,它会将接受到的数据块写入到mcu flash(用户flash区域中)。
注:在这个实现过程中,数据块大小固定为512个字节。
图3概述了使用tftp实现iap操作的过程。
图3 使用tftp实现iap流程图
使用软件
要通过tftp对iap进行测试,需执行以下步骤:
1. 在iap.h文件中,取消use_iap_tftp选项的注释。
2. 重新编译软件。使用生成的映射文件,确保iap代码区域之间没有重叠(从地址0x0开始),而且用户flash区域从以下地址开始:app_start_sector_addr(在iap.h中定义)。
3. 在at32 flash中编写并运行软件程序。
4. 要进入iap模式,需要在按住开发版上的user key。
5. 分配完ip后(可以是静态或动态地址),用户即可启动iap流程。
6. 在pc侧,打开tftp客户端(例如tftpd64),然后配置tftp服务器地址(tftpd64中的主机地址)
7. 单击tftpd64实用程序中的put(写入)按钮,启动文件写请求
8. 在iap操作结束时,可以复位开发板并在at32 flash中运行刚刚编写的应用程序
图4 tftp64对话框
使用http实现iap
http文件上传概述
rfc1867中定义了使用http进行文件上传。此文件上传方法是基于http表单。发送原始二进制数据时,要使用http post方法而不是get方法。
以下是一个html代码示例,用于实现基于表单的文件上传:
图5 文件上传html表单的浏览器画面
注:在发送文件数据前,web客户端会首先发送http头文件数据,其中包含诸如文件名称和内容长度等信息,web 服务器必须对其中的一些信息进行解析。
web客户端使用的http头文件格式并不总是相同。图6显示的是internet explorer在post请求中的http头文件格式。图7显示的是mozilla firefox的http头文件格式。
http web服务器必须能够处理这些不同的格式。
图6 ie11 http头文件格式
图7 mozilla firefox http头文件格式
使用http在at32f407上实现iap
此iap实现由基于lwip栈的http web服务器组成。
在浏览器中输入的at32的ip地址后,将显示登录web页面(图8)。此登录web页面只有已获授权的用户才能使用iap文件上传功能。
图8 登录web页面
注:1. 默认的user id(用户id)为user, password(密码)为at32
2. 如果user id(用户id)或password(密码)不正确,登录web页面会重新加载。
登录成功后,浏览并选择要上传到at32 flash的二进制文件
注:确保二进制文件大小不超过at32用户flash区域的总容量。
单击upload(上传)按钮后(参见图x),将向服务器发出post请求。这时,服务器开始擦除用户flash区域的全部内容,等待接受二进制文件原始数据。然后将街收到的数据写入用户flash区域。
注意,要接收的数据总长度信息将从传输开始时发出的http头文件数据中提取。
在iap操作结束后,web页面将只是iap操作成功,同时显示一个可用于复位mcu的按钮。
图9 文件上传完成web页面
图10对使用http实现iap方法进行了总结
图10 使用http实现iap的流程图
使用软体
要使用http对iap进行测试,需执行以下步骤:
1. 在iap.h文件中,取消选项use_iap_http的注释。
2. 重新编译软件,使用生成的映射文件,确保iap区域代码之间没有重叠(从地址0x0开始),而且用户flash区域从以下地址开始:app_start_sector_addr(在iap.h中定义)。
3. 在at32 flash中编写并运行软件程序。
4. 要进入iap模式,需要再按住开发版上的user key。
5. 分配完ip地址后(可以是静态或动态地址),用户即可启动iap流程
6. 打开web客户端(mozilla firefox或internet explorer),输入at32 ip地址
7. 会显示登录web页面。在user id(用户id)字段中输入”user”,在password(密码)字段中输入”at32”,然后按下login(登录)按钮。
8. ip操作结束后,将加载新的web页面,只是文件上传操作已经成功完成。
9. 可以按下reset mcu(复位mcu)按钮复位mcu,然后在at32 flash中运行刚刚编写的应用程序。
注:使用以下web客户端对软件进行测试:microsoft internet explorer 11和mozilla firefox 80.0
已知限制
二进制文件中添加的额外字节
internet浏览器(microsoft internet explorere或mozilla firefox)会在上传的二进制文件的末尾添加一个随机边界标记(根据rfc1521规定,此标记不得超过72个字节)。在最新的iap软件版本中,并没有删除此边界标记,而是在空间足够的情况下将其存储在flash中。如果没有足够空间,则不会在flash中写入额外字节,也不会返回错误。
环境
硬件配置
1. dm9162以太网模块
2. at-start-f407开发板
3. 以太网线
软件源码
utilitiesat32f407_emac_iap_demosource_codebootloader, emac iap源程序,运行iap升级程序
mac地址和ip地址设置
在netconf.h文件中对mac地址进行了定义。
默认的mac地址固定为:00:00:44:45:56:01。
在netconf.h文件中对ip地址进行了定义。
ip地址可以设置为静态地址,也可以设置为由dhcp服务器分配的动态地址。默认的静态地址为:192.168.81.37。
可以通过在lwipopts.h文件中使能lwip_dhcp来选择dhcp模式。
软件文件组成
表2 介绍了项目源文件
注:表格中没有列出标准固件库和lwip栈中所使用的文件。
构建iap映像
为了构建iap映像(将会使用iap软件加载),应确保以下几点:
1. 编译/链接的软件必须从用户flash区域的起始地址开始运行(此地址应与iap.h的
app_start_sector_addr 中所定义的地址相同)。
2. 将向量表的起始地址配置为用户flash区域的起始地址:
a. 在应用程序代码中,使用misc.h/.c驱动程序的nvic_setvectortable函数来重新定位应用程序加载地址的向量表。
例如,将向量表基本位置设置为0x08010000:
nvic_setvectortable(nvic_vecttab_flash, 0x10000);
b. 通过修改system_at32f4xx.c文件中定义的vect_tab_offset常量的值。
例如,将向量表基本位置设置为0x08010000:
#define vect_tab_offset 0x10000
3. 编译后的软件大小不超过用户flash区域的总容量。
来源:at32 mcu 雅特力科技


中兴通讯已在全球部署了超过400个虚拟化网络商用实验局
区块链与互联网有哪些相似之处
锂电池充放电管理芯片,整套IC组合,长篇文章
18W音频放大器电路
钠离子电池工作原理
如何使用AT32F407以太网通信接口实现在应用中编程(IAP)
贝岭计量芯片BL0939-助您新一代电动自行车充电桩性能更高,成本更低!
工信部表示携号转网至少要到2020年才能在全国范围内推广
一种基于TPS61022的恒定且可调输出功率的加热单元供电方案
显卡买集显还是独显?一文看懂集显和入门独显的差距
利用LTC2380-24将分布式读取与链式模式相结合
修复笔记本电脑电池的方法有哪些?
VXLAN网关有哪些种类?VXLAN网络中报文是如何转发的?
STEAM教育解决方案提供商-孩想编,将于国内发布新品Crowbits壳乐拼
Nvdia 28nm显卡最新线路图曝光
龙芯芯片出货量突破50万颗,3A/3B5000系列主频可提升2.5GHz以上
CS5460A在单灯监控系统中的应用
超声波电机的原理以及内部结构的介绍
华为进军诺基亚总部,荣耀9芬兰上市售价几近国内两倍
STM32晶振器振问题