#import "../template.typ": *

#show: project.with(
  title: "实验报告 6",
  authors: (
    "absolutex",
  )
)

= 网络通信实验
== 实验目的

使用 ALIENTEK 阿波罗 STM32F429 开发板自带的网口和 LWIP 实现：TCP 服务器、TCP 客服端、UDP 以及 WEB 服务器等四个功能，熟悉 LWIP 网络协议栈的使用。

== 实验原理

STM32F429 芯片自带以太网模块，该模块包括带专用 DMA 控制器的 MAC 802.3（介质访问控制）控制器，支持介质独立接口 (MII) 和简化介质独立接口 (RMII)，并自带了一个用于外部 PHY 通信的 SMI 接口，通过一组配置寄存器，用户可以为 MAC 控制器和 DMA 控制器选择所需模式和功能。STM32F429 以太网功能框图如图所示：

#figure(
  image("以太网框图.png", width: 60%),
  caption: [STM32F429 以太网框图],
)

从上图可以看出，STM32F429 是必须外接 PHY 芯片，才可以完成以太网通信的，外部 PHY芯片可以通过 MII/RMII 接口与 STM32F429 内部 MAC 连接，并且支持 SMI（MDIO&MDC）接口配置外部以太网 PHY 芯片。

阿波罗 STM32F429 开发板使用的是 LAN8720A 作为 PHY 芯片。LAN8720A 是低功耗的 10/100M 以太网 PHY 层芯片，I/O 引脚电压符合 IEEE802.3-2005 标准，支持通过 RMII 接口与以太网 MAC 层通信，内置 10-BASE-T/100BASE-TX 全双工传输模块，支持 10Mbps 和 100Mbps。

LAN8720A 可以通过自协商的方式与目的主机最佳的连接方式(速度和双工模式)。

#figure(
  image("LAN8720A 功能框图.png", width: 70%),
  caption: [LAN8720A 功能框图],
)

== 代码修改

本实验中，HAL 库模板代码已经实现了 UDP 收发和 TCP 收发、Web 服务器访问功能。我们小组在此基础上进行修改，使开发板能够控制 LCD，根据经由 UDP 包传送的字符串数据进行实时图形显示。以下是修改后的代码：

#include_code_file("../代码/11.udp_demo.c","udp_demo.c 片段", "c")

在 `udp_demo.c` 中，创建了 `draw` 与 `stoi` 函数用来转换与绘制接收的信息，并更改 `udp_demo_test` 函数，使其能够接收 UDP 包，并调用 `draw` 函数进行实时显示。

#include_code_file("../代码/11.lwip_comm.c","lwip_comm.c 片段", "c")

在 `lwip_comm.c` 中，可以调整默认的 remote IP 值，使开发板能够快速连接到调试设备的 IP 地址，无需手动选择。

由于实验中开发板无法通过 DHCP 获取 IP 地址，我们还在 `lwipopts.h` 中设置了 `#define LWIP_DHCP 0`，使 DHCP 默认禁用，节省了开发板等待 DHCP 任务直到循环变量自然溢出的时间。

== 实验结果

首先编译并下载模板代码，测试网口收发功能，并观察开发板与调试设备之间的通信。设置好开发板与网络调试助手的 IP 与端口后，按动按键，可以观察到开发板与调试设备之间通信正常。

#figure(
  image("网络调试助手.png", width: 70%),
  caption: [网络调试助手],
)

然后编译下载修改后的代码，设置开发板参数，当其显示 `Connected` 后，在网络调试助手发送数字字符串，观察到开发板能够显示矩形，并随着输入数字的变大而变大。

== 心得体会

在本次实验中，我们小组完成了对开发板与调试设备的通信，并修改代码，使用 UDP 包进行图案的实时显示。调试过程中，我们遇到了一些问题，例如因为调试设备的网络配置不正确，开发板无法连接到其 IP 地址。通过查阅网络资料，我们解决了这些问题，并加深了对网络通信的理解。

使用开发板发送字符串时，在网络调试助手中默认显示十六进制数字，需要取消勾选 *十六进制显示*，才可使消息以字符串形式显示在开发板屏幕上。
