STM32单片机示例:ETH_DP83848_DHCP_NonOS_Poll_F407

news2024/11/25 12:35:51

文章目录

  • 目的
  • 基础说明
  • 主要配置
  • 关键代码
  • 示例演示
  • 示例链接
  • 关于中断
  • 总结

目的

以太网是比较常用到的功能,这篇文章讲演示在STM32F407上启用以太网功能,使之能够加入网络中,通过DHCP获得IP地址,可以被Ping通。

基础说明

STM32F407是一个自带以太网控制器(ETH MAC)的单片机,只要外接以太网收发器(ETH PHY)就可以进行以太网通讯了。

不过通常来说以太网是一个相对复杂的东西,除了 MAC 和 PHY 外还需要很多软件上的协议支撑,才能方便的进行应用程序的开发,通常嵌入式设备中比较常用的是 LwIP 。

DHCP是一种可以让接入网络的设备可以动态获取IP地址的服务。通常作为一个可以联网工作的设备而言,通过DHCP自动获取IP地址是比较常用的方式。

使用 STM32CubeMX 可以方便的配置芯片自带的 ETH MAC ,可以配置 LwIP ,在 LwIP 中还可以选择一些 ETH PHY 芯片(比如本文的DP83848)。

在早期的版本中默认配置生成的代码在使用DHCP时,如果设备启动时没有插入网线,那么程序会一直卡在DHCP启动这里,目前版本中已经修复了这个问题。本文编写时使用的版本如下:

STM32CubeF4 Firmware Package V1.28.0 / 01-November-2023
Current version of LwIP supported by CubeMx: 2.1.2

主要配置

启用的外设与中间件:
在这里插入图片描述
时钟:
在这里插入图片描述
以太网:
在这里插入图片描述
LwIP:
在这里插入图片描述
堆栈:
在这里插入图片描述

关键代码

main.c 中一些手动添加的代码:

#include "main.h"
#include "lwip.h"

UART_HandleTypeDef huart6;

/* With GCC, small printf (option LD Linker->Libraries->Small printf set to 'Yes') calls __io_putchar() */
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch) // 实现__io_putchar函数
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */

PUTCHAR_PROTOTYPE
{
    HAL_UART_Transmit(&huart6, (uint8_t *)&ch, 1, 0xFFFF); // for printf()
    return ch;
}

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_LWIP_Init(); // 初始化网络功能
  MX_USART6_UART_Init();

  while (1)
  {
	  MX_LWIP_Process(); // 处理网络相关事务

	  static uint32_t previous = 0;
	  if((HAL_GetTick() - previous)>=1000)
	  {
		  previous = HAL_GetTick();
		  extern struct netif gnetif; // 网卡对象,在lwip.c文件中定义
		  // 打印时间和IP地址
		  printf("%ld - loop: ip addr %s\n", HAL_GetTick(), ip4addr_ntoa(netif_ip_addr4(&gnetif)));
	  }
  }
}

lwip.c 中一些手动添加的代码:

/**
  * @brief  Notify the User about the network interface config status
  * @param  netif: the network interface
  */
static void ethernet_link_status_updated(struct netif *netif)
{
  if (netif_is_up(netif))
  {
	  printf("%ld - link status callback: netif_is_up!\n", HAL_GetTick());
  }
  else /* netif is down */
  {
	  printf("%ld - link status callback: netif_is_down!\n", HAL_GetTick());
  }
}

示例演示

连续Ping半个小时:
在这里插入图片描述

插拔网线测试:
在这里插入图片描述

示例链接

仓库地址: https://github.com/NaisuXu/STM32_MCU_Examples

本文中的示例位于仓库中 ETH_DP83848_DHCP_NonOS_Poll_F407

关于中断

以太网也是带中断的,以太网中断主要在接收、发送完成和错误等时候触发。

理论上来说可以在中断中接收数据,不过通常不应该在中断中处理耗时操作,所以更多的时候在中断中只是进行下标记,然后在主循环中处理。

未使用操作系统的情况下其实用中断和不用中断区别不是很大。官方也只在用了操作系统的情况下启用以太网中断,主要就是下面即可例程:

LwIP_HTTP_Server_Netconn_RTOS
LwIP_HTTP_Server_Socket_RTOS
LwIP_UDPTCP_Echo_Server_Netconn_RTOS

例程中首先是中断回调函数:

void ETH_IRQHandler(void)
{
  HAL_ETH_IRQHandler(&EthHandle);
}

回调函数中调用了HAL库对以太网中断的处理函数:

void HAL_ETH_IRQHandler(ETH_HandleTypeDef *heth)
{
  if (/* Packet received */)
  {
      HAL_ETH_RxCpltCallback(heth);
  }

  if (/* Packet transmitted */)
  {
      HAL_ETH_TxCpltCallback(heth);
  }

  if ( /* ETH DMA Error */)
  {
      HAL_ETH_ErrorCallback(heth);
  }
}

例程中各个中断的处理都是给了个信号量:

void HAL_ETH_RxCpltCallback(ETH_HandleTypeDef *heth)
{
  osSemaphoreRelease(RxPktSemaphore);
}

void HAL_ETH_TxCpltCallback(ETH_HandleTypeDef *heth)
{
  osSemaphoreRelease(TxPktSemaphore);
}

void HAL_ETH_ErrorCallback(ETH_HandleTypeDef *heth)
{
   osSemaphoreRelease(RxPktSemaphore);
}

总结

到此为止网络部分已经可以正常工作了,接下来就可以开发网络应用了,主要是使用LwIP提供的一些接口进行数据交互,这方面内容可以参考官方例程和文档:
《UM1713 使用 LwIP TCP/IP 栈,在 STM32Cube 上开发应用》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1484327.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

EI顶刊复现:基于氨储能技术的电转氨耦合风–光–火综合能源系统双层优化调度程序代码!

适用平台:MatlabYalmipCplex 程序首先提出电转氨耦合综合能源系统构型,并为燃煤机组出力、风光消纳和电转氨运行的经济性和稳定性的综合评价定义风–光–火–氨系统协调运行指标;进而构建以协调运行指标最大为上层目标、电转氨耦合风–光–火…

数据结构与算法:堆

朋友们大家好啊,本篇文章来到堆的内容,堆是一种完全二叉树,再介绍堆之前,我们首先对树进行讲解 树与堆 1.树的介绍1.1节点的分类 2.树的存储结构3.二叉树的概念和结构3.1 二叉树的特点3.2 特殊的二叉树3.3二叉树的存储结构 4.堆的…

(科目三)计算机基础及网络的应用

1.计算基础知识 计算机是20世纪人类最伟大的发明之一,它是由电子逻辑部件组成的一种能够存储信息、自动完成各种运算的逻辑设备。 世界上第一台数字电子计算机ENIAC于1946年诞生在美国的宾夕法尼亚大学,由约翰莫克里和普雷斯波艾克领导研制。 当前&am…

【SpringBoot】mybaitsPlus的多数据源配置

📝个人主页:五敷有你 🔥系列专栏:SpringBoot ⛺️稳重求进,晒太阳 mybatisPlus的多数据源配置 适用于多种场景:纯粹多库、 读写分离、 一主多从、 混合模式等 目前我们就来模拟一个纯粹多…

React-router的创建和第一个组件

需要先学react框架 首先:找到一个文件夹,在文件夹出打开cmd窗口,输入如下图的口令 npx create-react-app demo 然后等待安装 安装完成 接下来进入创建的demo实例 cd demo 然后可以用如下方式打开vscode code . 注意:不要忽略点号与…

监控与日志

一、监控 1、监控类型 从监控类型上划分,在 K8s 中可以分成四个不同的类型: ① 资源监控:这种监控主要关注于基础资源的使用情况,例如 CPU、内存、网络等。通常使用数值或百分比等单位来统计,可以通过 Zabbix、Tele…

日志到filebeat-->logstash-->elastic-->kibana

1、日志到filebeat。 cat /etc/filebeat/filebeat.yml filebeat.inputs: - type: syslog format: rfc3164 protocol.udp: host: "0.0.0.0:514" output.logstash: hosts: ["localhost:5044"] 验证方式: tcpdump -i 网卡名称 udp port 514 2、…

LeetCode 刷题 [C++] 第55题.跳跃游戏

题目描述 给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 题目分析 题目中…

电子电器架构 —— DoIP协议相关的介绍

电子电器架构 —— DoIP协议相关的介绍 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他人的角度来反对自己。人生在世,最怕…

【C++精简版回顾】16.虚函数,多态

1.虚函数与多态 以下为AI生成 虚函数是C中实现多态性的一种机制。多态性允许一个类的对象可以以多种不同的方式工作,即同一个函数可以根据对象的不同类型表现出不同的行为。 在C中,通过在基类中声明虚函数,并在派生类中进行重写,可…

外贸福利 PHP源码 WhatsApp 营销 - 批量发件人、聊天、机器人、SaaS 搭建

WhatsApp 营销工具对于外贸人员来说至关重要。随着全球贸易的不断发展,WhatsApp已成为了许多国际贸易商之间沟通的首选工具之一。通过利用WhatsApp营销工具,外贸人员可以轻松地与客户建立联系,传递产品信息,进行价格谈判&#xff…

分销小程序的常见功能

分销小程序是一种非常有前景和潜力的产品形式,可以帮助企业快速拓展销售渠道,增加销售额。下面我将介绍分销小程序的常见功能。 1. **分销商注册与管理**:支持任何用户自动成为分销商,也可以支持有会员等级(或付费或审…

C# OpenVINO Crack Seg 裂缝分割 裂缝检测

目录 效果 模型信息 项目 代码 数据集 下载 C# OpenVINO Crack Seg 裂缝分割 裂缝检测 效果 模型信息 Model Properties ------------------------- date:2024-02-29T16:35:48.364242 author:Ultralytics task:segment version&…

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:颜色渐变)

设置组件的颜色渐变效果。 说明: 从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 linearGradient linearGradient(value: { angle?: number | string; direction?: GradientDirection; colors: Array; repea…

2024年3月5-7日年生物发酵装备展-环科环保科技

参展企业介绍 山东环科环保科技有限公司,是一家集环保设备的设计、制造、安装、服务及环境治理工程总承包于一体的企业。 公司长期专注于大气、水、危固废三大领域,以科技创造碧水蓝天,为客户提供环保解决方案。 以稳定的产品及服务质量、适用的技术、…

游戏科技:超越娱乐的界限

12月25日,国家新闻出版署在节日前夕推出令业内人士振奋的好消息——本次共有105款国产网络游戏通过审批,获得版号,这不仅数量超过了历史新高,更使业内人士看到政策回暖的希望。 这105款游戏覆盖多家知名游戏企业,其中不…

SketchUp Pro 2023:颠覆传统,重塑设计世界mac/win版

SketchUp Pro 2023是一款强大的三维建模软件,专为设计师、建筑师和创意专业人士打造。这款软件以其直观易用的界面和强大的功能而著称,为用户提供了无限的创意空间。 SketchUp Pro 2023软件获取 SketchUp Pro 2023在用户体验方面进行了全面的优化&#…

ABAP - SALV教程03 - 开篇:打开SALV的三种方式之三

全屏模式生成SALV的方式:http://t.csdnimg.cn/CzNLz可控模式生成SALV的方式:http://t.csdnimg.cn/zB7tuDocking container生成SALV的方式,需要在屏幕的PBO或者屏幕初始化事件里完成。完整代码 TABLES:vbak.CLASS lcl_model DEFINITION.PUBLIC…

取送货问题(Pickup and Delivery Problem)

取送货问题及其变体 广义取送货问题(General Pickup and Delivery Problems,GPDP)可以分为两类: Vehicle Routing Problems with Backhauls,VRPB:从配送中心(depot)取货运输货物到客…

buuctf misc做题笔记

喵喵喵 使用stegsolve.jar,按BGR顺序提取出一个png图片,是一个只显示一半的二维码,修改图片高度显示全部二维码,解析出一个百度网盘地址,https://pan.baidu.com/s/1pLT2J4f 下载得到压缩包flag.rar。解压成功&#xf…