初始化流程
low_level_init();函数初始化网卡 -》HAL_ETH_Init(); //设定mac等信息 -》创建接收数据信号量 -》创建数据输入任务函数 HAL_ETH_Start_IT(); -> ETH_UpdateDescriptor(); ->void HAL_ETH_RxAllocateCallback();分配描述符缓存空间DMA收到数据包 -》数据包写入到接收描述符缓冲区 ->HAL_ETH_RxLinkCallback();组装pbuf链 -》ETH_IRQHandler → HAL_ETH_IRQHandler 触发中断 -》调用中断回调函数HAL_ETH_RxCpltCallback() ->释放接收数据包信号量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地址。
由编译器指定位置
__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文件