大家对STM32系列单片机可通过串口(Ymodem)烧写应用程序这事儿肯定不陌生。其官网的AN2557例程已经把它描述得很详细很详细了。串口烧程序这事儿不赖,挺方便,咱再也不用专门的烧写器以及烧写软件去上传程序了,不过缺陷就是距离。模块在北京,人在上海,这咋控制?这时候如果能通过网口烧写程序,那就太爽啦。今天,咱就用WIZnet的W7100试上一把。反正,w7100是硬件的TCPIP芯片,用不着咱在协议栈上想太多,咔咔,调用驱动里的API函数就妥了,方便至极!
---实现平台与工具
硬件平台 |
编译平台 |
软件平台 |
iMCUW7100 EVB |
KeilC (Ver3) |
Uploader (vb.net) |
---例程介绍
对于一个内嵌有FLASH的系统来说,其最最重要的一个功能就是得让用户轻松地更新应用程序。这功能的官话是in-application programming(IAP).大家可以注意到,我一直在强调更新的是“应用程序”而不是“程序”,之所以这样说,是想让大家建立一个Boot+App的概念。您更新程序的时候,是谁在帮您接受外部传送来的代码啊,又是谁在帮您擦除FLASH啊,又是谁在帮您写FLASH啊,这都是Boot帮您干的。本例程就是帮您实现了一个基于网口烧写程序的Boot+App。我习惯把这样的Boot叫做Network_Boot.
1> 工作流程
请看下图。详细过程请参考文章结尾附加的代码。
① -> Uploader把要更新的程序上传至W7100的接收缓存(Rx buffer)
② -> 利用W7100驱动中的API函数,将缓存中的程序拷贝至W7100的sRAM。
③ -> 最后再利用W7100的FLASH写函数,将sRAM中的程序移至到code FLASH中,从而完成更新。
相关API函数:
Name |
Position (in w7100 driver) |
Function |
---- |
H/W TCPIP core |
① |
recv() |
socket.c |
② |
ISP_sector_prog() |
isp.h |
③ |
提示: 过程① 和 ② 是由App代码完成的,过程③ 是由Network_Boot完成的.
2> 上传程序时,上传助手与W7100之间的简单通信协议
1)Searching module request:
Search request command format (“WIZNETFIND”)
2) Response for searching:
Search response format
提示: Header 的内容和前面的searching request command是一摸一样的。
3) FW upgrading request:
FW upgrading request command format (“WIZNETFWUP”+fw_size)
提示:fw_size = fwsize_h*256 + fwsize_l
4) Response for upgrading
FW upgrading response format (“WIZNETFWUPSYNACK”)
5) FW upgrading:
上传助手每次上传1K字节的代码至W7100,当剩余代码量小于1K时,上传助手上传其实际长度。
6) ACK for upgrading:
每当W7100接收到代码后,它都向上传助手回馈其接收到的总代码量。当sRAM中的代码量与上传助手在FW upgrading request时传递的fw_size参数一致时,更新结束。
3> 演示:
拓扑结构:
上电:
通过上传助手查找W7100:
更新程序:
提示: WIZ_BJ_0001.bin是要更新的程序。上传助手上传的就是它!
提示:WIZ_BJ_0001.bin + WIZ_BJ_BOOT.bin = WIZ_BJ_0001p.bin
这个带“p”的bin文件是network_boot+app的文件,两者合二为一了。当您要往w7100烧写network_boot的时候就用着这个合二为一的文件了。当然,烧写的时候得用WIZISP。因为这时候W7100里还没有咱的network_boot.
应用测试:
用户打开这个名为SOCKTEST.exe的测试软件。把软件作为TCP Client去连接W7100(Server)。连接成功后发送数据,W7100接收到后会把接收到的数据再回传给这个SOCKET.exe 下图中,我随便输入了“1234”做测试。