lwIP+FreeRTOS+stm32f407

目录

tcp echo server 应用代码验证通过

问题

DMABMR->SR 始终为 1,无法自动复位

问题描述:

解决方法:

扩展:LAN8720A 和 LAN8742 这两种PHY芯片驱动可以通用吗?

官方例程注意事项


问题0:进入硬中断

平台环境:lwip2.1.2 + freertos10.3.x + stm32f407 + cubemx + tepecho server

问题描述:根据CubeMX的lwipopts.h的默认配置参数运行,必须等待系统系统运行后,才能插入RJ45水晶头,否则在系统启动前就插入水晶头,系统进入HardFault,且系统及其不稳定。必须把lwipopts参数配置的超级大,几乎快把stm32f407ve的RAM耗尽,120多字节的RAM占用,才能带着RJ45插入的前提下正常启动。调整后,可以做到90多k.

解决方案:增加两项配置参数,对lwip core的内存堆和内存池进行溢出检测,即增加:

#define MEMP_OVERFLOW_CHECK             1
#define MEM_OVERFLOW_CHECK               1

结果:测试 系统 OK 稳定,可以带着RJ45插入,重启,正常运行。

原因分析:未知,还不知道为什么会这样。头疼。

配置前的参数:

ETH_RX_BUFFER_CNT 必须大于42 否则死机HardFault

MEMP_NUM_UDP_PCB (Number of UDP Connections) 40

MEMP_NUM_TCP_PCB (Number of TCP Connections) 50

TCP_SND_QUEUELEN (Number of Packet Buffers Allowed for TCP Sender) 100

配置后的参数:

重大更新:

2024年11月10日17:10:52

原因找到了,直接扩大 defaultTask的栈区空间,就可以保证lwip协议栈的顺利初始化。不会再进入硬中断!所以,原因就是 初始化lwip协议栈所在的任务defaultTask任务的栈区空间被耗尽,导致无法顺利完成lwip且进入硬中断。

也不需要给lwipopts.h中的关键参数分配设计较大的空间。

tcp echo server 应用代码验证通过

实验平台:CubeMX v6.12.0 stm32f407vet6 FreeRTOS v10.3.1 / CMSIS V2.00/ lwIP v2.1.2/ PHY  LAN8720A

如果不知道怎么设置网络IP、掩码、网关。那么必须先补一下相关知识。否则没办法进行。。。

 CubeMX 自带的 PHY驱动 LAN8742A 完全适用于 LAN8720A ,无需改动。

问题1:DMABMR->SR 始终为 1,无法自动复位

问题描述:

使用cubemx自动生成初始化代码,原始代码未作任何修改的情况下,代码卡在:

DMABMR->SR 在被置位后,无法自动复位。DMABMR->SR 寄存器的值始终是 1。

导致 return HAL_ERROR;进入死循环。

解决方法:

1. 检查 MAC 的时钟是否配置正常:三个时钟:

在 HAL_ETH_MspInit 函数中需要执行语句: __HAL_RCC_ETH_CLK_ENABLE();

这个是 cubemx 生成的,是没问题的。

2. 检查 PHY 模块(比如LAN8720A)是否正常与stm32f4074按照RMII正确的物理连接,且IO引脚被正确配置。

这不是知道是哪个版本的代码,我使用的没有这句注释,所以保证PHY或其IO的正确配置。

3. 模糊场景:一直在向错误的寄存器中写入数据

4.模糊场景:缺失一些引脚复用功能的配置操作。

STM32F207 DMSBMR->SR always TRUE - STMicroelectronics Community

我的原因是,没有接线(接PHY),只要没有正确接线,stm32f407 以太网MAC控制器的 DMABMR->SR 无法自动复位,下图是我接线以后的调试现场

STM32结合lwIPFreeRTOS可构建高效、实时的网络通信解决方案。 ### lwIP相关内容 在STM32的网络开发中,网络通信由LwIP(传输层、网络层) + 片内eth外设(链路层) + phy芯片(物理层)组成。由于单片机资源紧凑,采用lwIP协议栈,它是一种阉割版的tcp/ip协议实现。其中,CubeMX提供了lwIP的实现和部分eth外设(如LAN8742及其家族)的驱动库 [^3]。 ### FreeRTOS相关内容 FreeRTOS是一个源代码开放的RTOS,设计简洁且功能强大,能够运行在非常有限的硬件资源上,适用于包括ARM、AVR、MSP430等架构的微控制器。其特性包括可配置性(通过宏定义控制功能的启用或禁用,以适应不同应用场景)、可移植性(源代码用C语言编写,便于移植到不同硬件平台)、模块化(核心功能模块易于扩展和维护,便于开发者定制)、实时性(提供先进先出、轮转调度等调度策略)以及内存高效(内存使用量小,对RAM和ROM的占用都很少) [^2]。 ### 使用与配置 #### lwIP配置 在STM32开发中,可借助CubeMX工具进行lwIP的配置。CubeMX提供了lwIP的实现和部分eth外设的驱动库,开发人员可通过该工具进行图形化配置,生成相应的代码框架 [^3]。 #### FreeRTOS配置 可通过宏定义来控制FreeRTOS功能的启用或禁用,以适应不同的应用场景。其源代码用C语言编写,便于移植到STM32平台,核心功能模块易于扩展和维护 [^2]。 ### 应用案例 结合STM32的性能优势,开发者可将STM32FreeRTOSlwIP等软件框架结合,创建功能强大的嵌入式系统,满足日益增长的智能设备需求,构建高效、实时的网络通信解决方案 [^1]。 ### 代码示例 以下是一个简单的伪代码示例,展示在STM32中使用FreeRTOS创建任务并结合lwIP进行网络通信的基本框架: ```c #include "FreeRTOS.h" #include "task.h" #include "lwip/api.h" // 定义任务函数 void vTaskFunction( void *pvParameters ) { // lwIP网络通信相关操作 struct netconn *conn; conn = netconn_new(NETCONN_TCP); if (conn != NULL) { // 进行网络连接等操作 } for( ;; ) { // 任务循环 } vTaskDelete( NULL ); } int main( void ) { // 硬件初始化等操作 // 创建任务 xTaskCreate( vTaskFunction, "Task", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+1, NULL ); // 启动调度器 vTaskStartScheduler(); for( ;; ); } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值