我们从2011年坚守至今,只想做存粹的技术论坛。  由于网站在外面,点击附件后要很长世间才弹出下载,请耐心等待,勿重复点击不要用Edge和IE浏览器下载,否则提示不安全下载不了

 找回密码
 立即注册
搜索
查看: 1076|回复: 10

[产品新知] MII使用

[复制链接]
  • TA的每日心情

    2024-10-6 20:55
  • 签到天数: 1 天

    [LV.1]初来乍到

    479

    主题

    247

    回帖

    1392

    积分

    二级逆天

    积分
    1392

    终身成就奖特殊贡献奖

    发表于 2020-7-31 09:17:02 | 显示全部楼层 |阅读模式

    马上注册,结交更多好友,享用更多功能,让你轻松玩转社区

    您需要 登录 才可以下载或查看,没有账号?立即注册

    ×
    近,刚接触STM32CubeMX,感觉功能非常强大,特别是对于ETH、USB、FAT等特别方便,不用再像以前那样去找各种移植方法(移植起来既麻烦也耽误时间)。
    此处,我以自己手头上的一个板子(STM32F207VCT6)为例,记录一下以太网的配置过程,中间也走了一些弯路,希望其他同志今后在配置ETH的时候可以借鉴参考,以节省自己的开发周期。
    具体配置过程:
    1、打开STM32CubeMX,并选择好相应的芯片。文中的芯片为STM32F207VCT6,选择后如下图:

                                   
    登录/注册后可看大图



                                   
    登录/注册后可看大图
    2、配置RCC时钟、ETH、PA8以及使能LWIP;
          由于此处我们的开发板硬件上为RMII方式,因此选择ETH-RMII,若有同志的开发板为MII方式,请参考MII的配置方法,此处只针对RMII;
          RCC选择外部时钟源,另外勾选MCO1,软件会自动将PA8配置为MCO1模式,该引脚对于RMII方式很重要,用于为PHY芯片提供50MHz时钟;
          使能LWIP;

                                   
    登录/注册后可看大图

                                   
    登录/注册后可看大图


    3、时钟树的相关配置,必须保证MCO1输出为50Mhz,如果这个频率不对会导致PHY芯片无法工作;
         我这里因为芯片为207VCT6,为了使MCO1输出为50Mhz,做了PLL倍频参数的一些调整,总体如下:(同志们配置时可根据自己的芯片灵活配置,但需保证MCO1的输出为50Mhz)。下图中的时钟配置参数是一开始配置的,但后来发现网络虽然能通,但丢包严重,后通过百度找到了采用MCO1输出作为时钟的问题,解决方法如下:
      /* IMPORTANT NOTE
         ==============
           This configuration is valid only when MCO pin is used as RMII clock source.
           To output a 50 MHz clock signal on the MCO pin, the following conditions
           must be respected:
             – 25 MHz external crystal connected to OSCIN/OSCOUT pins
             – RCC_PLLCFGR PLL factors configured as follows:
               PLLMx = 4, PLLNx = 64, PLLP = 4.
               This leads to a system clock of 100 MHz.
             – Then set the MCO prescaler to 2 in the RCC_CFGR register to configure
               the system clock to 50 MHz.
         */

    将cubeMX生成后的工程中时钟配置的地方,分别修改PLLMx = 4, PLLNx = 64, PLLP = 4,可以解决丢包问题!

                                   
    登录/注册后可看大图

                                   
    登录/注册后可看大图


    4、ETH、LWIP、RCC相关参数设置;
          至此,比较重要的都在前面了,但是还有一点仍需要注意,即PA8引脚输出速度,几次不成功都是因为这个引脚没注意。

                                   
    登录/注册后可看大图

                                   
    登录/注册后可看大图


         后续的参数设置可以根据同志们自己的需求分别设置,这里给出我的设置供参考;
          ETH参数保持默认,但中断勾选一下;

                                   
    登录/注册后可看大图

                                   
    登录/注册后可看大图


          LWIP参数设置如下:(因为我这里是配置UDP服务器,IP选择静态分配)

                                   
    登录/注册后可看大图

                                   
    登录/注册后可看大图


    5、生成工程,做最后的函数修改;
    给生成的工程添加UDP服务器的初始化以及端口绑定等相关函数;
    我这里直接将之前的官方例程中的UDP服务器文件加进来,如下:

                                   
    登录/注册后可看大图


    之后将.c文件添加到用户程序,主函数添加Udp的.h头文件;如下:(udp文件的具体内容在后面给出)

                                   
    登录/注册后可看大图

                                   
    登录/注册后可看大图

    6、主函数还需要添加一下几个函数,在这里不对函数作用及实现原理讲解,仅做添加说明。

                                   
    登录/注册后可看大图

                                   
    登录/注册后可看大图




    附:udp_echoserver相关文件内容(该文件为官方的示例程序,版权归官方,此处做转载)
    udp_echoserver.c的内容如下:

    /* Includes ------------------------------------------------------------------*/
    #include "main.h"
    #include "lwip/pbuf.h"
    #include "lwip/udp.h"
    #include "lwip/tcp.h"
    #include <string.h>
    #include <stdio.h>


    /* Private typedef -----------------------------------------------------------*/
    /* Private define ------------------------------------------------------------*/
    #define UDP_SERVER_PORT    7   /* define the UDP local connection port */
    #define UDP_CLIENT_PORT    7   /* define the UDP remote connection port */


    /* Private macro -------------------------------------------------------------*/
    /* Private variables ---------------------------------------------------------*/
    /* Private function prototypes -----------------------------------------------*/
    void udp_echoserver_receive_callback(void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr, u16_t port);


    /* Private functions ---------------------------------------------------------*/


    /**
      * @brief  Initialize the server application.
      * @param  None
      * @retval None
      */
    void udp_echoserver_init(void)
    {
       struct udp_pcb *upcb;
       err_t err;
       
       /* Create a new UDP control block  */
       upcb = udp_new();
       
       if (upcb)
       {
         /* Bind the upcb to the UDP_PORT port */
         /* Using IP_ADDR_ANY allow the upcb to be used by any local interface */
          err = udp_bind(upcb, IP_ADDR_ANY, UDP_SERVER_PORT);
          
          if(err == ERR_OK)
          {
            /* Set a receive callback for the upcb */
            udp_recv(upcb, udp_echoserver_receive_callback, NULL);
          }
       }
    }


    /**
      * @brief This function is called when an UDP datagrm has been received on the port UDP_PORT.
      * @param arg user supplied argument (udp_pcb.recv_arg)
      * @param pcb the udp_pcb which received data
      * @param p the packet buffer that was received
      * @param addr the remote IP address from which the packet was received
      * @param port the remote port from which the packet was received
      * @retval None
      */
    void udp_echoserver_receive_callback(void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr, u16_t port)
    {


      /* Connect to the remote client */
      udp_connect(upcb, addr, UDP_CLIENT_PORT);
       
      /* Tell the client that we have accepted it */
      udp_send(upcb, p);


      /* free the UDP connection, so we can accept new clients */
      udp_disconnect(upcb);

      /* Free the p buffer */
      pbuf_free(p);
       
    }



    udp_echoserver.h的内容如下:

    #ifndef __ECHO_H__
    #define __ECHO_H__

    void udp_echoserver_init(void);

    #endif /* __MINIMAL_ECHO_H */



    7、至此,所有的工作完成,编译工程,下载至开发板。由于udp_echoserver中绑定的端口号为7,这里我们通过测试工具测试网络的功能,如下:
    回复

    使用道具 举报

  • TA的每日心情

    昨天 09:15
  • 签到天数: 110 天

    [LV.6]常住居民II

    0

    主题

    3739

    回帖

    7558

    积分

    二级逆天

    积分
    7558

    终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

    发表于 2020-7-31 09:20:40 | 显示全部楼层
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-11-15 18:25
  • 签到天数: 1 天

    [LV.1]初来乍到

    2

    主题

    590

    回帖

    779

    积分

    二级逆天

    积分
    779

    社区居民终身成就奖

    QQ
    发表于 2020-7-31 09:55:35 | 显示全部楼层
    回复

    使用道具 举报

  • TA的每日心情

    昨天 08:37
  • 签到天数: 167 天

    [LV.7]常住居民III

    7

    主题

    5276

    回帖

    4508

    积分

    二级逆天

    积分
    4508

    终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

    发表于 2020-7-31 12:57:32 | 显示全部楼层
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-8-26 10:11
  • 签到天数: 24 天

    [LV.4]偶尔看看III

    4

    主题

    791

    回帖

    791

    积分

    二级逆天

    积分
    791

    终身成就奖特殊贡献奖

    QQ
    发表于 2020-7-31 13:40:12 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    5

    主题

    471

    回帖

    0

    积分

    二级逆天

    积分
    0

    终身成就奖

    发表于 2020-7-31 17:49:41 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    1

    主题

    6218

    回帖

    8731

    积分

    二级逆天

    积分
    8731

    终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

    QQ
    发表于 2020-8-1 07:29:26 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    1

    主题

    4703

    回帖

    5

    积分

    二级逆天

    积分
    5

    终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

    发表于 2020-8-1 08:39:52 | 显示全部楼层
    回复

    使用道具 举报

  • TA的每日心情
    开心
    昨天 09:58
  • 签到天数: 160 天

    [LV.7]常住居民III

    3

    主题

    7148

    回帖

    1万

    积分

    PADS20220105初级班

    积分
    10870

    终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

    发表于 2020-8-1 09:19:03 | 显示全部楼层
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-5-27 18:59
  • 签到天数: 1 天

    [LV.1]初来乍到

    0

    主题

    600

    回帖

    1057

    积分

    二级逆天

    积分
    1057

    终身成就奖

    发表于 2020-8-1 10:03:26 | 显示全部楼层
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    每日签到,有金币领取。


    Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

    本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请发帖投诉

    ( 闽ICP备2024076463号-1 ) 论坛技术支持QQ群171867948 ,论坛问题,充值问题请联系QQ1308068381

    平平安安
    TOP
    快速回复 返回顶部 返回列表