从零实现 LWIP 一(配置过程)

从零实现 LWIP 二(UDP、无DHCP)

从零实现 LWIP 三(TCP客户端服务端、静态IP)

从零实现 LWIP 四(一对一 UDP、TCP客户端 DHCP 网线热插拔和自动重新连接)

欢迎留言讨论~

 

之前一直对TCP/IP没有接触,也没有系统的学习,一穷二白。因为其内容的繁杂,对其可以说望而却步,常常躲着走。看看这类书的图片。。。

从零实现 LWIP 一(配置过程)_第1张图片

见过这本书的实物,那叫一个厚,真的不敢学,当时就有一种这辈子永远学不会的感觉。

然后还有一本据说比较简单的

 

从零实现 LWIP 一(配置过程)_第2张图片

这本我看过一两章,他把很多知识结构用图示表示,确实易于理解,但是一段时间不用,还是忘个精光。因为那些TCP/IP的理论知识,跟我手头的板子很难联系起来。

从零实现 LWIP 一(配置过程)_第3张图片

这本书受到我的两个同事的好评,还蛮详细的介绍嵌入式中网络的应用。很值得一看,讲的也很通俗,当时也看到了UDP部分,也成功了。但是现在让我再去移植一遍,我还是发怵。但是我打算做完这次LWIP系列的实验,有时间去看一遍这本书,带着实战经验再去看会加深记忆。

好在cubemx有LWIP,我也有开发板。不求做到精通,至少接触过,搭建过底层,能够收发数据,也不算是啥也不懂了吧。

先用起来,用的时候遇到什么问题再去解决吧。


进入正题,先介绍下我的硬件设备以及软件版本

硬件:正点原子阿波罗STM32F429IGT6,外部PHY芯片 LAN8720

软件:keilv5, cubemx 4.23.0

尝试过最新的cubemx 5.6.0,不习惯那种交互界面,此外HAL库由于升级,会跟之前低版本生成的HAL库不兼容。


 

F429以太网框图:

从零实现 LWIP 一(配置过程)_第4张图片

外部PHY芯片是必须的。并且支持MII、RMII两种接口方式。并且支持SMI接口配置外部以太网PHY芯片。

SMI:

这个接口是两个脚,MDC、MDIO。主要是用来访问外部PHY的寄存器。

MII:

从零实现 LWIP 一(配置过程)_第5张图片

RMII:

从零实现 LWIP 一(配置过程)_第6张图片

从零实现 LWIP 一(配置过程)_第7张图片

 

原理图:

从零实现 LWIP 一(配置过程)_第8张图片

原理图分为三部分,从上到下是:MCU部分、外置网口模块LAN8720、网口接口

可以看到,原子采用的是RMII接口。


配置ETH为RMII,需要注意,cubemx默认管脚并不一定和原理图吻合,一定要一一对照。

从零实现 LWIP 一(配置过程)_第9张图片

从零实现 LWIP 一(配置过程)_第10张图片

从零实现 LWIP 一(配置过程)_第11张图片

 

 

配置中间层,使能LWIP

从零实现 LWIP 一(配置过程)_第12张图片

从零实现 LWIP 一(配置过程)_第13张图片

其他配置默认

不使能中断

从零实现 LWIP 一(配置过程)_第14张图片

从零实现 LWIP 一(配置过程)_第15张图片

生成代码,需要注意在初始化硬件时HAL_ETH_MspInit中应对LAN8720复位,而复位的管脚是用拓展IO芯片控制的,所以在此之前一定要初始化完毕该拓展IO芯片

void HAL_ETH_MspInit(ETH_HandleTypeDef* ethHandle)
{
  
  /* USER CODE BEGIN ETH_MspInit 1 */
	
    //复位外置网口芯片
    __disable_irq();                   //关闭所有中断,复位过程不能被打断!
    PCF8574_WriteBit(ETH_RESET_IO,1);  //硬件复位
    delay_ms(100);
    PCF8574_WriteBit(ETH_RESET_IO,0);  //复位结束
    delay_ms(100);
    __enable_irq();                    //开启所有中断
  /* USER CODE END ETH_MspInit 1 */
  }
}

除此之外没有要修改的了,现在仅是完成了为网络接口、以太网、协议层的搭建。但是UDP的使用还未具备。

你可能感兴趣的:(嵌入式编程,网络)