STM32CubeMX+LAN8720+LWIP+FreeRTOS实现网络通讯

news/2024/11/23 20:21:31/

STM32CubeMX+LAN8720+LWIP+FreeRTOS实现网络通讯

使用STM32CubeMX可以非常方便的将FreeRTOS+LWIP移植到工程中,本文就是介绍如何利用STM32CubeMX移植FreeRTOS+LWIP到STM32F429开发板中。移植的流程如下示:

原理图分析
PHY手册分析
ETH及其他外设初始化
FreeRTOS配置
LWIP配置

1. 原理图分析

本文使用的硬件开发环境是STM32F429、LAN8720和RJ45(内置网络变压器),其连接原理图如下图所示:
在这里插入图片描述

LAN8720与STM32F429开发板的连接采用了RMII接口,其引脚连接如下表示:

LAN8720引脚STM32F429引脚
ETH_MDIOPA2
ETH_MDCPC1
RMII_TXD0PG13
RMII_TXD1PG14
RMII_TX_ENPB11
RMII_RXD0PC4
RMII_RXD1PC5
RMII_CRS_DVPA7
RMII_REFCLKPA1
ETH_RESETPCF8574T_P7

2. PHY手册分析

LAN8720是低功耗的10/100M以太网PHY层芯片,I/O引脚电压符合IEEE802.3-2005标准。LAN8720支持通过RMII接口与以太网MAC层通信,内置10-BASE-T/100BASE-TX全双工传输模块,支持10Mbps和100Mbps。LAN8720可以通过自协商的方式与目的主机最佳的连接方式(速度和双工模式)。支持HP Auto-MDIX自动翻转功能,无需更换网线即可将连接更改为直连或交叉连接。

LAN8720功能框图如下图示
在这里插入图片描述
在这里插入图片描述
LAN8720的配置及使用详见LAN8720数据手册,下面简单介绍几种常用功能设置

  • 中断管理:当中断事件发生且相应事件的中断位使能,LAN8720就会在nINT(14脚)产生一个低电平有效的中断信号。提供主中断和复用中断两种模式
  • PHY地址设置:MAC层通过SMI总线对PHY进行读写操作,LAN8720通过设置RXER/PHYAD0引脚来设置PHY地址,芯片内部自带下拉电阻,当硬复位结束后,LAN8720会读取该引脚电平,作为器件的SMI地址;若该引脚接下拉电阻时(浮空也可,因为内部自带下拉电阻),SMI地址为0;若该引脚接上拉电阻,SMI地址为1;这里采用的是引脚浮空,即设置LAN8720地址为0
  • nINT/REFCLKO配置:nINTSEL(2脚)用于设置nINT/REFCLKO(14脚)引脚的功能
  • 内部寄存器:BCR/BSR/PHY等寄存器

3. 以太网及其他外设初始化

  • RCC设置外接HSE,时钟设置为180M

在这里插入图片描述

  • 使能USART1,选择为异步通讯方式,波特率设置为115200Bits/s,传输数据长度为8Bit,无奇偶校验,1位停止位
  • PB0设置为GPIO推挽输出模式、上拉、高速、默认输出电平为高电平
  • 使能SWD接口,激活ST-LINK的SW调试模式

在这里插入图片描述

  • 配置IO扩展PCF8574芯片,PCF8574与STM32F429的I2C2口(PH4/PH5)相连接;使能I2C2,默认设置

在这里插入图片描述

  • 激活ETH的RMII模式,设置PHY Address为0,Rx Mode设置为中断模式,其余默认设置;设置user PHY,PHY name改为LAN8720A,其余默认设置

在这里插入图片描述
在这里插入图片描述

  • 配置ETH GPIO,根据原理图更改相应的IO口(此处PB12/PB13改为PG13/PG14)

在这里插入图片描述

4. FreeRTOS配置

  • 激活FreeRTOS,使用默认任务,分配堆栈为1024个字

在这里插入图片描述

  • 使用FreeRTOS操作系统,一定要将HAL库的Timebase Source从SysTick改为其他定时器,选好定时器后,系统会自动配置TIM

在这里插入图片描述

5. LWIP配置

  • 使能LWIP,禁止DHCP服务,配置网卡IP地址信息;其余默认设置

在这里插入图片描述

  • 生成工程后,在KEIL里编写相关程序

创建IO扩展驱动文件pcf8574.c和头文件pcf8574.h

/*初始化PCF8574*/
uint8_t PCF8574_Init(void){uint8_t temp=0;uint8_t data = 0xf0;    HAL_I2C_Mem_Write(&hi2c2,PCF8574_ADDR,255,I2C_MEMADD_SIZE_8BIT,&data,1,0xff);if(HAL_OK == HAL_I2C_Mem_Read(&hi2c2,PCF8574_ADDR|0x01,255,I2C_MEMADD_SIZE_8BIT,&temp,1,0xff)){printf("TEMP = %x!\r\n",temp);}return temp;
}/*读取PCF8574的8位IO值;返回读到的数据*/
uint8_t PCF8574_ReadOneByte(void){				  uint8_t temp=0;		  	    																 HAL_I2C_Mem_Read(&hi2c2,PCF8574_ADDR|0x01,255,I2C_MEMADD_SIZE_8BIT,&temp,1,0xff);    return temp;
}/*向PCF8574写入8位IO值;DataToWrite为要写入的数据*/
void PCF8574_WriteOneByte(uint8_t DataToWrite){HAL_I2C_Mem_Write(&hi2c2,PCF8574_ADDR,255,I2C_MEMADD_SIZE_8BIT,&DataToWrite,1,0xff);
}/*设置PCF8574某个IO的高低电平*/
//bit:要设置的IO编号,0~7
//sta:IO的状态,0或1
void PCF8574_WriteBit(uint8_t bit,uint8_t sta){uint8_t data;data=PCF8574_ReadOneByte(); //先读出原来的数据if(sta==0)data&=~(1<<bit);     else data|=1<<bit;PCF8574_WriteOneByte(data); //写入新的数据
}/*读取PCF8574某个IO的值*/
//bit:要设置的IO编号,0~7
//返回值:IO的值,0或1
uint8_t PCF8574_ReadBit(uint8_t bit){uint8_t data;data=PCF8574_ReadOneByte(); //先读取8位IO的值 if(data&(1<<bit))return 1;else return 0;   
}  

在ethernetif.c文件中的low_level_init()函数中添加PCF8574复位代码

  /* USER CODE BEGIN MACADDRESS */PCF8574_WriteBit(ETH_RESET_IO,1);HAL_Delay(50);PCF8574_WriteBit(ETH_RESET_IO,0);HAL_Delay(50);/* USER CODE END MACADDRESS */

注意:STM32CubeMX生成的代码中有时并没有填充IP地址,在lwip.c文件中的MX_LWIP_Init()函数中将相应的IP地址信息填充进去(若已填充则忽略此步骤)

  /* IP addresses initialization */IP_ADDRESS[0] = 192;IP_ADDRESS[1] = 168;IP_ADDRESS[2] = 1;IP_ADDRESS[3] = 10;NETMASK_ADDRESS[0] = 255;NETMASK_ADDRESS[1] = 255;NETMASK_ADDRESS[2] = 255;NETMASK_ADDRESS[3] = 0;GATEWAY_ADDRESS[0] = 192;GATEWAY_ADDRESS[1] = 168;GATEWAY_ADDRESS[2] = 1;GATEWAY_ADDRESS[3] = 1;/* Initilialize the LwIP stack without RTOS */

在main.c文件中添加相应测试程序

int main(void){HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_I2C2_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 */PCF8574_Init();printf("ETH test\r\n");/* USER CODE END 2 *//* Call init function for freertos objects (in freertos.c) */MX_FREERTOS_Init(); /* Start scheduler */osKernelStart();while (1){}
}

在freertos.c文件中的默认任务里面添加代码

void StartDefaultTask(void const * argument){/* init code for LWIP */MX_LWIP_Init();/* USER CODE BEGIN StartDefaultTask *//* Infinite loop */for(;;){HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_0);osDelay(100);}/* USER CODE END StartDefaultTask */
}
  • 编译无误下载到开发板后,可以看到DS1指示灯不断闪烁,表示程序正常运行;用网线将PC和STM32开发板连接起来,在PC端配置网卡IP地址(如下图示);打开PC端的cmd.exe,使用ping命令可以ping通IP地址:192.168.1.10

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


http://www.ppmy.cn/news/145580.html

相关文章

STM32407 + FreeRTOS +LAN8720 +lwip 标准库 +stm32f4x7_eth

lwip 建议不要使能 硬件校验 CHECKSUM_BY_HARDWARE 使用软件建议 在测试 LAN8720 ping 时硬件的检验 大包会PING不通的 #define ETH_MAX_PACKET_SIZE 1524 默认的1524字节 ping 1472 以上就不回复了( 例子 ping 192.168.1.1 -t -l 2048) 且 lwip EC20 PPP拨号是不能使用…

STM32CubeIDE1.9.0\STM32CubeMX 6.5 F429IGT6加LAN8720A,配置ETH+LWIP

前段时间配置的F107系列和F7的LWIP功能&#xff0c;很顺利&#xff0c;但是到了F4系列&#xff0c;选择ETH之后没有PHY地址了&#xff0c;查了一下&#xff0c;MX 6.5有大改动&#xff0c;整理了一下各路大神的各种方法&#xff0c;配出来一个可以用的&#xff0c;我这里以Cube…

RTL8720DN开发笔记一 环境搭建与mqtt实例

简介 RTL8720DN是一款支持双频WiFi的Soc芯片&#xff0c;即2.4GHz或5.8GHz频段&#xff0c;可以告别在选择WiFi网络时仅支持2.4G的尴尬&#xff0c;不仅如此&#xff0c;RTL8720DN还支持了低功耗蓝牙BLE5.0&#xff0c;内部集成了两颗MCU&#xff0c;分别为ARM V8M(KM4 兼容Co…

以太网PHY芯片LAN8720A芯片研究

一、LAN8720A概述 1. 简介 LAN8720A/LAN8720Ai是一个低功耗的可变I/O电压的10/100M PHY收发器,符合IEEE 802.3-2005标准,支持通过RMII接口与以太网MAC通信。 LAN8720A/LAN8720Ai实现自动协商,自动确定最佳可能的速度和双工操作模式。HP Auto-MDIX支持允许使用直接连接或交…

新唐NUC980使用记录:访问以太网(LAN8720A) 启用SSH

文章目录 目的修改内核以访问以太网制作根文件系统并启用SSH总结 目的 这篇文章主要测试访问以太网&#xff08;PHY为LAN8720A&#xff09;以及启用SSH。 这篇文章中内容均在下面的开发板上进行测试&#xff1a; 《新唐NUC980使用记录&#xff1a;自制开发板&#xff08;基于…

5G WiFi 安信可 BW16 模组 RTL8720DN 入门笔记 2:Linux 搭建二次开发SDK开发环境,点亮一盏LED灯。

首先按照环境所依赖的包&#xff1a; sudo apt-get install git wget libc6-i386 lib32ncurses5 make bc gawk ncurses-dev 开始获取SDK源码&#xff0c;并且修改权限&#xff1a; git clone https://github.com/ambiot/ambd_sdk.git sudo chmod -R 777 ambd_sdk然后开始编译…

调试cube生成的f107+lan8720代码

之前用的w5500&#xff0c;无奈芯片越来越贵了&#xff0c;正好手头上有100来颗lan8720a&#xff0c;直接将方案改了吧。 以前在深圳工作时公司的网关正好用的这个方案&#xff0c;直接抄吧。 硬件设计网口无晶振&#xff0c;由mcu的mco脚输出&#xff0c;50Mhz模式&#xff0…

GD32F450以太网(2-1):PHY芯片LAN8720A介绍

PHY芯片LAN8720A 文章目录 PHY芯片LAN8720A1. MCU网口输出设计现状2. LAN8720A2.1 LAN8720A简介2.2 LAN8720A使用连接简图2.3 LAN8720A内部图2.4 LAN8720A和MCU连接图 3. LAN8720A内部寄存器[^1]3.1 BCR寄存器3.2 BSR寄存器3.3 PHY特殊功能寄存器 声明 1. MCU网口输出设计现状 …