实现ping
cubemx 版本 6.5.0
stm32芯片:stm32f407vgt6
DP83848 采用RMII模式
cubemx 按照例程配置
1号坑
由于买的板子,DP83848 的时钟频率需要stm32输出,因此需要将stm32时钟限制在150M。对于项目而言,需要支持4.8M的uart,150M时钟不能满足。目前来说,主要是测通stm32的UDP,这个坑后面再填。
2号坑
cubemx生成项目,烧录,发现板子不能跑。
单步调试,发现程序在MX_LWIP_Init() -> lwip_init() -> mem_init() -> mem->next =MEM_SIZE_ALIGNED,时发生崩溃
查看MEM_SIZE_ALIGNED,发现mem.c 的377 行左右有定义
#ifndef LWIP_RAM_HEAP_POINTER
/** the heap. we need one struct mem at the end and some room for alignment */
LWIP_DECLARE_MEMORY_ALIGNED(ram_heap, MEM_SIZE_ALIGNED + (2U * SIZEOF_STRUCT_MEM));
#define LWIP_RAM_HEAP_POINTER ram_heap
#endif /* LWIP_RAM_HEAP_POINTER */
找到LWIP_RAM_HEAP_POINTER在lwipopts.h中有定义
/*----- Default Value for H7 devices: 0x30044000 -----*/
//#define LWIP_RAM_HEAP_POINTER 0x30044000
/*----- Value supported for H7 devices: 1 -----*/
//#define LWIP_SUPPORT_CUSTOM_PBUF 1
此处应该时H7和F4的芯片地址不一样导致的,注释掉发现程序可以正常运行
3号坑
不能ping通现象1
程序可以跑通,但是不能ping通,在路由器上可以看到设备的ip和mac,但是不能ping通,尝试很多方法仍然不行,偶然看到一篇博客:
博客链接: STM32CUBEMX 6.5 LWIP 内存失败PING失败
根据st官方论坛的说法,在lwipopts.h结尾加上
/* USER CODE BEGIN 1 */
#define CHECKSUM_GEN_ICMP 0
#define CHECKSUM_CHECK_ICMP 0
#undef LWIP_SUPPORT_CUSTOM_PBUF
#undef LWIP_RAM_HEAP_POINTER
/* USER CODE END 1 */
问题链接:F4 + FreeRTOS + LwIP. Bad default LWIP_RAM_HEAP_POINTER after updating to v1.9.0.
可以正常ping通。
其他不能ping通的原因
- cubemx 生成ETH 引脚有时会出现问题
- cubemx LWIP - key options 配置RAM heap pointer 有问题(同上屏蔽H7设置)
对于F407芯片,可以将0x30044000改成0x2000E378,参考: STM32CubeIDE1.9.0\STM32CubeMX 6.5 F429IGT6加LAN8720A,配置ETH+LWIP
4号坑
UDP 通讯 在使用udp_sendto的时候,需要给struct pbuf中的配置项赋值,默认为0时可能会引起发送不正常。
udp_send_pf->type_internal = 65;
udp_send_pf->flags = 2;
udp_send_pf->ref = 1;
udp_send_pf->if_idx = 1;
5号坑
STM32 内存问题导致程序运行不正常,比如串口接发、网络接发,程序崩溃等