初始化流程
cpp
low_level_init();函数初始化网卡
-》HAL_ETH_Init(); //设定mac等信息
-》创建接收数据信号量
-》创建数据输入任务函数
HAL_ETH_Start_IT();
-> ETH_UpdateDescriptor();
->void HAL_ETH_RxAllocateCallback();分配描述符缓存空间
cpp
DMA收到数据包
-》数据包写入到接收描述符缓冲区
->HAL_ETH_RxLinkCallback();组装pbuf链
-》ETH_IRQHandler
→ HAL_ETH_IRQHandler 触发中断
-》调用中断回调函数HAL_ETH_RxCpltCallback()
->释放接收数据包信号量
cpp
ethernetif_input();//任务一直在等待收到数据包的信号量
-》 p = low_level_input( netif );
-》HAL_ETH_ReadData(&heth, (void **)&p);//读取组装好的pbuf数据
-》netif->input( p, netif);//数据交给lwip
->pbuf_free(p);//释放资源
描述符内存位置分配
ETH DMA可访问的内存地址如下图

可正常通信的描述符地址 举例 都在0x30000000之后

需要指定分配的buff地址。
由编译器指定位置
cpp
__attribute__((at(0x30040000))) ETH_DMADescTypeDef DMARxDscrTab[ETH_RX_DESC_CNT]; /* Ethernet Rx DMA Descriptors */
__attribute__((at(0x30040080))) ETH_DMADescTypeDef DMATxDscrTab[ETH_TX_DESC_CNT]; /* Ethernet Tx DMA Descriptors */
魔术棒-》linker-》取消勾选 use memory layout from target dialog
编辑.sct文件