4559|2

1902

帖子

0

TA的资源

版主

楼主
 

f769裸机移植lwip [复制链接]

本帖最后由 star_66666 于 2016-12-20 00:28 编辑

本次主要讨论裸机移植lwip,由于最近比较忙,暂且用库函数实现
第一步是看f769discovery的原理图




由图可知,网络所占用的IO,从datasheet可查出:
        RMII_REF_CLK ----------------------> PA1
        RMII_MDIO -------------------------> PA2
        RMII_MDC --------------------------> PC1
        RMII_MII_CRS_DV -------------------> PA7
        RMII_MII_RXD0 ---------------------> PC4
        RMII_MII_RXD1 ---------------------> PC5
        RMII_MII_RXER ---------------------> PG2
        RMII_MII_TX_EN --------------------> PG11
        RMII_MII_TXD0 ---------------------> PG13
        RMII_MII_TXD1 ---------------------> PG14

增加IO口的初始化操作
GPIO_InitTypeDef GPIO_InitStructure;

  /* Enable GPIOs clocks */
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOG_CLK_ENABLE();

/* Ethernet pins configuration ************************************************/
/*
        RMII_REF_CLK ----------------------> PA1
        RMII_MDIO -------------------------> PA2
        RMII_MDC --------------------------> PC1
        RMII_MII_CRS_DV -------------------> PA7
        RMII_MII_RXD0 ---------------------> PC4
        RMII_MII_RXD1 ---------------------> PC5
        RMII_MII_RXER ---------------------> PG2
        RMII_MII_TX_EN --------------------> PG11
        RMII_MII_TXD0 ---------------------> PG13
        RMII_MII_TXD1 ---------------------> PG14
  */
void lan8742_init(void)
{
  /* Configure PA1, PA2 and PA7 */
  GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
  GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
  GPIO_InitStructure.Pull = GPIO_NOPULL;
  GPIO_InitStructure.Alternate = GPIO_AF11_ETH;
  GPIO_InitStructure.Pin = GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_7;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);

  /* Configure PC1, PC4 and PC5 */
  GPIO_InitStructure.Pin = GPIO_PIN_1 | GPIO_PIN_4 | GPIO_PIN_5;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStructure);

  /* Configure PG2, PG11, PG13 and PG14 */
  GPIO_InitStructure.Pin =  GPIO_PIN_2 | GPIO_PIN_11 | GPIO_PIN_13 | GPIO_PIN_14;
  HAL_GPIO_Init(GPIOG, &GPIO_InitStructure);

}
第二步,开始配置所需寄存器
void ETH_Init(void)
{
/* Enable SYSCFG Clock */
  __HAL_RCC_SYSCFG_CLK_ENABLE();

  /* Select MII or RMII Mode*/
  SYSCFG->PMC &= ~(SYSCFG_PMC_MII_RMII_SEL);
  SYSCFG->PMC |= (uint32_t)heth->Init.MediaInterface;




HAL_ETH_ReadPHYRegister(heth, PHY_BSR, &phyreg);

HAL_ETH_WritePHYRegister(heth, PHY_BCR, PHY_AUTONEGOTIATION);
HAL_ETH_ReadPHYRegister(heth, PHY_BSR, &phyreg);
HAL_ETH_ReadPHYRegister(heth, PHY_SR, &phyreg);
/* Config MAC and DMA */
  ETH_MACDMAConfig(heth, err);


}
第三步设置默认IP
//lwip 默认IP设置
//lwipx:lwip控制结构体指针
void lwip_comm_default_ip_set(__lwip_dev *lwipx)
{
        u32 sn0;
        sn0=*(vu32*)(0x1FF0F420);//获取STM32的唯一ID的前24位作为MAC地址后三字节
        //默认远端IP为:192.168.1.100
        lwipx->remoteip[0]=192;        
        lwipx->remoteip[1]=168;
        lwipx->remoteip[2]=1;
        lwipx->remoteip[3]=104;
        //MAC地址设置(高三字节固定为:2.0.0,低三字节用STM32唯一ID)
        lwipx->mac[0]=2;//高三字节(IEEE称之为组织唯一ID,OUI)地址固定为:2.0.0
        lwipx->mac[1]=0;
        lwipx->mac[2]=0;
        lwipx->mac[3]=(sn0>>16)&0XFF;//低三字节用STM32的唯一ID
        lwipx->mac[4]=(sn0>>8)&0XFFF;
        lwipx->mac[5]=sn0&0XFF;
        //默认本地IP为:192.168.1.30
        lwipx->ip[0]=192;        
        lwipx->ip[1]=168;
        lwipx->ip[2]=1;
        lwipx->ip[3]=30;
        //默认子网掩码:255.255.255.0
        lwipx->netmask[0]=255;        
        lwipx->netmask[1]=255;
        lwipx->netmask[2]=255;
        lwipx->netmask[3]=0;
        //默认网关:192.168.1.1
        lwipx->gateway[0]=192;        
        lwipx->gateway[1]=168;
        lwipx->gateway[2]=1;
        lwipx->gateway[3]=1;        
        lwipx->dhcpstatus=0;//没有DHCP        
}

第五步,初始化LWIP内核
tcp_init();

第六步,初始化lwip stack
void Netif_Config(void)
{
  ip_addr_t ipaddr;
  ip_addr_t netmask;
  ip_addr_t gw;        

  /* IP address setting */
  IP4_ADDR(&ipaddr, IP_ADDR0, IP_ADDR1, IP_ADDR2, IP_ADDR3);
  IP4_ADDR(&netmask, NETMASK_ADDR0, NETMASK_ADDR1 , NETMASK_ADDR2, NETMASK_ADDR3);
  IP4_ADDR(&gw, GW_ADDR0, GW_ADDR1, GW_ADDR2, GW_ADDR3);

  /* - netif_add(struct netif *netif, ip_addr_t *ipaddr,
  ip_addr_t *netmask, ip_addr_t *gw,
  void *state, err_t (* init)(struct netif *netif),
  err_t (* input)(struct pbuf *p, struct netif *netif))

  Adds your network interface to the netif_list. Allocate a struct
  netif and pass a pointer to this structure as the first argument.
  Give pointers to cleared ip_addr structures when using DHCP,
  or fill them with sane numbers otherwise. The state pointer may be NULL.

  The init function pointer must point to a initialization function for
  your ethernet netif interface. The following code illustrates it's use.*/

  netif_add(&gnetif, &ipaddr, &netmask, &gw, NULL, eernetif_init, &tcpip_input);

  /*  Registers the default network interface. */
  netif_set_default(&gnetif);

  if (netif_is_link_up(&gnetif))
  {
    /* When the netif is fully configured this function must be called.*/
    netif_set_up(&gnetif);
  }
  else
  {
    /* When the netif link is down this function must be called */
    netif_set_down(&gnetif);
  }
}

第七步 开始轮询收发数据,
lwip_periodic_handle();        



另外,使用轮询,需要添加一个timer进行辅助操作
void timer3_init(void)


进行编译,运行即可,设置本地链接的IP


在命令行中输入
ping命令


说明运行成功链接到了。
有时间可以增加数据的收发。





点击此处,查看STM32F769I开发板官方资源。
查看本帖全部内容,请登录或者注册
此帖出自stm32/stm8论坛

最新回复

  详情 回复 发表于 2016-12-20 20:42
点赞 关注(1)
 

回复
举报

356

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
此帖出自stm32/stm8论坛

点评

谢谢妹妹的支持啊,呵呵呵  详情 回复 发表于 2016-12-21 21:43
 
 

回复

1902

帖子

0

TA的资源

版主

板凳
 

谢谢妹妹的支持啊,呵呵呵
此帖出自stm32/stm8论坛
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
有奖直播:当AI遇见仿真,会有什么样的电子行业革新之路?
第2场直播:融合热仿真与热测试提升产品可靠性
直播时间:04月17日 14:00 - 15:00

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 13

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表