STM32H7支持一个以太网口,在这类嵌入式设备上,通常使用LWIP来配置以太网协议栈,结合上一篇文章介绍的SD卡文件系统,本文介绍如何实现一个简单的tftp服务器 首先还是要看下原理图,板子上使用LAN8742作为phy,主控与phy通过RMII相连 这个LAN8742不用过多关注,就当成普通phy使用即可,普通phy的通用寄存器是一样的 使用lwip时,只需要在MX_LWIP_Init调用netif_add,即可使这个网口与lwip相关联,硬件的初始化是netif_add->ethernetif_init->low_level_init->HAL_ETH_Init实现调用的 其中low_level_init由ST实现,里面包含默认的MAC 等信息 然后HAL_ETH_Init会调用HAL_ETH_MspInit实现PIN脚和时钟初始化 注意到这里使用PC1作为ETH_MDC,那么开发板上面的JP6就要接到PC1那里 然后LWIP是支持DHCP的,这里打开 如果能成功分配到IP,那这些信息会存在gnetif里面 这样LWIP初始化就介绍完了,下面介绍其业务 首先使用tftpd_init初始化tftp服务。就是socket接收功能 端口使用69,IP就是DHCP得到的IP 然后再初始化FATFS等,这个上一篇文章有介绍,这里不提 接着就是在主循环里面持续维护dhcp服务,比如dhcp连接,断开等,然后tftp的操作是依靠lwip的回调实现 而这个回调,正是上面tftpd_init在recv函数里面注册的 下面演示具体效果,首先还是要上电前插SD卡,然后要插好网线,不插网线会卡在lwip初始化那里(话说ST的SDK对热插拔支持奇差,凡是热插拔设备上电时必须插着) 然后找个支持路由器,一个口接电脑,一个口接开发板,在路由管理界面,看到这个MAC地址的,就是开发板 然后启动一个tftp的工具,推荐tftpd64 按下图配置 注意这个开发板文件目录,必须是0:/开头 然后执行put,就可以将文件发送到开发板,完成传输会显示此对话框 将SD卡拔出,放电脑上,可以看到确实存在此文件 到这里,就完成了lwip功能的简单开发
|