发新帖本帖赏金 50.00元(功能说明)我要提问
返回列表
[APM32F4]

LWIP升级代码

[复制链接]
10707|12
手机看帖
扫描二维码
随时随地手机跟帖
夜声|  楼主 | 2024-3-25 23:00 | 显示全部楼层 |阅读模式
#申请原创# @21小跑堂

1.LWIP
1.1LWIP简介
LwIP 是一款轻量化的 TCP/IP 协议,是瑞典计算机科学院(SICS)的 AdamDunkels 开发的一个小型开源的 TCP/IP 协议栈。在保持 TCP 协议主要功能的基础上减少对资源的占用。此外 LwIP 既可以移植到操作系统上运行,也可以在无操作系统的情况下独立运行。可以在网页http://savannah.nongnu.org/projects/lwip/,下载获取到 LwIP 的各个版本的源代码包和对应的contrib 包。
本次计划基于上一篇LWIP移植的基础上实现LWIP网络传输固件进行升级。
1.2硬件设计
开发板使用 APM32F407 控制器通过 RMII 接口和 SMI 接口与 LAN8720A 以太网 PHY 进行连接。通过接下拉电阻把 nINTSEL 引脚设置为低电平,从而使能 nINT/REFCLKO 引脚的输出功能为RMII 接口中 REF_CLK 信号线提供时钟信号,硬件上 XTAL1 与 XTAL2 之间接入提供 25MHz时钟,经过 LAN8720A 内部 PLL 电路陪频后使得 nINT/REFCLKO 引脚的输出的时钟信号为50MHz 时钟。
68e95e0ac7a93e993326fe5be0647555
2.移植步骤
2.1Bootloader配置
本次由于在bootloader程序中添加了lwip的代码,需要将bootloader的大小调整一下,初步编译了一下,大概占用30k左右的样子,这里进行试验就调整大一点,200k
4741f745bb1c15d62e2f8ffec700e84b
应用程序配置,只需要调整APP的起始地址即可。
f6c7ea089e3e189337ad9571ee6985e7
同时应用APP程序中只需要一个简单的例子即可,2s闪烁一次LED
efe2e9ab75e2af09371a1f488b2f6956
接下来在bootloader建立TcpServer服务器,端口设置为80,代码基于lwip移植和串口IAP升级的工程合并而成。
b8199f2d610f112b8f217fc4cd18e5dd
Lwip接收数据回调函数,连接收向服务器发送消息证明建立通讯
1556b3e671ac2287b704eb5ab2271968
接下来就是接收数据后的回调函数,先将接收的数据返回发送到服务器
ca57bbc9fabb7e3fee1a71c0e917f025
实现Tcpserver这个功能后在实现代码升级的部分,然后初始化函数放在主函数中初始化。
0eb5ec8b66ba4a5f6ed3886e3e18e97d
打开网络测试工具,先ping一下,ping正常
4cac05d75bb7d8ce3e6aca686c09327d
接下来点击打开TCP,可以发现lwip Tcpserver connect  这串字符上传,这是代码里面写的,说明成功,接下来向服务器发送数据11,返回11。说明功能已正常使用
d629389592d550d0cfc59b158651bd98
2.2网络固件传输调整
由于最开始使用的串口升级的的方式,现在需要使用lwip实现,从串口IAP升级中将串口接收的数据固定存放在一个区域就可以,lwip升级同样也是。通过对lwip接收到的数据存放在我们的app段地址,通过按键去启动。
可以同样使用串口的缓冲,将lwip接收的数据存放在串口升级的缓冲区,首先找到lwip接收数据的接口tatic err_t tcp1_server_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *tcp_recv_pbuf, err_t err)。其lwip接收到的数据存放在tcp_recv_pbuf这个结构体中。
3d3388200de9912fefdff9efb254deea
将接收到数据指针指向我们的串口接收缓冲区,同时拿出接收的长度
5ab41b576bdab42a880934aa57adfb1b
串口缓冲区数据存放地址
b4f166ae0379c18f5bf953f5805cb0a3
在主循环中通过检测按键进行代码升级和运行APP。检测到lwip接收的数据不为0,将接收的数据写入到指定区域。
4d1f7815ed4468f96bd04878cabdeb3b
3.验证
打开网络工具,本次使用野火的上位机,可以发文件,点击网络助手,配置协议类型为TCP Client,以及开发板的地址,端口,点击建立连接
bcdee32cc8fc38405f0b6f5e434f7507
接下来点击右下角的加载文件,选择APP代码生成的bin文件,如下所示
ddbe16be405736fff0c6fa12edf3c809
点击发送数据,接下来就可以通过串口看到输出消息,按下按键,执行用户程序。
86dee683d0ba8a641354832d3d286723
正确执行升级后的代码,LED灯按APP的代码执行。

使用特权

评论回复

打赏榜单

21小跑堂 打赏了 50.00 元 2024-03-26
理由:恭喜通过原创审核!期待您更多的原创作品~

评论
21小跑堂 2024-3-26 14:34 回复TA
一个通过LWIP升级代码的简单示例,具体实现流程较为完善,若可多做些知识发散和流程精析可获得更高打赏哦 
储小勇_526| | 2024-3-27 08:32 | 显示全部楼层
正好最近有这方面的需求,值得好好学习。

使用特权

评论回复
ColeYao| | 2024-3-27 08:36 | 显示全部楼层
很多网上的方案中lwip TCP连接发送小数据包可以,大数据包定时发送(几秒一次)很快就会断开连接,目前看起来还是UDP更靠谱,不过UDP传输不方便做内网穿透。

使用特权

评论回复
@若水| | 2024-4-6 21:21 | 显示全部楼层
ColeYao 发表于 2024-3-27 08:36
很多网上的方案中lwip TCP连接发送小数据包可以,大数据包定时发送(几秒一次)很快就会断开连接,目前看 ...

TCP能穿透UDP也一定能穿透,这个跟TCP与UDP的关系不大的

使用特权

评论回复
weifeng90| | 2024-4-6 23:59 | 显示全部楼层
LWIP很经典的嵌入式以太网通信协议

使用特权

评论回复
ColeYao| | 2024-4-7 12:05 | 显示全部楼层
@若水 发表于 2024-4-6 21:21
TCP能穿透UDP也一定能穿透,这个跟TCP与UDP的关系不大的

实际测试TCP/UDP协议都不能穿透内网,MQTT协议是可以的,内网穿透工具用的是神卓互联的。

使用特权

评论回复
@若水| | 2024-4-9 21:28 | 显示全部楼层
ColeYao 发表于 2024-4-7 12:05
实际测试TCP/UDP协议都不能穿透内网,MQTT协议是可以的,内网穿透工具用的是神卓互联的。 ...

MQTT可是基于TCP的哦,如果TCP不行,MQTT肯定也不行,只是我说的穿透与你所说的穿透是否是一回事

使用特权

评论回复
chenqianqian| | 2024-4-10 08:06 | 显示全部楼层
LWIP还是经典的嵌入式以太网协议栈

使用特权

评论回复
ColeYao| | 2024-4-10 11:54 | 显示全部楼层
@若水 发表于 2024-4-9 21:28
MQTT可是基于TCP的哦,如果TCP不行,MQTT肯定也不行,只是我说的穿透与你所说的穿透是否是一回事 ...

内网穿透就是软件和电脑本地的端口通讯正常(不可以从外网访问),通过工具软件把本地端口映射到外部端口(可从外网访问)后软件和外部端口之间通讯还是正常的。 看起来就像是把内网的资源架设到了外网上。

使用特权

评论回复
xionghaoyun| | 2024-4-11 16:53 | 显示全部楼层
学习一下

使用特权

评论回复
OKAKAKO| | 2024-4-15 20:02 | 显示全部楼层
LwIP 是一款轻量化的 TCP/IP 协议,是瑞典计算机科学院(SICS)的 AdamDunkels 开发的一个小型开源的 TCP/IP 协议栈。

使用特权

评论回复
szt1993| | 2024-4-16 19:52 | 显示全部楼层
使用lwip实现,从串口IAP升级中将串口接收的数据固定存放在一个区域就可以

使用特权

评论回复
发新帖 本帖赏金 50.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

24

主题

82

帖子

2

粉丝