STM32单片机示例:ETH_DP83848_DHCP_NonOS_Poll_F407

2024-03-03 01:52

本文主要是介绍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 上开发应用》

这篇关于STM32单片机示例:ETH_DP83848_DHCP_NonOS_Poll_F407的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/768089

相关文章

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

STM32内部闪存FLASH(内部ROM)、IAP

1 FLASH简介  1 利用程序存储器的剩余空间来保存掉电不丢失的用户数据 2 通过在程序中编程(IAP)实现程序的自我更新 (OTA) 3在线编程(ICP把整个程序都更新掉) 1 系统的Bootloader写死了,只能用串口下载到指定的位置,启动方式也不方便需要配置BOOT引脚触发启动  4 IAP(自己写的Bootloader,实现程序升级) 1 比如蓝牙转串口,

zeroclipboard 粘贴板的应用示例, 兼容 Chrome、IE等多浏览器

zeroclipboard单个复制按钮和多个复制按钮的实现方法 最近网站改版想让复制代码功能在多个浏览器上都可以实现,最近看网上不少说我们的代码复制功能不好用的,我们最近将会增加代码高亮等功能,希望大家多多支持我们 zeroclipboard是一个跨浏览器的库类 它利用 Flash 进行复制,所以只要浏览器装有 Flash 就可以运行,而且比 IE 的

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操作系统开发介绍 裸机:前后台系

寻迹模块TCRT5000的应用原理和功能实现(基于STM32)

目录 概述 1 认识TCRT5000 1.1 模块介绍 1.2 电气特性 2 系统应用 2.1 系统架构 2.2 STM32Cube创建工程 3 功能实现 3.1 代码实现 3.2 源代码文件 4 功能测试 4.1 检测黑线状态 4.2 未检测黑线状态 概述 本文主要介绍TCRT5000模块的使用原理,包括该模块的硬件实现方式,电路实现原理,还使用STM32类

单片机毕业设计基于单片机的智能门禁系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍程序代码部分参考 设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订

基于SpringBoot的宠物服务系统+uniapp小程序+LW参考示例

系列文章目录 1.基于SSM的洗衣房管理系统+原生微信小程序+LW参考示例 2.基于SpringBoot的宠物摄影网站管理系统+LW参考示例 3.基于SpringBoot+Vue的企业人事管理系统+LW参考示例 4.基于SSM的高校实验室管理系统+LW参考示例 5.基于SpringBoot的二手数码回收系统+原生微信小程序+LW参考示例 6.基于SSM的民宿预订管理系统+LW参考示例 7.基于

Spring Roo 实站( 一 )部署安装 第一个示例程序

转自:http://blog.csdn.net/jun55xiu/article/details/9380213 一:安装 注:可以参与官网spring-roo: static.springsource.org/spring-roo/reference/html/intro.html#intro-exploring-sampleROO_OPTS http://stati