zght 发表于 2024-3-24 23:37

【极海APM32F407 Tiny Board】 5.基于LWIP的IAP升级

# 1        LWIP
## 1.1        LWIP简介
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 时钟。

# 2        移植步骤
## 2.1        Bootloader配置
本次由于在bootloader程序中添加了lwip的代码,需要将bootloader的大小调整一下,初步编译了一下,大概占用30k左右的样子,这里进行试验就调整大一点,200k

应用程序配置,只需要调整APP的起始地址即可。

同时应用APP程序中只需要一个简单的例子即可,2s闪烁一次LED

接下来在bootloader建立TcpServer服务器,端口设置为80,代码基于lwip移植和串口IAP升级的工程合并而成。

Lwip接收数据回调函数,连接收向服务器发送消息证明建立通讯

接下来就是接收数据后的回调函数,先将接收的数据返回发送到服务器

实现Tcpserver这个功能后在实现代码升级的部分,然后初始化函数放在主函数中初始化。

打开网络测试工具,先ping一下,ping正常

接下来点击打开TCP,可以发现lwip Tcpserver connect这串字符上传,这是代码里面写的,说明成功,接下来向服务器发送数据11,返回11。说明功能已正常使用

## 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这个结构体中。

将接收到数据指针指向我们的串口接收缓冲区,同时拿出接收的长度

串口缓冲区数据存放地址

在主循环中通过检测按键进行代码升级和运行APP。检测到lwip接收的数据不为0,将接收的数据写入到指定区域。

# 3        验证
打开网络工具,本次使用野火的上位机,可以发文件,点击网络助手,配置协议类型为TCP Client,以及开发板的地址,端口,点击建立连接

接下来点击右下角的加载文件,选择APP代码生成的bin文件,如下所示

点击发送数据,接下来就可以通过串口看到输出消息,按下按键,执行用户程序。

正确执行升级后的代码,LED灯按APP的代码执行。

みずじ 发表于 2024-11-3 09:33

<p>博主,能否提供一些完整的参考代码</p>
页: [1]
查看完整版本: 【极海APM32F407 Tiny Board】 5.基于LWIP的IAP升级