您的当前位置:首页正文

STM32F4 LAN8720A的移植方法

2020-01-31 来源:钮旅网
ST中stsw-stm32070的网络例子

——将DP83848CVV修改为LAN8720A

在main.h中 将LCD注释掉

//#define USE_LCD /* enable LCD */ Stm32f4的时钟配置

首先在startup_stm32f40xx.s中找到芯片上电复位之后做的动作,将进行SystemInit

SystemInit()函数在system_stm32f4xx.c中进行了编写

同时SystemInit()调用SetSysClock(),也在system_stm32f4xx.c中

1 / 8

SetSysClock()配置了PLL的时钟频率,一般都配置为168M,晶振不同的时候只要配置PLL_M的值即可,8MHz晶振就将PLL_M定义为8,25MHz的时候定义为25;

当然,SetSysClock()中还进行了时钟源的选择,HSE还是HIS什么的,还有HCLK、PCLK2、PCLK1等,可以查看具体的代码。

时钟配置完成之后,进入main()函数,如前面所介绍,进入main()之前,时钟已经配置为168MHz了。

这里有 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);这个函数,看上去是中断优先级的设置,暂且没有去管它,有兴趣的时候可以看下,应该不难;因为这里只是单纯的设置LAN8720A来替代开发板上原先的DP83848CVV,所以主要设置都在ETH_BSP_Config()中,这里设置LAN8720A成功之后,就会去设置LwIP,就不是物理层上的工作了,都是IOS其它传输层、应用层等层的工作。

2 / 8

我们先看看ETH_BSP_Config()中是做了什么工作,这个函数的内容在

stm32f4x7_eth_bsp.c中,看文件名bsp就是和最底层外设相关的。函数首先进行了系统的一个定时器的滴答设置,这个定时器一般给操作系统使用。这里单纯做为网络设置时候的一些延时使用,和delay差不多,只是使用的是系统定时器这个特殊定时器。我们不必管它,不操作。

接下来是GPIO口 的设置

因为LAN8720A是一个RMII PHY芯片,它自己没有MAC层的功能,网络中的MAC层集成在STM32F4芯片内部,MAC层有具体的硬件信号脚,这里直接参考LAN8720A的参考电路中的RMII接口连接到STM32F4的RMII接口就行了,

3 / 8

电这里LAN8720A的复位直接连接到STM32F4的复位就可以,都是低电平复位。 关于void ETH_GPIO_Config(void)这个函数也要说明一下,ST的参考板使用的是MII模式,而LAN8720A只有RMII模式,所以需要做些修改, 首先在main.h中修改如下

同时可以修改STM32F4上电之后的IP

4 / 8

虽然MCO没有使用,但是还是定义在这里,因为后面的其他引脚的初始化都用了GPIO_InitStructure这个结构体,其他接下来的就没有什么了,依照功能修改GPIO

完成之后进行MAC层相关的设置,使用DMA功能

在ETH_MACDMA_Config()函数中,首先设置为百兆自动连接方式,其它不必修改

完了进入ETH_Init()函数进行MAC/DMA的设置

DP83848_PHY_ADDRESS按照LAN8720A的硬件设置IP地址,硬件为0地址

在ETH_Init()函数中找到和PHY芯片DP83848CVV相关的寄存器设置,改为

LAN8720A相关的,其余在STM32F4内部MAC相关的寄存器不必动,设置PHY_BCR

5 / 8

WritePHYRegister()或者ReadPHYRegister()都是通过标准的SMI接口来进行的,和IIC、SPI都像类似,硬件会自动封装好数据包的头尾。 接口是下面两根引脚MDIO、MDC

原先的将这个两个定义为了0、1寄存器,和LAN8720A中的地址一致,所以复位设置不用修改

因为设置为了百兆自动连接,所以进入if这个条件中

检查网口是否已经连接好了,局域网,只要RJ45用网线连接到其他网口就可以,因为这里LAN8720A暂时没有使用中断功能,所以只能在上电之前保证网线已经连接好。

因为PHY_SR这个寄存器,在LAN8720A中没有,所以最好注释掉,直接按照LAN8720A的硬件MODE[2:0]来再写一次寄存器

6 / 8

到这里后面的都不必再修改了。

原先DP83848CVV使用了中断方式,只要网线连接就会有中断产生进入如下函数中 在stm32f4xx_it.c中,就是一个普通的EXIT中断

因为Eth_Link_ITHandler(DP83848_PHY_ADDRESS);调用到了LwIP相关的函数netif_set_link_up(),所以在不使用中断的时候,确保netif_set_link_up()在网线连接的时候调用一次

7 / 8

在进入while(1)中先进行LwIP相关的函数调用

修该到这里就结束了,LAN8720A可以正常工作,当然这里只是验证了LAN8720A可以正常使用,但是具体的用法还要更多的修改、开发。

8 / 8

因篇幅问题不能全部显示,请点此查看更多更全内容