STM32F4+LAN8720A+STM32CubeMX+Lwip 网络通讯(以太网通讯)小实例

2023-05-16

一、目标实现

     通过网络通信的方式,当上位机发出对应指令给STM32,STM32根据收到的指令来执行对应的操作(例如:亮灯、灭灯、闪灯等)。还有可以将STM32连上路由器,当电脑连上路由器后,也可以通过上位机给STM32发送命令。

二、实现步骤

1、首先使用STM32CubeMX按照对应的开发板生成对应的程序模版。

本人使用的正点原子的STM32F407ZGT6探索者开发板,对应的以太网接口是LAN8720A

在STM32CubeMX中选上ETH、Lwip(不带操作系统)、对应需要点灯的管脚。

  • ETH配制中:按照开发板LAN8720A对应的手册,将特殊标志位地址与芯片的信息一一配对选上(其实Cube生成的默认参数和LAN8720A是对应的上的,如果是其他PHY芯片,则需要查看手册来配制)
  • Lwip配制中:不使用DHCP,使用手动配制的IP。

 在这一步中,其实以及把要做的工作完成了90%了!只剩下在应用层面使用LwIP的raw api接口进行开发了。

注意:PHY Address Value 需要设置成0!

 相应配制如图所示:

ETH配制

LWIP配制1

 2、当生成模版后,给ethernetif.c中的 HAL_ETH_MspInit(ETH_HandleTypeDef* ethHandle) 中添加LAN8720A的使能代码,然后在主函数的死循环中添加 MX_LWIP_Process()函数就可以实现在电脑上ping通STM32了

LAN8720A使能

 3、阅读LwIP官方给的RAW API 资料,实现在应用层上建立tcp/ip的应用

这里的流程与其他平台上tcp/ip或者upd通讯有很多的相似性

  • 首先先创建  struct tcp_pcb *tcp_new(void)  创建pcb块(类似创建socket)
  • 其次绑定IP err_t tcp_bind(struct tcp_pcb *pcb, ip_addr_t *ipaddr, u16_t port)//PCB绑定指定的ip 与 端口号
  • 然后看作为 客户端 还是 服务器
  • 若是作为服务器 则使用进行监听 struct tcp_pcb *tcp_listen(struct tcp_pcb *pcb)//返回新的pcb块

       然后当有连接进来后 则使用建立连接 :

       void tcp_accept(struct tcp_pcb *pcb, err_t (* accept)(void *arg, struct tcp_pcb *newpcb, err_t err)) //在回调函数中来执行建立连接后要执行的事情

      连接建立后则可以开始进行读写操作 :

      err_t tcp_write(struct tcp_pcb *pcb, const void *dataptr, u16_t len,  u8_t apiflags)//直接往PCB块中国写入len长度的dataptr指向内容

      void tcp_sent(struct tcp_pcb *pcb, err_t (* sent)(void *arg, struct tcp_pcb *tpcb, u16_t len)) //在回调函数中来执行接受到消息后要执行的事情

      void tcp_recv(struct tcp_pcb *pcb, err_t (* recv)(void *arg, struct tcp_pcb *tpcb,  struct pbuf *p, err_t err))//在回调函数中来执行接受到消息后要执行的事情

      void tcp_recved(struct tcp_pcb *pcb, u16_t len) //从PCB块中接受len长度的数据

 三、有关LwIP的一些理解与生成模版代码的注释

//lwip.c 
void MX_LWIP_Init(void)
{
  /* IP addresses initialization */
  //ip地址、子网掩码、网关
  IP_ADDRESS[0] = 192;
  IP_ADDRESS[1] = 168;
  IP_ADDRESS[2] = 1;
  IP_ADDRESS[3] = 100;
  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 */
  //初始化lwip,初始化了mem、pbuf、netif、ip、tcp与udp,检查延迟时间的舒适化等等
  lwip_init();

  /* IP addresses initialization without DHCP (IPv4) */
  //将IP等信息转化成为 大端序 添加到IPV4信息中、ipaddr、netmask、gw
  IP4_ADDR(&ipaddr, IP_ADDRESS[0], IP_ADDRESS[1], IP_ADDRESS[2], IP_ADDRESS[3]);
  IP4_ADDR(&netmask, NETMASK_ADDRESS[0], NETMASK_ADDRESS[1] , NETMASK_ADDRESS[2], NETMASK_ADDRESS[3]);
  IP4_ADDR(&gw, GATEWAY_ADDRESS[0], GATEWAY_ADDRESS[1], GATEWAY_ADDRESS[2], GATEWAY_ADDRESS[3]);

  /* add the network interface (IPv4/IPv6) without RTOS */
  //添加网络接口到 lwip netifs 列表中,调用回调函数来初始化以太网,在netif 网络接口结构体中放置input
  //其中 ethernetif_init 中包括了 low_level_init(用于初始化 以太网管脚接口、MAC信息、使能DMA与MAC的数据交互)
  //其中 ethernet_input 用于接收以太网接口的数据帧
  netif_add(&gnetif, &ipaddr, &netmask, &gw, NULL, &ethernetif_init, &ethernet_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);
  }

/* USER CODE BEGIN 3 */

/* USER CODE END 3 */
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32F4+LAN8720A+STM32CubeMX+Lwip 网络通讯(以太网通讯)小实例 的相关文章

  • Unity-EmojiUI更新

    项目中可能会用到emoji表情 xff0c 所以这几天针对这个模块进行了制作和整理 首先 xff0c 在网上进行简单的搜索查找现成方案 xff0c 主要搜索结果为textmeshpro和github上的一些emoji项目 xff0c 因为闭
  • ZYNQ UltraScale 双核裸跑 / 裸跑 + Linux

    1 背景提出 某项目对中断延迟有很高的要求 xff0c 客户的构架为 xff1a PPC 43 Vxworks 延迟时间大概 xff1a 10us 因硬件设计原因 xff0c 还可以更小 我们在Linu系统下测试中断延迟大概几百us 而且这
  • ZYNQ有两个CPU?(一)——AMP搭建

    ZYNQ有两个CPU xff1f xff08 一 xff09 AMP搭建 罗宾老师 嵌入式教师 码峰社QQ群541931432
  • 一个复杂的nf_conntrack实例全景解析

    本文关注两点 xff0c 一点是细节 xff0c 另外一点是概览 xff1a 细节 xff1a 一个完整的关于nf conntrack和NAT互动的例子概览 xff1a 关于人云亦云的讽刺 近期搜集了一些关于iptables xff0c N
  • python subprocess.Popen的使用

    python中的subprocess Popen xff08 xff09 使用 从python2 4版本开始 可以用subprocess这个模块来产生子进程 并连接到子进程的标准输入 输出 错误中去 xff0c 还可以得到子进程的返回值 s
  • FreeRTOS系列|任务堆栈

    任务堆栈 运行freertos系统的大部分都是资源有限的MCU xff0c 所以对于RAM我们都要考虑尽量的节省 xff0c 避免资源浪费 下面将会基于Cortex M3内核的STM32F103型MCU来介绍FreeRTOS任务栈大小的确定
  • Tricore内核上下文切换机制CSA--Apple的学习笔记

    动机 FreeRTOS在port c中都是和内核相关的 xff0c 我就是想了解清楚TC2上下文切换的机制 所以看pxPortInitialiseStack函数 xff0c 里面主要是初始化CSA xff0c 在FreeRTOS任务创建函数
  • SPI通信协议详解

    SPI是Serial Peripheral Interface的缩写 xff0c 意即串行外设接口 SPI是一种高速的 全双工 同步通信总线 xff0c 常用于处理器与板载外设 xff08 比如Flash存储器 实时时钟芯片 AD DA芯片
  • 省教育厅关于印发《湖北省义务教育阶段信息技术课程指导意见(试行)》的通知

    鄂教幼高 2016 4号 各市 州 县教育局 xff1a 21世纪以来 xff0c 信息技术迅猛发展 xff0c 深刻地改变着人们的学习 生产 生活和社会交往方式 xff0c 人类社会已快速进入信息化社会 信息素养是当代社会公民所必备的基本
  • 计算机与信息技术常用小工具

    一 图片编辑工具 xff1a Photoshop Photoshop主要处理以像素所构成的数字图像 使用其众多的编修与绘图工具 xff0c 可以有效地进行图片编辑工作 ps有很多功能 xff0c 在图像 图形 文字 视频 出版等各方面都有涉
  • 计算机业务学习心得体会及辅助资料

    教师业务学习心得体会 我校在2019年年末举行了一次全校性的教师业务学习活动 xff0c 在本次业务学习后业务水平取得了长足的进步和提升 xff0c 发现了一些不足 xff0c 获得了一些新的东西 xff0c 亦总结了一些心得和体会 xff
  • 归并排序 详解

    注 xff1a 内容 xff0c 图片来自于慕课网liuyubobobo老师的课程 官方代码链接 xff1a https github com liuyubobobo Play with Algorithms 算法复杂度 xff1a O x
  • 关于MSP432单片机的吐槽【2021电赛A题】

    一 选题 全国大学生电子设计竞赛刚刚完赛 xff0c 本人选做的是A题 xff1a 失真度测量装置 当时选题的时候看到它附带了说明 xff1a 一定要使用TI公司的MCU以及它的片内ADC xff0c 不得使用其他片外ADC 和数据采集模块
  • 实现TCP并发服务器---IO多路复用

    实现TCP并发服务器 IO多路复用 1 服务器模型 1 1 概念 服务器模型主要分为两种 xff0c 循环服务器 xff0c 并发服务器 循环服务器 xff1a 服务器在同一时间只能处理一个客户端的请求 并发服务器 xff1a 服务器在同一
  • STM32串口发送中断踩坑

    今天想测试下Modbus设备 xff0c 手上暂时没有串口转485的模块 xff0c 就打算用手上的stm32f042的开发板做个串口转485模块 如下所示 但是软件实际开发过程中 xff0c 遇到了麻烦 现象 在打开串口接收中断时 xff
  • 十六进制转十进制(c语言)

    输入的十六进制数 xff0c 通过字符型存放在a 数组中 首先将字符型转为int型 xff08 将a转为10等等 xff09 存放在b 数组中 在与10 n相乘在相加得出结果 include lt stdio h gt include lt
  • 对视频图像进行OSD叠加

    频叠加就是将图片和文字信息叠加到视频信号中 xff0c 如电视台的LOGO xff0c 电影的字幕 xff0c 电视机的菜单 xff0c 都是通过视频叠加的形式显示在视频图像中的 区别于用于专业影视编辑行业的字幕叠加器 xff0c 字符叠加
  • VS2019 C#开发手机App环境配置和开发

    参考链接 xff1a https www dianyuan com eestar article 1284 html 上位机开发人员 xff0c 想开发APP xff0c 从头学Java xff0c 需要花的时间成本太大 xff0c 最近网
  • 华为手机通过ADB禁止系统更新和卸载自带软件

    参考链接 xff1a 电源网 刚买华为手机最烦的是每天都提示系统更新 xff0c 就算设置不提醒 xff0c 过两天又开始提醒 xff0c 不死不休 xff0c 最后还是一次手误最终还是让它得逞了 xff0c 自动更新了 xff0c 下面就
  • C#利用Socket实现C/S模式通信

    参考链接 xff1a https www dianyuan com eestar article 1330 html 首先我们要了解一下几点内容 xff1a 1 Tcp IP协议是什么 xff1f 2 Socket是什么 xff1f 3 s

随机推荐

  • OpenCV 图像处理 灰度化、二值化与加噪

    参考链接 xff1a https www dianyuan com eestar article 1414 html 因为要自动检测裂缝 xff0c 就考虑到了图像的二值化处理 xff0c 虽然C 可以实现二值化处理 xff0c 但是是逐个
  • ROC-RK3328-CC 开发板开箱和上手指南

    参考链接 xff1a https www dianyuan com eestar article 1424 html RK3328处理器采用了64位A53架构四核处理器 xff0c 主频为1 5GHz xff0c GPU则采用了Mali 4
  • C#中AForge库调节视频亮度、饱和度等属性

    参考链接 xff1a https www dianyuan com eestar article 1479 html 之前工作中需要调节摄像头的亮度 饱和度调节 xff0c 之前一直通过调用AForge的调节控件才能调节 xff0c 虽然可
  • Ubuntu下安装和配置Qtcreator5.15版本

    Qt选择 在官方的声明中 xff0c Qt5 15是Qt5 x的最后一个LTS版本 xff0c 增加了即将在2020年底推出的Qt6的部分新特性 xff0c 为了之后的新版本有更好的兼容性 xff0c 选择了Qt5 15 下载Qt 对于普通
  • python 获取文件夹下的文件名操作(两种)

    一 相对路径 文件存储的想对路径路径 path 61 39 data 0 39 os walk 是一个生成器 xff0c 返回三个值 xff1a 根目录 xff0c 根目录下的目录和文件列表 folder 61 os walk path 3
  • 1、串口(UART/COM/TTL/RS232/RS485)

    目录 串口简介 串行通讯制式 UART 2 1 简介 2 2 电平标准 TTL RS232 RS485 2 3 电平转换 xff08 重点讲解RS232 TTL xff09 USB转TTL USB转RS232 USB转RS485 RS232
  • 集成Python和QML

    Qt包括QML作为一种声明性地描述用户界面并使用JavaScript作为其中的脚本语言的手段 可以编写完整的独立QML应用程 序 xff0c 或将它们与C 43 43 结合使用 PyQt5允许QML以完全相同的方式与Python集成 特别是
  • 个人小型管理服务器 SVN的安装和使用方法

    1 下载TortoiseSVN客户端 官网下载地址 Downloads TortoiseSVN 注意下载跟你电脑位数匹配 64位 32位 的安装包 在页面的下面你还可以找到语言包 如图 下载完成后 应该有这些安装包 如图 接下来我们安装To
  • Ubuntu20.04下安装QtCreator 5.14.2(安装/卸载/创建快捷键/添加收藏)

    原文链接 xff1a https www dianyuan com eestar article 2864 html 都是自己原创 xff0c 发这里提高下知名度 xff0c 也帮助需要的人 一 Qt和Qt Creator的区别 Qt是C
  • WPF中自定义双滑块Slider

    项目中遇到需要双滑块的情况 xff0c 可以网上的基本都是单滑块的样式和例子 xff0c 但是双滑块的很少 xff0c 后来终于在网上找到一个大神的帖子 xff0c 通过修改和完善终于符合自己的需求 xff0c 可后来再查看代码的时候好像又
  • C#通过API对硬件进行禁用和启用

    慢慢的随着年龄的增长 xff0c 脑子越来越不够用 xff0c 而自己的收藏栏也越来越杂乱 xff0c 虽然现在的网上要啥都有 xff0c 但是没有经过自己亲手实验和整理总结 xff0c 下次需要的时候一切又要从头开始 xff0c 而电子星
  • Ubuntu下如何获取usb相机的PID/VID并打开指定的相机

    项目需求控制和打开两个USB摄像头 xff0c 并且根据相机的PID和VID来打开指定的相机 xff0c 来区分主副相机 xff0c 在Windows下可以通过AForge Video DirectShow库来实现 xff0c 但是Ubun
  • ubuntu在arm平台下编译安装opencv(亲测可用)

    X86平台安装很多软件一句话就可以搞定 xff0c 非常方便 xff0c 但是在arm平台一个简单的软件安装起来都非常费尽 xff0c 一个软件安装就要折腾好几天 下面就把安装opencv的过程记录下来 一 通过pip安装opencv xf
  • ubuntu在arm平台下编译安装Qt5.15.2和PySide2(亲测可用)

    一 安装Qt5 15 2 1 下载源码首先在官网下载Qt5 15 2的源码 xff1a https download qt io archive qt 5 15 5 15 2 single 2 先安装编译qt的环境 sudo apt get
  • ubuntu20.04安装cmake详细教程

    一 命令行安装 xff08 这种直接安装cmake xff0c 其实安装的版本都太老了 xff0c 这种方式不推荐 xff09 sudo apt install cmake 二 Cmake源码编译安装 1 更新一下g 43 43 已经安装请
  • ubuntu20.04编译安装qt5.14.2和qtcreator4.12.0

    编译qt5 14 2 本来编译安装的是qt5 15 2 xff0c 编译安装ok xff0c 一切就绪 xff0c 安装qtcreator安装后一直报错 xff0c 以下插件有错误 xff0c 无法载入 xff1a QmlDesigner
  • PX4飞控的PPM接收机

    xff08 一 xff09 原理图 xff1a PX4飞控的PPM输入捕获由协处理器完成 xff0c 接在A8引脚 xff0c 对应Timer1的通道1 xff08 二 xff09 PPM协议 xff1a PPM的每一帧数据间隔为20ms
  • WPF DocumentViewer控件如何隐藏搜索栏/工具栏/部分按钮

    WPF DocumentViewer中默认是显示工具栏和搜索栏的 xff0c 如果想隐藏工具栏和搜索栏 xff0c 可以通过以下代码实现 lt DocumentViewer gt lt DocumentViewer Resources gt
  • 什么是stl? 如何使用stl?

    1 什么是STL xff1f STL Standard Template Library 是C 43 43 的标准模板类库 STL是一个功能强大的基于模板的容器库 xff0c 通过直接使用这些现成的标准化组件可以大大提高算法设计的效率和可靠
  • STM32F4+LAN8720A+STM32CubeMX+Lwip 网络通讯(以太网通讯)小实例

    一 目标实现 通过网络通信的方式 xff0c 当上位机发出对应指令给STM32 xff0c STM32根据收到的指令来执行对应的操作 xff08 例如 xff1a 亮灯 灭灯 闪灯等 xff09 还有可以将STM32连上路由器 xff0c