其他分享
首页 > 其他分享> > STM32CubeMX+LAN8720+LWIP+FreeRTOS实现网络通讯

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

作者:互联网

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. 以太网及其他外设初始化

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

在这里插入图片描述

4. FreeRTOS配置

在这里插入图片描述

在这里插入图片描述

5. LWIP配置

在这里插入图片描述

创建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 */
}

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

标签:LWIP,FreeRTOS,引脚,LAN8720,uint8,网络通讯,IO,ADDRESS,PCF8574
来源: https://blog.csdn.net/Chuangke_Andy/article/details/113803270