当前位置: 首页 > news >正文

STM32单片机示例:ETH_DP83848_DHCP_NonOS_Poll_F407

文章目录

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

目的

以太网是比较常用到的功能,这篇文章讲演示在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 上开发应用》

相关文章:

  • 11:日志分析系统ELK|Elasticsearch|kibana
  • Ubuntu将c++编译成.so文件并测试
  • 【程序员养生延寿系列-万人关注的养生指南 4 】
  • 电子电气架构——AUTOSAR架构下EcuM唤醒源事件详解
  • Android在后台读取UVC摄像头的帧数据流并推送
  • 齐天大圣的生活
  • 虚拟化介绍
  • 在Pycharm中运行Django项目如何指定运行的端口
  • Java中的图数据库应用:Neo4j入门
  • 【MySQL】MySQL复合查询--多表查询自连接子查询 - 副本
  • 多益网络这种公司你还敢来吗?
  • selenium中webdriver常用的ChromeOptions参数
  • 从键盘输入5个整数,将这些整数插入到一个链表中,并按从小到大次序排列,最后输出这些整数。
  • Golang 并发机制 CSP模型
  • VR转接器:破解虚拟与现实边界的革命性设备
  • Android交互
  • angular2 简述
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • CSS盒模型深入
  • JS专题之继承
  • learning koa2.x
  • PermissionScope Swift4 兼容问题
  • PHP 的 SAPI 是个什么东西
  • Sass Day-01
  • session共享问题解决方案
  • vue 个人积累(使用工具,组件)
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 半理解系列--Promise的进化史
  • 前端代码风格自动化系列(二)之Commitlint
  • 如何利用MongoDB打造TOP榜小程序
  • 数据科学 第 3 章 11 字符串处理
  • 我的zsh配置, 2019最新方案
  • 我看到的前端
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #Spring-boot高级
  • #单片机(TB6600驱动42步进电机)
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • $NOIp2018$劝退记
  • (八十八)VFL语言初步 - 实现布局
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (十六)Flask之蓝图
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .net(C#)中String.Format如何使用
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • .NET中两种OCR方式对比
  • ?php echo ?,?php echo Hello world!;?
  • @property @synthesize @dynamic 及相关属性作用探究
  • [ vulhub漏洞复现篇 ] ThinkPHP 5.0.23-Rce
  • [AutoSar]BSW_OS 01 priority ceiling protocol(PCP)