少扯皮,多做事
想看配置的参考:STM32H743/750+Cube+DP83848(一)
下载文件,ST官网搜LWIP,好像都一样,没仔细观察,下载的F407的Lwip也可以用
ST下载LWIP
- 下面把你准备的tcp_echoserver.h和tcp_echoserver.c文件放到你想放到位置,既然测试建议放在Core下的Inc和Src,免得头文件路径不对,又折腾
- 配置CORTEX_M7时可以配置MPU,但是配置完的MPU好像不行
/* USER CODE BEGIN 0 */
static void MPU_Config(void)
{MPU_Region_InitTypeDef MPU_InitStruct;/* Disable the MPU */HAL_MPU_Disable();/* Configure the MPU attributes as Device not cacheablefor ETH DMA descriptors */MPU_InitStruct.Enable = MPU_REGION_ENABLE;MPU_InitStruct.BaseAddress = 0x30040000;MPU_InitStruct.Size = MPU_REGION_SIZE_256B;MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;MPU_InitStruct.Number = MPU_REGION_NUMBER0;MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;MPU_InitStruct.SubRegionDisable = 0x00;MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;HAL_MPU_ConfigRegion(&MPU_InitStruct);/* Configure the MPU attributes as Cacheable write throughfor LwIP RAM heap which contains the Tx buffers */MPU_InitStruct.Enable = MPU_REGION_ENABLE;MPU_InitStruct.BaseAddress = 0x30044000;MPU_InitStruct.Size = MPU_REGION_SIZE_16KB;MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;MPU_InitStruct.Number = MPU_REGION_NUMBER1;MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;MPU_InitStruct.SubRegionDisable = 0x00;MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;HAL_MPU_ConfigRegion(&MPU_InitStruct);/* Enable the MPU */HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
}
/* USER CODE END 0 */
- 然后Main里面添加3个函数
__HAL_RCC_D2SRAM3_CLK_ENABLE();
tcp_echoserver_init();
MX_LWIP_Process();(有人说不加ping不通,懒得试了)
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* Enable D-Cache---------------------------------------------------------*/SCB_EnableDCache();/* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init */__HAL_RCC_D2SRAM3_CLK_ENABLE();/* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_LWIP_Init();/* USER CODE BEGIN 2 */tcp_echoserver_init();/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE */MX_LWIP_Process();/* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}
至此,重点来了,上面说到和别人都是一样的,下面就是遇到的坑了,以下仅供参考,个人能力薄弱
1.在ethernetif.c里low_level_init()函数下面竟然用法和别人的不一样, 他是直接调用ethernet_link_check_state(netif);把它给换掉
HAL_StatusTypeDef hal_eth_init_status = HAL_OK;uint32_t idx = 0;ETH_MACConfigTypeDef MACConf;int32_t PHYLinkState;uint32_t duplex, speed = 0;/* Start ETH HAL Init */uint8_t MACAddr[6] ;heth.Instance = ETH;MACAddr[0] = 0x00;MACAddr[1] = 0x80;MACAddr[2] = 0xE1;MACAddr[3] = 0x00;MACAddr[4] = 0x00;MACAddr[5] = 0x00;heth.Init.MACAddr = &MACAddr[0];heth.Init.MediaInterface = HAL_ETH_RMII_MODE;heth.Init.TxDesc = DMATxDscrTab;heth.Init.RxDesc = DMARxDscrTab;heth.Init.RxBuffLen = 1524;/* USER CODE BEGIN MACADDRESS *//* USER CODE END MACADDRESS */hal_eth_init_status = HAL_ETH_Init(&heth);memset(&TxConfig, 0 , sizeof(ETH_TxPacketConfig));TxConfig.Attributes = ETH_TX_PACKETS_FEATURES_CSUM | ETH_TX_PACKETS_FEATURES_CRCPAD;TxConfig.ChecksumCtrl = ETH_CHECKSUM_IPHDR_PAYLOAD_INSERT_PHDR_CALC;TxConfig.CRCPadCtrl = ETH_CRC_PAD_INSERT;/* End ETH HAL Init *//* Initialize the RX POOL */LWIP_MEMPOOL_INIT(RX_POOL);#if LWIP_ARP || LWIP_ETHERNET/* set MAC hardware address length */netif->hwaddr_len = ETH_HWADDR_LEN;/* set MAC hardware address */netif->hwaddr[0] = heth.Init.MACAddr[0];netif->hwaddr[1] = heth.Init.MACAddr[1];netif->hwaddr[2] = heth.Init.MACAddr[2];netif->hwaddr[3] = heth.Init.MACAddr[3];netif->hwaddr[4] = heth.Init.MACAddr[4];netif->hwaddr[5] = heth.Init.MACAddr[5];/* maximum transfer unit */netif->mtu = ETH_MAX_PAYLOAD;/* Accept broadcast address and ARP traffic *//* don't set NETIF_FLAG_ETHARP if this device is not an ethernet one */#if LWIP_ARPnetif->flags |= NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP;#elsenetif->flags |= NETIF_FLAG_BROADCAST;#endif /* LWIP_ARP */for(idx = 0; idx < ETH_RX_DESC_CNT; idx ++){HAL_ETH_DescAssignMemory(&heth, idx, Rx_Buff[idx], NULL);}/* USER CODE BEGIN PHY_PRE_CONFIG *//* USER CODE END PHY_PRE_CONFIG *//* Set PHY IO functions */LAN8742_RegisterBusIO(&LAN8742, &LAN8742_IOCtx);/* Initialize the LAN8742 ETH PHY */LAN8742_Init(&LAN8742);
/**将原来的ethernet_link_check_state(netif)替换掉***/if (hal_eth_init_status == HAL_OK){/* Get link state */PHYLinkState = LAN8742_GetLinkState(&LAN8742);/* Get link state */if(PHYLinkState <= LAN8742_STATUS_LINK_DOWN){netif_set_link_down(netif);netif_set_down(netif);}else{switch (PHYLinkState){case LAN8742_STATUS_100MBITS_FULLDUPLEX:duplex = ETH_FULLDUPLEX_MODE;speed = ETH_SPEED_100M;break;case LAN8742_STATUS_100MBITS_HALFDUPLEX:duplex = ETH_HALFDUPLEX_MODE;speed = ETH_SPEED_100M;break;case LAN8742_STATUS_10MBITS_FULLDUPLEX:duplex = ETH_FULLDUPLEX_MODE;speed = ETH_SPEED_10M;break;case LAN8742_STATUS_10MBITS_HALFDUPLEX:duplex = ETH_HALFDUPLEX_MODE;speed = ETH_SPEED_10M;break;default:duplex = ETH_FULLDUPLEX_MODE;speed = ETH_SPEED_100M;break;}/* Get MAC Config MAC */HAL_ETH_GetMACConfig(&heth, &MACConf);MACConf.DuplexMode = duplex;MACConf.Speed = speed;HAL_ETH_SetMACConfig(&heth, &MACConf);HAL_ETH_Start_IT(&heth);netif_set_up(netif);netif_set_link_up(netif);
/* USER CODE BEGIN PHY_POST_CONFIG */LAN8742.IO.ReadReg(LAN8742.DevAddr, LAN8742_TCSR, &idx);LAN8742.IO.WriteReg(LAN8742.DevAddr, LAN8742_TCSR, idx & 0XFFFFFFDF);//设置PHYCR(0x19)寄存器bit5的值 设置LED_LINK为模式2
/* USER CODE END PHY_POST_CONFIG */}}else{Error_Handler();}
#endif /* LWIP_ARP || LWIP_ETHERNET */
- 再把low_level_input()中的接收函数改掉
static struct pbuf * low_level_input(struct netif *netif)
{struct pbuf *p = NULL;ETH_BufferTypeDef RxBuff[ETH_RX_DESC_CNT];uint32_t framelength = 0, i = 0;struct pbuf_custom* custom_pbuf;memset(RxBuff, 0 , ETH_RX_DESC_CNT*sizeof(ETH_BufferTypeDef));for(i = 0; i < ETH_RX_DESC_CNT -1; i++){RxBuff[i].next=&RxBuff[i+1];}SCB_CleanInvalidateDCache();if (HAL_ETH_GetRxDataBuffer(&heth, RxBuff) == HAL_OK){HAL_ETH_GetRxDataLength(&heth, &framelength);/* Build Rx descriptor to be ready for next data reception */HAL_ETH_BuildRxDescriptors(&heth);#if !defined(DUAL_CORE) || defined(CORE_CM7)/* Invalidate data cache for ETH Rx Buffers */SCB_InvalidateDCache_by_Addr((uint32_t *)RxBuff->buffer, framelength);
#endifcustom_pbuf = (struct pbuf_custom*)LWIP_MEMPOOL_ALLOC(RX_POOL);if(custom_pbuf != NULL){custom_pbuf->custom_free_function = pbuf_free_custom;p = pbuf_alloced_custom(PBUF_RAW, framelength, PBUF_REF, custom_pbuf, RxBuff->buffer, framelength);}}return p;
}
- 这里也很重要,需要修改LWIP的寄存器地址(我重新建立工程竟然又把这个给弄忘记了,哈哈)
._user_heap_stack :{. = ALIGN(8);PROVIDE ( end = . );PROVIDE ( _end = . );. = . + _Min_Heap_Size;. = . + _Min_Stack_Size;. = ALIGN(8);} >RAM_D1.lwip_sec (NOLOAD) : {. = ABSOLUTE(0x30040000);*(.RxDecripSection) . = ABSOLUTE(0x30040060);*(.TxDecripSection). = ABSOLUTE(0x30040200);*(.RxArraySection) } >RAM_D2 AT> FLASH
附加一个,MDK需要修改内存地址
以上就是个人见解,欢迎您的批评指正