[X]关闭
1

S02-CH30 基于UDP的QSPI Flash bin文件网络烧写

摘要: 软件版本:VIVADO2017.4操作系统:WIN10 64bit硬件平台:适用米联客 ZYNQ系列开发板米联客(MSXBO)论坛:www.osrc.cn答疑解惑专栏开通,欢迎大家给我提问!!30.1 概述 为了满足不同的需求,本例程在“基于TCP的QSPI ...

软件版本:VIVADO2017.4

操作系统:WIN10 64bit

硬件平台:适用米联客 ZYNQ系列开发板

米联客(MSXBO)论坛:www.osrc.cn答疑解惑专栏开通,欢迎大家给我提问!!

30.1 概述

      为了满足不同的需求,本例程在“基于TCP的QSPI Flash bin文件网络烧写”上进行修改,将bin文件的传输协议替换为UDP。与采用TCP协议的例程相比,本例程无需使用ZYNQ内部的定时器,无定时器中断,LWIP中UDP部分的API函数结果也更为简洁,易于使用,简化了ARM中的C程序设计,但使用UDP协议后文件传输的可靠性无法保证,因此需要更具实际应用进行权衡。

30.2 基本原理

与“基于TCP的QSPI Flash bin文件网络烧写”例程相同,并将TCP协议替换为UDP协议。

30.2.1 Bin文件

见“基于TCP的QSPI Flash bin文件网络烧写”例程。

30.2.2 QSPI Flash

见“基于TCP的QSPI Flash bin文件网络烧写”例程。

30.3 驱动程序

驱动程序请参考提供例程的SDK工程的源文件。

303.1 main函数

main函数的完成的功能如下:

  1. 关闭Data Cache,避免bin文件在DDR拷贝过程中维护Cache一致性造成的麻烦
  2. 配置QSPI接口及QSPI Flash
  3. 初始化中断控制器及系统中断
  4. 初始化LWIP协议栈
  5. 建立UDP连接
  6. 持续从LWIP协议栈接收数据

30.3.2建立UDP连接

        基于LWIP库在ARM中建立一个UDP连接,ZYNQ的IP地址为192.168.1.10,端口号为5010,远程IP地址为192.168.1.100,端口号为8080。

30.3.3 lwip库设置

     本例程使用RAW API,即函数调用不依赖操作系统。传输效率也比SOCKET API高,(具体可参考xapp1026)。将use_axieth_on_zynq和use_emaclite_on_zynq设为0。如下图所示。

       修改lwip_memory_options设置,将mem_size,memp_n_pbuf这2个参数值设大,这样会提高UDP传输效率。如下图所示。

      修改pbuf_options设置,将pbuf_pool_size设大,增加可用的pbuf数量,这样同样会提高UDP传输效率。如下图所示。

      由于无需使用TCP协议,修改tcp_options设置,将lwip_tcp设置为false,tcp_queue_ooseq设为0,关闭tcp功能,如下图所示。

      修改temac_adapter_options设置,将n_rx_descriptors和n_tx_descriptors参数设大。这样可以提高zynq内部emac dma的数据搬移效率,同样能提高UDP传输效率。如下图所示。

      MZ7X工业级开发板板载网口芯片是RTL8211FDI,由于默认的驱动不支持RTL8211FDI 的寄存器配置,所以无法支持自动适应速度 (通过自己修改库可以实现自动适应但是工作量大,考虑到投入时间和产出比,这里就不修改了)。所以需要手动修改 LWIP 库让网口芯片工作于1000Mbps。


30.3.4 程序解析

UDP连接建立由udp_transmission.c文件中的udp_recv_init函数完成。

udp_recv_init函数:

调用udp_new函数建立1个建立UDP连接所需的结构体。

调用udp_bind函数绑定本地IP地址和UDP端口号。

调用udp_connect函建立UDP连接,并绑定远程IP地址和UDP端口号。

调用udp_recv函数指定用于接收UDP数据包的回调函数为udp_recv_callback。

30.3.5接收保存BOOT.bin文件

       接收BOOT.bin文件通过udp_transmission.c中的udp_recv_callback函数完成,该函数为UDP接收数据包的回调函数,每当接收到UDP的数据包时该函数都会被调用。

       保存位置与“基于TCP的QSPI Flash bin文件网络烧写”例程相同。

30.3.6烧写QSPI Flash

       见“基于TCP的QSPI Flash bin文件网络烧写”例程。

30.3.7 UDP调试信息输出

       例程中设计了一个udp_printf函数,用于向网络调试助手输出字符串调试信息。该函数暂时只支持字符串以“\n”结尾。

       该函数实现思路与“基于TCP的QSPI Flash bin文件网络烧写”例程中tcp_printf函数基本相同。不同的是,任何时刻通过udp_printf发送的数据都会及时通过网络发出,并被网络调试助手接收,而不像tcp_printf函数的发送会在flash烧写过程中被阻塞。

       这是由于UDP为不可靠传输,不像TCP在传输过程中需进行持续握手。因此,UDP接收和发送过程相互独立,具体在LWIP协议栈中反应为udp_send函数不依赖xemacif_input函数。

30.4网络调试助手操作方法

30.4.1发送bin文件

      在SDK中下载程序至ZYNQ中。打开网络调试助手,选择UDP方式,输入电脑的IP地址和UDP端口号,然后点击打开按键,在远程主机中填入ZYNQ的IP地址和UDP端口号。在网络调试助手发送区设置里选择“启用文件数据源”,选择需要发送的BOOT.bin文件,然后点击发送。如下图所示。

30.4.2发送启动Flash烧写命令

      然后输入烧写启动命令“start update”,不要选择“按十六进制发送”,本例程中需要以ASCII码形式发送,含空格一共12个字符(不要在末尾加回车),千万不要输错,否则需要全部重新再来一遍。如下图所示。

      启动烧写后,SDK串口终端打印信息如下图所示。当提示“verify done!”表示整个烧写过程成功完成。

      网络调试助手接收udp_printf函数实时输出的信息如下图所示。

30.5 Bin文件更新验证

      见“基于TCP的QSPI Flash bin文件网络烧写”例程。

30.6待改进之处

  1. UDP为不可靠传输,为了提高使用UDP协议传输bin文件的可靠性,可在其之上设计额外的传输协议,并加上类似传输握手的功能。
  2. 其余见“基于TCP的QSPI Flash bin文件网络烧写”例程。

路过

雷人

握手

鲜花

鸡蛋
发表评论

最新评论

引用 always 2019-10-23 20:04
这个代码在哪可以下载啊,着急

查看全部评论(1)

本文作者
2019-9-6 19:40
  • 7
    粉丝
  • 3018
    阅读
  • 1
    回复

关注米联客

扫描关注,了解最新资讯

联系人:汤经理
电话:0519-80699907
EMAIL:270682667@qq.com
地址:常州溧阳市天目云谷3号楼北楼201B
热门评论
排行榜