测试用例 多进程 百度搜索优化 jquery unity3d ssis xampp grunt vue响应式 jq选择子元素 jquery删除子元素 idea生成main方法 查看oracle连接数 ln函数图像 python文件操作 python输出中文 python变量定义 java文件写入 java可变参数 java的集合 java中random 系统集成项目管理工程师教程 免费脚本 comsol软件下载 netreflector 苹果手机总是自动重启 微信临时链接多久失效 小米9截屏 小程序游戏源码 cad自动保存位置 linux解压命令 磁芯大战 vs2008中文版下载 qq流览器下载 红米3和红米3s的区别 调试工具 iar软件 cdr怎么复制图形 护魂者的命运 mapinfo下载
当前位置: 首页 > 学习教程  > 编程语言

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

2021/2/13 20:27:01 文章标签: 测试文章如有侵权请发送至邮箱809451989@qq.com投诉后文章立即删除

STM32CubeMXLAN8720LWIPFreeRTOS实现网络通讯 使用STM32CubeMX可以非常方便的将FreeRTOSLWIP移植到工程中,本文就是介绍如何利用STM32CubeMX移植FreeRTOSLWIP到STM32F429开发板中。移植的流程如下示: #mermaid-svg-IEetN8rIz9hK3Ex6 .label{font-family…

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口相连接;使能I2C2,默认设置

在这里插入图片描述

  • 激活ETH的RMII模式,设置PHY Address为0,其余默认设置;设置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.dtmao.cc/news_show_700482.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?