STM32 使用8720 通过LWIP发送数据

一、硬件IOC

在这里插入图片描述
在这里插入图片描述

1、GPIO
在这里插入图片描述

2、NVIC
在这里插入图片描述

3、SYS
在这里插入图片描述

4、RCC
在这里插入图片描述

5、ETH
在这里插入图片描述

6、USART
在这里插入图片描述
在这里插入图片描述

7、LWIP
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

二、软件函数

1、Main

/* USER CODE BEGIN Includes */
#include "ytcesys.h"
/* USER CODE END Includes */

/* USER CODE BEGIN 2 */
ethreset();
MX_LWIP_Init();
OPEN_USART1();
printf("system start");
/* USER CODE END 2 */

/* USER CODE BEGIN WHILE */
while (1)
{
MX_LWIP_Process(); //LWIP 轮询任务
/* USER CODE END WHILE */

2、Ytcesys

#include "ytcesys.h"

//////////////////////////////////////////////////////////////
//STM32cubeMX V5.6.0
//固件库:STM32Cube FW_H7 V1.7.0
//C语言编译环境:MDK5 IDE-Version: uVision V5.20.0.0
//实验名称:YT07 H743 GPIO
//开发者:原 野 数码 电 子
//技术支持: www .ytce. co m
//////////////////////////////////////////////////////////////


//延时1微妙
void HAL_Delay_us(uint32_t nus)
{
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000000);
HAL_Delay(nus);
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
}


//LAN8720A 复位
void ethreset(void)
{
HAL_GPIO_WritePin(ETH_RESET_GPIO_Port,ETH_RESET_Pin,GPIO_PIN_RESET); //复位
HAL_Delay(100); 

HAL_GPIO_WritePin(ETH_RESET_GPIO_Port,ETH_RESET_Pin,GPIO_PIN_SET); //恢复
HAL_Delay(10); 
}

//串口1
// 重定向函数,有这个函数就可以直接使用 printf()函数
int fputc(int ch,FILE *f)
{
uint8_t temp[1]={ch};
HAL_UART_Transmit(&huart1,temp,1,2); //
return 1;
}

uint16_t Uart1_Rx_Cnt = 0; //接收数据的实际长度
uint8_t aRxBuffer; //接收的一个字节
uint8_t Uart1_RxBuff[1000]; //接收的数据

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) //回调函数
{

uint8_t data[20]={"received data is:"};
UNUSED(huart);
if((Uart1_RxBuff[Uart1_Rx_Cnt-1] == 0x0A)&&(Uart1_RxBuff[Uart1_Rx_Cnt-2] == 0x0D)) //判断结束
{
HAL_UART_Transmit(&huart1, data, 20, 100);
HAL_Delay(10);
HAL_UART_Transmit(&huart1, (uint8_t *)&Uart1_RxBuff, Uart1_Rx_Cnt,100); //将接收的数据发送出去,操作修改这里
Uart1_Rx_Cnt = 0;
//memset(Uart1_RxBuff,0x00,sizeof(Uart1_RxBuff)); //清空数组
}
HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1); //再次开启接收中断
}

void OPEN_USART1(void) //打开USART1需要运行2个函数
{
__HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);//开启串口中断
HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1); //开启接收中断
}

3、ytcesys.h


#ifndef __YTCESYS_H
#define __YTCESYS_H
#include "stm32F4xx_hal.h"
//#include "i2c.h"
#include "gpio.h"
#include "usart.h"
#include "stdio.h"
//////////////////////////////////////////////////////////////
//STM32cubeMX V5.6.0
//固件库:STM32Cube FW_H7 V1.7.0
//C语言编译环境:MDK5 IDE-Version: uVision V5.20.0.0
//实验名称:YT07 H743 GPIO
//开发者:原 野 数码电 子
//技术支持: www .ytce. co m
//////////////////////////////////////////////////////////////


#define u8 uint8_t
#define u16 uint16_t

extern void HAL_Delay_us(uint32_t nus);
extern void ethreset(void);


//串口1
extern uint16_t Uart1_Rx_Cnt; //接收数据的实际长度
extern uint8_t aRxBuffer; //接收的一个字节
extern uint8_t Uart1_RxBuff[1000]; //接收的数据
void OPEN_USART1(void); //打开USART1需要运行2个函数

#endif


### STM32 使用 RT-Thread 和 LwIP 协议栈发送数据失败解决方案 #### 一、检查硬件连接与初始化设置 确保 LAN8720 物理层芯片与 STM32 的连接正常,特别是 MDI 接口的连线无误。使用 CubeMX 配置 ETH 外设时需仔细核对参数,包括 PHY 地址等配置项[^4]。 #### 二、验证 IP 地址及网络配置 确认设备已成功获取有效的 IP 地址,并能与其他主机通信。可通过 `ifconfig` 命令查看当前接口状态并测试连通性: ```bash ifconfig eth0 ping www.example.com ``` 如果发现无法获得正确 IP 或者 ping 不通外部服务器,则可能是 DHCP 客户端未启动或静态 IP 设置有误[^5]。 #### 三、排查驱动程序实现细节 对于基于 HAL 库开发的应用来说,重点在于 `HAL_ETH_Init()` 函数及其回调处理逻辑是否存在问题。建议按照官方文档中的指导逐步调试,比如增加日志输出来跟踪事件流程,确保每一步都按预期执行。 另外,在调用 `netconn_write()` 后应立即检查返回值以判断写入操作是否顺利完成。若遇到错误码提示资源不足等情况,可能是因为缓冲区溢出或是内存分配失败引起的数据包丢失现象[^1]。 #### 四、优化传输策略 当面临大量并发请求时,适当调整 socket 缓冲大小以及超时重传机制有助于提高系统的稳定性和效率。可以通过修改 lwipopts.h 文件内的宏定义来进行相应设定[^3]。 例如增大接收/发送窗口尺寸: ```c #define LWIP_TCP_SND_BUF (8 * 1024) #define LWIP_TCP_WND (8 * 1024) ``` #### 五、分析抓包记录辅助诊断 借助 Wireshark 等工具捕获实际通讯过程中的报文序列,对比标准帧格式查找异常之处。这不仅能够直观反映链路质量的好坏,还能帮助定位具体哪个环节出现了阻塞或丢弃的情况[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值