[APM32F4] APM32F427在RT-Thread系统上如何使用LwIP网络功能实现网络通信
1. 工具和RT-Thread源码的准备
1.1 ENV工具的安装和使用
https://www.rt-thread.org/document/site/#/development-tools/env/env
https://www.rt-thread.org/download.html#download-rt-thread-env-tool
1.2 下载RTT源码
https://www.rt-thread.org/download.html#download-rt-thread-source-code


2. 进入到APM32F407的bsp根目录下编译bsp




scons --target=iarscons --target=mdk4scons --target=mdk5
3. 复制APM32F407的BSP修改为APM32F427的BSP
void SystemInit(void){/* FPU settings */#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); //!< set CP10 and CP11 Full Access#endif/* Reset the RCM clock configuration to the default reset state *//* Set HSIEN bit */RCM->CTRL_B.HSIEN = BIT_SET;/* Reset CFG register */RCM->CFG = 0x00000000;/* Reset HSEEN, CSSEN and PLL1EN bits */RCM->CTRL &= (uint32_t)0xFEF6FFFF;/* Reset PLL1CFG register */RCM->PLL1CFG = 0x24003010;/* Reset HSEBCFG bit */RCM->CTRL &= (uint32_t)0xFFFBFFFF;/* Disable all interrupts */RCM->INT = 0x00000000;#if defined(DATA_IN_ExtSRAM)SystemInit_ExtSRAM();#endif /* DATA_IN_ExtSRAM */SystemClockConfig();/* Configure the Vector Table location add offset address */#ifdef VECT_TAB_SRAMSCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */#elseSCB->VTOR = FMC_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */#endif}
4. 使能 LwIP 与 net dev
4.1 首先使能以太网板级外设驱动

4.2 启用 lwIP 与 net device


5. 编写基于RTT的以太网板级驱动drv_eth.c

5.1 添加编写好的drv_eth.c文件


5.2 打开ETH板级外设驱动,和选择PHY芯片型号
#define BSP_USING_ETH#define PHY_USING_DP83848C // 根据自己使用的phy芯片型号定义
5.3 添加标准外设驱动文件apm32f4xx_eth.c和apm32f4xx_eth.h

5.4 添加包含apm32f4xx_eth.h头文件代码

5.5 添加 phy_reset 和 ETH_GPIO_Configuration 函数

/** phy reset*/void phy_reset(void){/* PHY RESET PIN: PD11 */GPIO_Config_T GPIO_ConfigStruct;GPIO_ConfigStruct.mode = GPIO_MODE_OUT;GPIO_ConfigStruct.speed = GPIO_SPEED_2MHz;GPIO_ConfigStruct.otype = GPIO_OTYPE_PP;GPIO_ConfigStruct.pupd = GPIO_PUPD_NOPULL;RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOD);GPIO_ConfigStruct.pin = GPIO_PIN_11;GPIO_Config(GPIOD, &GPIO_ConfigStruct);GPIO_ResetBit(GPIOD, GPIO_PIN_11);rt_thread_delay(2);GPIO_SetBit(GPIOD, GPIO_PIN_11);rt_thread_delay(2);}
/* MII/RMII Media interface selection *///#define MII_MODE#define RMII_MODE/** GPIO Configuration for ETH*/void ETH_GPIO_Configuration(void){GPIO_Config_T GPIO_ConfigStruct;/* Enable SYSCFG clock */RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_SYSCFG);/* Enable GPIOs clocks */RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOA | RCM_AHB1_PERIPH_GPIOC | RCM_AHB1_PERIPH_GPIOG);/* MII/RMII Media interface selection */#if defined(MII_MODE) /* Mode MII. */SYSCFG_ConfigMediaInterface(SYSCFG_INTERFACE_MII);#elif defined(RMII_MODE) /* Mode RMII. */SYSCFG_ConfigMediaInterface(SYSCFG_INTERFACE_RMII);#endif/*********************** Ethernet pins configuration ***************************//*ETH_MDIO -------------------------> PA2ETH_MDC --------------------------> PC1ETH_MII_RX_CLK/ETH_RMII_REF_CLK---> PA1ETH_MII_RX_DV/ETH_RMII_CRS_DV ----> PA7ETH_MII_RXD0/ETH_RMII_RXD0 -------> PC4ETH_MII_RXD1/ETH_RMII_RXD1 -------> PC5ETH_MII_TX_EN/ETH_RMII_TX_EN -----> PG11ETH_MII_TXD0/ETH_RMII_TXD0 -------> PG13ETH_MII_TXD1/ETH_RMII_TXD1 -------> PG14**** Just for MII Mode ****ETH_MII_CRS ----------------------> PA0ETH_MII_COL ----------------------> PA3ETH_MII_TX_CLK -------------------> PC3ETH_MII_RX_ER --------------------> PB10ETH_MII_RXD2 ---------------------> PB0ETH_MII_RXD3 ---------------------> PB1ETH_MII_TXD2 ---------------------> PC2ETH_MII_TXD3 ---------------------> PB8*//* Configure PC1, PC4 and PC5 */GPIO_ConfigStruct.pin = GPIO_PIN_1 | GPIO_PIN_4 | GPIO_PIN_5;GPIO_ConfigStruct.speed = GPIO_SPEED_100MHz;GPIO_ConfigStruct.mode = GPIO_MODE_AF;GPIO_ConfigStruct.otype = GPIO_OTYPE_PP;GPIO_ConfigStruct.pupd = GPIO_PUPD_NOPULL;GPIO_Config(GPIOC, &GPIO_ConfigStruct);GPIO_ConfigPinAF(GPIOC, GPIO_PIN_SOURCE_1, GPIO_AF_ETH);GPIO_ConfigPinAF(GPIOC, GPIO_PIN_SOURCE_4, GPIO_AF_ETH);GPIO_ConfigPinAF(GPIOC, GPIO_PIN_SOURCE_5, GPIO_AF_ETH);/* Configure PG11, PG13 and PG14 */GPIO_ConfigStruct.pin = GPIO_PIN_11 | GPIO_PIN_13 | GPIO_PIN_14;GPIO_Config(GPIOG, &GPIO_ConfigStruct);GPIO_ConfigPinAF(GPIOG, GPIO_PIN_SOURCE_11, GPIO_AF_ETH);GPIO_ConfigPinAF(GPIOG, GPIO_PIN_SOURCE_13, GPIO_AF_ETH);GPIO_ConfigPinAF(GPIOG, GPIO_PIN_SOURCE_14, GPIO_AF_ETH);/* Configure PA1, PA2 and PA7 */GPIO_ConfigStruct.pin = GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_7;GPIO_Config(GPIOA, &GPIO_ConfigStruct);GPIO_ConfigPinAF(GPIOA, GPIO_PIN_SOURCE_1, GPIO_AF_ETH);GPIO_ConfigPinAF(GPIOA, GPIO_PIN_SOURCE_2, GPIO_AF_ETH);GPIO_ConfigPinAF(GPIOA, GPIO_PIN_SOURCE_7, GPIO_AF_ETH);#ifdef MII_MODERCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOB);/* Configure PC2, PC3 */GPIO_ConfigStruct.pin = GPIO_PIN_2 | GPIO_PIN_3;GPIO_Config(GPIOC, &GPIO_ConfigStruct);GPIO_ConfigPinAF(GPIOC, GPIO_PIN_SOURCE_2, GPIO_AF_ETH);GPIO_ConfigPinAF(GPIOC, GPIO_PIN_SOURCE_3, GPIO_AF_ETH);/* Configure PB0, PB1, PB10 and PB8 */GPIO_ConfigStruct.pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_10 | GPIO_PIN_8;GPIO_Config(GPIOB, &GPIO_ConfigStruct);GPIO_ConfigPinAF(GPIOB, GPIO_PIN_SOURCE_0, GPIO_AF_ETH);GPIO_ConfigPinAF(GPIOB, GPIO_PIN_SOURCE_1, GPIO_AF_ETH);GPIO_ConfigPinAF(GPIOB, GPIO_PIN_SOURCE_10, GPIO_AF_ETH);GPIO_ConfigPinAF(GPIOB, GPIO_PIN_SOURCE_8, GPIO_AF_ETH);/* Configure PA0, PA3 */GPIO_ConfigStruct.pin = GPIO_PIN_0 | GPIO_PIN_3;GPIO_Config(GPIOA, &GPIO_ConfigStruct);GPIO_ConfigPinAF(GPIOA, GPIO_PIN_SOURCE_0, GPIO_AF_ETH);GPIO_ConfigPinAF(GPIOA, GPIO_PIN_SOURCE_3, GPIO_AF_ETH);#endif}

6. 验证网络功能是否正常


7. 使用RTT的tcp client和server例程
7.1 配置menuconfig

7.2 更新软件包

7.3 测试验证
























。
---------------------
作者:luobeihai
链接:https://bbs.21ic.com/icview-3501388-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐
所有评论(0)