基于STM32F107裸机移植LWIP(STM32CUBE配置)

MCU:STM32F107

PHY:KSZ8081

LWIP_VERSION:2.0.3

1.配置RCC,串口,定时器

1.1 开启RCC,使用内部8M晶振,配置系统时钟

基于STM32F107裸机移植LWIP(STM32CUBE配置)

 

基于STM32F107裸机移植LWIP(STM32CUBE配置)

1.2 打开调试串口1,打开接收中断,开启DMA发送

基于STM32F107裸机移植LWIP(STM32CUBE配置)

基于STM32F107裸机移植LWIP(STM32CUBE配置)

基于STM32F107裸机移植LWIP(STM32CUBE配置)

1.3 打开定时器中断

基于STM32F107裸机移植LWIP(STM32CUBE配置)

2.ETH配置参数

基于STM32F107裸机移植LWIP(STM32CUBE配置)

PHY地址怎么确定?看PHY硬件手册和硬件原理图

基于STM32F107裸机移植LWIP(STM32CUBE配置)

 

基于STM32F107裸机移植LWIP(STM32CUBE配置)

基于STM32F107裸机移植LWIP(STM32CUBE配置)

 

基于STM32F107裸机移植LWIP(STM32CUBE配置)

2.1 PHY前16个寄存器是通用的标准的,不需要修改。修改下PHY控制状态寄存器的偏移,以及哪个BIT位代表速度哪个BIT位代表全双工、半双工。我们可以看下PHY的丛植状态寄存器

基于STM32F107裸机移植LWIP(STM32CUBE配置)

 

基于STM32F107裸机移植LWIP(STM32CUBE配置)

 2.2  开启连接和状态回调函数,这样可以实现网线插上和拔下的时候触发事件,能够拔下网线的时候缓存数据,插上网线的时候重新申请IP地址并连接服务器。

在ethernetif.c文件里面

 void ethernetif_notify_conn_changed(struct netif *netif)
{
  /* NOTE : This is function could be implemented in user file 
            when the callback is needed,
  */
    DebugUARTPrintf("conn_changed");
    if(netif_is_link_up(netif) && !netif_is_up(netif))
    {
         netif_set_up(netif);
         extern err_t dhcp_start(struct netif *netif);
         dhcp_start(netif);
    }

}

需要把   ethernetif_set_link(netif_default)放到void MX_LWIP_Process(void),并把void MX_LWIP_Process(void)放到主函数里面轮循。

 

基本上到这里就可以PING通了。可以再加上业务层,可以到ST的官方上下载,官方网站上有关于做TCP/UDP客户端以及服务器等等。