stm32f4 lwIP开发笔记

RMII (Reduced Media Independent Interface) 简化媒体独立接口

MII   :媒体独立接口,也叫介质无关接口。它是IEEE-802.3定义的以太网行业标准。它包括一个数据接口,以及一个MAC和PHY之间的管理接口(图1)

PHY(英语:Port Physical Layer),中文可称之为端口物理层,是一个对OSI模型物理层的共同简称。

MAC介质访问控制(medium access control)。 是解决当局域网中共用信道的使用产生竞争时,如何分配信道的使用权问题。

PHY是物理接口收发器,它实现物理层。包括MII/GMII(介质独立接口)子层、PCS(物理编码子层)、PMA(物理介质附加)子层、PMD(物理介质相关)子层、MDI子层。

1.3.2 添加及修改ST以太网库                       -----------------芯片以太网库
      1)添加以太网库              ---  文件在---》STM32F4x7_ETH_LwIP_V1.1.0-->>Libraries--->STM32F4x7_ETH_Driver
      2)修改stm32f4x7_eth_conf.h              
      3) 修改stm32f4x7_eth.c文件     Rx_Buff[]  Tx_Buff[] DMARxDscrTab[]  和  DMATxDscrTab[]

1.3.3 添加网卡驱动程序                           ----------------网卡驱动
      1)STM32F4以太网DMA描述符     两种结构:环形结构和链接结构
      2)添加LAN8720 和MAC /DMA驱动
          HARDWARE 添加  lan8720.c /lan8720.h      FWLIB  添加stm32f4xx_syscfg.c
       在此,俱体讲述lan8720.c里面的网卡驱动程序。  

1.3.4 LWIP数据包和网络接口管理                 -----------------  
      1)LWIP数据包管理
         LWIP协议栈使用pbuf结构体来描述协议栈使用中的数据包,pbuf结构体在pbuf.h中有定议
         具体说明这个结构体内容

      3)LWIP网络接口管理
         在LWIP中对于网络接口的描述是通过一个netif结构体完成的,netif结构体在netif.h文件
         中有定义,定义如下,由于netif结构体比较大,
         具体说明

1.3.5  添加LWIP源文件
       新建LWIP文件夹  ——》在此新建文件夹中添加   lwip-1.4.1
      
       在工程新建: LWIP-NETIF     路径:  lwip-1.4.1  --> src --> netif  下  etharp.c  和  ethernetif.c
                    LWIP-API       路径:  lwip-1.4.1  --> src --> api    下  所有文件

                    LWIP-CODE      路径1: lwip-1.4.1  --> src --> core ->ipv4  下 所有文件       
                                   路径2: lwip-1.4.1  --> src --> core   下 所有 .c 文件


                     
       添加头文件: ..\LWIP\lwip-1.4.1\src\include
                    ..\LWIP\lwip-1.4.1\src\include\ipv4
                    ..\LWIP\lwip-1.4.1\src\include\netif

1.3.6   添加中间文件
        我们上面只是装LWIP源文件和以太网的驱动都添加到工程中,要装以太网驱动和LWIP连拉起来还需要一些
        其他文件,而这些文件非常重要,  以下是讲解如何添加这些文件

        1)添加arch文件  
           复制           LWIP文件夹  arch文件夹到自己工程  arch 内有5个文件:cc.h   cpu.h   perf.h  sys_arch.h   sys_arch.c

           cc.h    主要完成了协议栈内部使用的数据类型的定义
           cpu.h   用来定义cpu的大小端模式,因为STM32是小端模式,因此这里定义BYTE_ORDER为小端模式。 
           per.h   是和系统测量与统计相关的文件,我们不使用任何的测量和统计,因此这个文件中的两个宏定义为空的。
           sys_arch.h 和 sys_arch.c  是在使用操作系统的时候才使用到的文件,在这里我们只是在
                                     sys_arch.h文件中简单的实现了获取时间的函数,sys_now(),在lwip_localtime
                                     为一个合局变量,用来为LWIP提供时钟。

          
          在新建工程添加   LWIP-ARCH分组,  并将sys_arch.c文件添加到这个分组中并且添加相应的头文件路径。
          
         2)添加LWIP通用文件
            lwip_app文件夹用来放我们以后所有实验的代码:
            lwip_app  ->  lwip_comm文件夹
                              lwip_comm    ->  lwip_comm.c   lwip_comm.h   lwipopts.h

             lwip_comm.c 和  lwip_comm.h  是将LWIP源码  和 前面的以太网驱动库结合起来的  --》桥梁
             这两个文件非常重要,这两个文件有ALIENTEK提供。
             lwipopts.h是用来裁剪和配置LWIP的文件,  以后我们想要使用LWIP的什么功能的话,就在这个文件配置

   
         在工程中,新建一个  LWIP -APP分组  ,并将  lwip_comm.c文件添加到这个分组

         3)添加ethernetif.h文件
                   

          
13.7   LWIP源码修改
       
       1)修改LWIP源文件名字

          路径:  lwip-1.4.1  --> src --> core              下有个  sys.c文件
          路径:  lwip-1.4.1  --> src --> include-->lwip    下有个  sys.h文件
          因与SYSTEM文件夹同名                因而改成
                                              lwip_sys.c   与lwip_sys.c  
                                              同时也要改LWIP源码里的   #include  "sys.h"   改成    #include  "lwip_sys.h"   


       2)修改ethernetif.c文件

            原:     ethernetif.c文件路径: LWIP-->  src -->  netif    
            用我们网络实验1LWIP无操作系统植实验中的 ethernetif.c文件替代LWIP源码中的这个文件。 
             
             //--------------------------------------------------------------------------------   
            //用于初始化硬件    //netif  :网卡结构体指针
            static err_t low_level_init(struct netif *netif)  

            //用于发送数据包的最底层函数      网卡结构体指针,    数据结构体指针
            static err_t low_level_output(struct netif *netif, struct pbuf *p)

             //用于数据包的最底层函数
            static struct pbuf * low_level_input(struct netif *netif)
             //网卡接收数据(lwip直接调用
            err_t ethernetif_input(struct netif *netif)
             //初始化网络
            err_t ethernetif_init(struct netif *netif)
            //------------------------------------------------------------------------------------
       3)修改mem.c  和 memp.c文件     // 路径:  lwip-1.4.1  --> src --> core   
           LWIP动态内存管理技术,
                               LWIP有一个内存堆ram_heap  和   内存池  memp_memory    这两个是LWIP的内存来源 
                               分别在 mem.c  和 memp.c文件 
          
                                 在mem.c文件中将ram_heap数组注销掉 , 定义为指向u8_t的指针    
                                             //u8_t   ram_heap[MEM_SIZE_ALIGNED + (2*SIZEOF_STRUCT_MEM) + MEM_ALIGNMENT];
                                               u8_t   *ram_heap;    //ram_heap   采用ALIENTEK进行分配,分配过程在 mem_init中 

                                 在memp.c文件中将memp_memory数组屏蔽掉,改为指针
                                             //static u8_t memp_memory[MEM_ALIGNMENT - 1] 
                                              u8_t *memp_memory;

                                 memp.c文件中添加memp_get_memorysize()函数  。   memp_memory 我们会在lwip_comm.c文件中使用动态内存管理函数为其分配内存  
                               
       
       4)修改icmp.c文件
                        我们需要修改icmp.c文档使其支持硬件帧校验


//#if CHECKSUM_GEN_ICMP
//    /* adjust the checksum */
//    if (iecho->chksum >= PP_HTONS(0xffffU - (ICMP_ECHO << 8))) {
//      iecho->chksum += PP_HTONS(ICMP_ECHO << 8) + 1;
//    } else {
//      iecho->chksum += PP_HTONS(ICMP_ECHO << 8);
//    }
//#else /* CHECKSUM_GEN_ICMP */
//    iecho->chksum = 0;
//#endif /* CHECKSUM_GEN_ICMP */

改----------------------------------

#ifdef CHECKSUM_BY_HARDWARE
    iecho->chksum = 0;
#else
    /* adjust the checksum */
    if (iecho->chksum >= htons(0xffff - (ICMP_ECHO << 8))) {
      iecho->chksum += htons(ICMP_ECHO << 8) + 1;
    } else {
      iecho->chksum += htons(ICMP_ECHO << 8);
    }    
#endif

1.3.8   LWIP的裁剪与配置
         在LWIP的源码中有个opt.h的文件,这个文件是裁剪和配置LWIP的,
                               因其是条件编译,在其实地方定议了,opt.h里面定义就不起作用
                                LWIP->lwip_app->lwip_comm   下有一个lwipopts.h的文件, 这个文件就是用来裁剪与配置lwipopt.h

1.4     软件设计
        

猜你喜欢

转载自blog.csdn.net/h490516509/article/details/88636382