APM32芯得EP.22|APM32F4在RT-Thread系统上添加以太网驱动和使用LwIP网络组件

极海Geehy 2023-08-18 17:51


《APM32芯得》系列内容为用户使用APM32系列产品的经验总结,均转载自21ic论坛极海半导体专区,全文未作任何修改,未经原文作者授权禁止转载。



RT-Thread Studio 是RTT官方的一款集成开发环境,可以很方便的进行RT-Thread实时系统的程序开发,而且对应RT-Thread系统常用的组件可以进行图形化配置,非常的方便。


RT-Thread Studio可以访问官网 RT-Thread Studio 下载地址,在官网下载最新的 RT-Thread Studio 软件安装包。


下面基于 RT-Thread Studio ,把 LwIP 网络协议栈和RT-Thread系统移植到 APM32F4 上运行。


一、创建APM32F4的工程项目


1、首先点击新建RT-Thread项目



2、然后选择下面的配置,如果你的RTT Studio还没有APM32F4的软件包的话,选择添加更多资源,然后找到geehy厂商的软件包,然后安装即可。



上面的一些配置可以看自己板子的实际情况进行选择,比如可以选择其他串口作为控制台,或者选择其他调试模式等等。最后点击完成即可。


二、 编译下载生成的基本工程项目


点击完成之后,就可以在左边的资源管理器看到生成的项目文件了。

生成项目文件之后,我们可以直接点击编译(就是那个锤子的图标),刚刚生成的工程项目文件,我们现在直接编译,一般是不会有任何警告和错误的。

然后,编译完成之后,我们可以把程序下载到我们的板子上运行的。下载程序后,打开串口终端软件,可以看到RT-Thread打印的信息,如下:



其中,程序会不断打印 Hello ... 字符串,这是因为Main函数里面输出的打印,如果觉得占用了控制台可以去main函数把该语句屏蔽。


三、解决shell不能输入字符bug


这时,我们在串口终端发现,shell不能接收字符输入。这是一个bug,原因就是串口的GPIO配置有问题,我们把下面文件函数修改一下即可:



修改完之后,在重新编译下载,shell就可以正常输入字符、命令了,如下:



四、使能网络接口设备和LwIP


双击打开配置文件 RT-Thread Settings , 然后找到组件这里,使能网络接口设备和LwIP堆栈。



其中,我们点击使能之后,里面还有更详细的细节配置可供用户进行配置,比如是否使用DHCP进行动态获取IP地址等,这里我设置为静态IP,因为我没用插路由器。


然后点击保存后,再重新进行编译,可以看到没有任何警告和错误。



这个时候,我们其实可以下载程序运行了的,但是网络功能是还不能正常使用的,因为底层的网络驱动文件还没编写。


下载程序后,在终端输入 ifconfig 命令,可以看到说网络设备有错误,如下:



五、添加RTT的网络驱动文件(重点)


这个驱动文件如果bsp包里面有的话,应该是可以配置加入 RTT Studio 里面的吧,但是APM32并没有这个文件的支持,所以只能我们自己编写这个网络驱动文件了,可以参考下面RTT官方文档的介绍,看看需要我们提供什么样的接口函数。


https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/application-note/components/network/an0010-lwip-driver-porting


这里,我已经提前写好了这个文件,分别是 drv_eth.c 和 drv_eth.h 。我们把这两个文件复制到工程目录的drivers目录下。



该步骤是在APM32在RT-Thread系统上使用网络组件的重点,这两个文件主要功能就是初始化MCU的ETH外设,以及对RT-Thread的网络组件提供对应的接口。


六、然后打开 BSP_USING_ETH 宏定义


我们在 board.h 文件中,打开 BSP_USING_ETH 这个宏定义,以及定义 phy 物理芯片的型号(根据自己板子的芯片类型选择),如下:



定义了 BSP_USING_ETH 和 PHY_USING_DP83848C 宏定义后,就相当于把 drv_eth.c 文件内容开启了。这时全部重新编译,然后可以看到超级多的报错。



这些报错不要被吓到了,其实都是因为缺少文件造成的。


七、添加缺少的文件到工程目录中


我们打开右边的文件资源管理器,找到libraries目录,查看芯片的标准外设驱动库,可以看到并没有 apm32f4xx_eth.c 文件,这应该是 RTT Studio 没有合并进去吧。这个需要我们去geehy的官网下载f4的SDK包,然后把网口外设的标准驱动文件复制到这个目录下(包括头文件)即可。

然后再在drv_common.h文件中,添加下面两句语句(主要就是包含这两个两个所用到的头文件):



然后这时,全部重新编译,然后就可以看到报错已经非常少了。


八、添加 phy_reset 和 ETH_GPIO_Configuration 函数


上面全部重新编译,然后就只有3个报错了,如下:



报错提示说没有phy_reset 和 ETH_GPIO_Configuration 这两个函数,这两个函数实际上时 drv_eth.c 文件要用到的,主要是复位phy芯片和初始化MCU的以太网外设的GPIO口,我们独立出来就是要用户去添加的,这里我已经写好了针对我们板子硬件的函数。


在board.c文件中添加上面两个函数:


1、phy_reset 函数:


/*

 * 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);

}


2、ETH_GPIO_Configuration 函数:


/* 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 -------------------------> PA2

        ETH_MDC --------------------------> PC1

        ETH_MII_RX_CLK/ETH_RMII_REF_CLK---> PA1

        ETH_MII_RX_DV/ETH_RMII_CRS_DV ----> PA7

        ETH_MII_RXD0/ETH_RMII_RXD0 -------> PC4

        ETH_MII_RXD1/ETH_RMII_RXD1 -------> PC5

        ETH_MII_TX_EN/ETH_RMII_TX_EN -----> PG11

        ETH_MII_TXD0/ETH_RMII_TXD0 -------> PG13

        ETH_MII_TXD1/ETH_RMII_TXD1 -------> PG14


        **** Just for MII Mode ****

        ETH_MII_CRS ----------------------> PA0

        ETH_MII_COL ----------------------> PA3

        ETH_MII_TX_CLK -------------------> PC3

        ETH_MII_RX_ER --------------------> PB10

        ETH_MII_RXD2 ---------------------> PB0

        ETH_MII_RXD3 ---------------------> PB1

        ETH_MII_TXD2 ---------------------> PC2

        ETH_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_MODE

    RCM_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

}


当添加完上面的代码之后,再次编译就可以编译通过了,没有任何警告和错误,如下:



这时的代码就相当于把LwIP全部移植成功了,包括底层的网卡驱动。


九、验证网络功能是否正常


下载程序后运行,然后再串口终端输入 ifconfig 命令,可以看到网卡已经正常工作了,而且使用的是静态IP。



我们ping一下电脑主机IP(我的电脑主机IP是:1992.168.1.50),可以看到正常ping通,说明网络功能已经正常了。



十、使用RTT的tcp client和server例程


RTT还有各种软件包,其中tcp client和server例程就属于软件包的一部分,我们可以使能这两个例程,这样就可以在shell命令行下面运行tcp客户端或者服务器例程了。


1、先使能这两个软件包



2、保存配置,然后重新编译下载,可以在shell终端看到多了两个命令:



3、然后可以运行 tcpserv 命令,使得开发板作为服务器。然后可以在电脑端打开网络调试工具,作为客户端去连接开发板,如下:



可以看到开发板接收到了客户端发过来的数据。


十一、总结


以上就是APM32F4系列,在RT-Thread系统上应用LwIP网络功能的详细过程。其实其他APM32带有以太网控制器的MCU,在RT-Thread使用LwIP网络功能也是大同小异的,按照这个过程基本都可以把网络功能应用起来。另外我也把RTT的以太网驱动文件源码上传了,以供大家参考。



注:文章作者在原帖中提供了工程文件,有需要请至原文21ic论坛下载

原文地址:https://bbs.21ic.com/icview-3271456-1-1.html

或点击下方 阅读原文 跳转


   0756 6299999

info@geehy.com

www.geehy.com

广东省珠海市香洲区广湾街83号01栋

极海Geehy 极海半导体是一家致力于开发工业级/车规级MCU、模拟与混合信号IC及系统级芯片的集成电路设计型企业
评论
  • 书接上回:【2022年终总结】阳光总在风雨后,启航2023-面包板社区  https://mbb.eet-china.com/blog/468701-438244.html 总结2019,松山湖有个欧洲小镇-面包板社区  https://mbb.eet-china.com/blog/468701-413397.html        2025年该是总结下2024年的喜怒哀乐,有个好的开始,才能更好的面对2025年即将
    liweicheng 2025-01-24 23:18 65浏览
  • Ubuntu20.04默认情况下为root账号自动登录,本文介绍如何取消root账号自动登录,改为通过输入账号密码登录,使用触觉智能EVB3568鸿蒙开发板演示,搭载瑞芯微RK3568,四核A55处理器,主频2.0Ghz,1T算力NPU;支持OpenHarmony5.0及Linux、Android等操作系统,接口丰富,开发评估快人一步!添加新账号1、使用adduser命令来添加新用户,用户名以industio为例,系统会提示设置密码以及其他信息,您可以根据需要填写或跳过,命令如下:root@id
    Industio_触觉智能 2025-01-17 14:14 161浏览
  • 2024年是很平淡的一年,能保住饭碗就是万幸了,公司业绩不好,跳槽又不敢跳,还有一个原因就是老板对我们这些员工还是很好的,碍于人情也不能在公司困难时去雪上加霜。在工作其间遇到的大问题没有,小问题还是有不少,这里就举一两个来说一下。第一个就是,先看下下面的这个封装,你能猜出它的引脚间距是多少吗?这种排线座比较常规的是0.6mm间距(即排线是0.3mm间距)的,而这个规格也是我们用得最多的,所以我们按惯性思维来看的话,就会认为这个座子就是0.6mm间距的,这样往往就不会去细看规格书了,所以这次的运气
    wuliangu 2025-01-21 00:15 401浏览
  • 临近春节,各方社交及应酬也变得多起来了,甚至一月份就排满了各式约见。有的是关系好的专业朋友的周末“恳谈会”,基本是关于2025年经济预判的话题,以及如何稳定工作等话题;但更多的预约是来自几个客户老板及副总裁们的见面,他们为今年的经济预判与企业发展焦虑而来。在聊天过程中,我发现今年的聊天有个很有意思的“点”,挺多人尤其关心我到底是怎么成长成现在的多领域风格的,还能掌握一些经济趋势的分析能力,到底学过哪些专业、在企业管过哪些具体事情?单单就这个一个月内,我就重复了数次“为什么”,再辅以我上次写的:《
    牛言喵语 2025-01-22 17:10 217浏览
  •  光伏及击穿,都可视之为 复合的逆过程,但是,复合、光伏与击穿,不单是进程的方向相反,偏置状态也不一样,复合的工况,是正偏,光伏是零偏,击穿与漂移则是反偏,光伏的能源是外来的,而击穿消耗的是结区自身和电源的能量,漂移的载流子是 客席载流子,须借外延层才能引入,客席载流子 不受反偏PN结的空乏区阻碍,能漂不能漂,只取决于反偏PN结是否处于外延层的「射程」范围,而穿通的成因,则是因耗尽层的过度扩张,致使跟 端子、外延层或其他空乏区 碰触,当耗尽层融通,耐压 (反向阻断能力) 即告彻底丧失,
    MrCU204 2025-01-17 11:30 220浏览
  • 飞凌嵌入式基于瑞芯微RK3562系列处理器打造的FET3562J-C全国产核心板,是一款专为工业自动化及消费类电子设备设计的产品,凭借其强大的功能和灵活性,自上市以来得到了各行业客户的广泛关注。本文将详细介绍如何启动并测试RK3562J处理器的MCU,通过实际操作步骤,帮助各位工程师朋友更好地了解这款芯片。1、RK3562J处理器概述RK3562J处理器采用了4*Cortex-A53@1.8GHz+Cortex-M0@200MHz架构。其中,4个Cortex-A53核心作为主要核心,负责处理复杂
    飞凌嵌入式 2025-01-24 11:21 103浏览
  •     IPC-2581是基于ODB++标准、结合PCB行业特点而指定的PCB加工文件规范。    IPC-2581旨在替代CAM350格式,成为PCB加工行业的新的工业规范。    有一些免费软件,可以查看(不可修改)IPC-2581数据文件。这些软件典型用途是工艺校核。    1. Vu2581        出品:Downstream     
    电子知识打边炉 2025-01-22 11:12 167浏览
  •  万万没想到!科幻电影中的人形机器人,正在一步步走进我们人类的日常生活中来了。1月17日,乐聚将第100台全尺寸人形机器人交付北汽越野车,再次吹响了人形机器人疯狂进厂打工的号角。无独有尔,银河通用机器人作为一家成立不到两年时间的创业公司,在短短一年多时间内推出革命性的第一代产品Galbot G1,这是一款轮式、双臂、身体可折叠的人形机器人,得到了美团战投、经纬创投、IDG资本等众多投资方的认可。作为一家成立仅仅只有两年多时间的企业,智元机器人也把机器人从梦想带进了现实。2024年8月1
    刘旷 2025-01-21 11:15 755浏览
  • 嘿,咱来聊聊RISC-V MCU技术哈。 这RISC-V MCU技术呢,简单来说就是基于一个叫RISC-V的指令集架构做出的微控制器技术。RISC-V这个啊,2010年的时候,是加州大学伯克利分校的研究团队弄出来的,目的就是想搞个新的、开放的指令集架构,能跟上现代计算的需要。到了2015年,专门成立了个RISC-V基金会,让这个架构更标准,也更好地推广开了。这几年啊,这个RISC-V的生态系统发展得可快了,好多公司和机构都加入了RISC-V International,还推出了不少RISC-V
    丙丁先生 2025-01-21 12:10 883浏览
  • 故障现象 一辆2007款日产天籁车,搭载VQ23发动机(气缸编号如图1所示,点火顺序为1-2-3-4-5-6),累计行驶里程约为21万km。车主反映,该车起步加速时偶尔抖动,且行驶中加速无力。 图1 VQ23发动机的气缸编号 故障诊断接车后试车,发动机怠速运转平稳,但只要换挡起步,稍微踩下一点加速踏板,就能感觉到车身明显抖动。用故障检测仪检测,发动机控制模块(ECM)无故障代码存储,且无失火数据流。用虹科Pico汽车示波器测量气缸1点火信号(COP点火信号)和曲轴位置传感器信
    虹科Pico汽车示波器 2025-01-23 10:46 100浏览
  • 现在为止,我们已经完成了Purple Pi OH主板的串口调试和部分配件的连接,接下来,让我们趁热打铁,完成剩余配件的连接!注:配件连接前请断开主板所有供电,避免敏感电路损坏!1.1 耳机接口主板有一路OTMP 标准四节耳机座J6,具备进行音频输出及录音功能,接入耳机后声音将优先从耳机输出,如下图所示:1.21.2 相机接口MIPI CSI 接口如上图所示,支持OV5648 和OV8858 摄像头模组。接入摄像头模组后,使用系统相机软件打开相机拍照和录像,如下图所示:1.3 以太网接口主板有一路
    Industio_触觉智能 2025-01-20 11:04 207浏览
  • 本文介绍瑞芯微开发板/主板Android配置APK默认开启性能模式方法,开启性能模式后,APK的CPU使用优先级会有所提高。触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。源码修改修改源码根目录下文件device/rockchip/rk3562/package_performance.xml并添加以下内容,注意"+"号为添加内容,"com.tencent.mm"为AP
    Industio_触觉智能 2025-01-17 14:09 218浏览
  • 日前,商务部等部门办公厅印发《手机、平板、智能手表(手环)购新补贴实施方案》明确,个人消费者购买手机、平板、智能手表(手环)3类数码产品(单件销售价格不超过6000元),可享受购新补贴。每人每类可补贴1件,每件补贴比例为减去生产、流通环节及移动运营商所有优惠后最终销售价格的15%,每件最高不超过500元。目前,京东已经做好了承接手机、平板等数码产品国补优惠的落地准备工作,未来随着各省市关于手机、平板等品类的国补开启,京东将第一时间率先上线,满足消费者的换新升级需求。为保障国补的真实有效发放,基于
    华尔街科技眼 2025-01-17 10:44 254浏览
  • 数字隔离芯片是一种实现电气隔离功能的集成电路,在工业自动化、汽车电子、光伏储能与电力通信等领域的电气系统中发挥着至关重要的作用。其不仅可令高、低压系统之间相互独立,提高低压系统的抗干扰能力,同时还可确保高、低压系统之间的安全交互,使系统稳定工作,并避免操作者遭受来自高压系统的电击伤害。典型数字隔离芯片的简化原理图值得一提的是,数字隔离芯片历经多年发展,其应用范围已十分广泛,凡涉及到在高、低压系统之间进行信号传输的场景中基本都需要应用到此种芯片。那么,电气工程师在进行电路设计时到底该如何评估选择一
    华普微HOPERF 2025-01-20 16:50 139浏览
  • 高速先生成员--黄刚这不马上就要过年了嘛,高速先生就不打算给大家上难度了,整一篇简单但很实用的文章给大伙瞧瞧好了。相信这个标题一出来,尤其对于PCB设计工程师来说,心就立马凉了半截。他们辛辛苦苦进行PCB的过孔设计,高速先生居然说设计多大的过孔他们不关心!另外估计这时候就跳出很多“挑刺”的粉丝了哈,因为翻看很多以往的文章,高速先生都表达了过孔孔径对高速性能的影响是很大的哦!咋滴,今天居然说孔径不关心了?别,别急哈,听高速先生在这篇文章中娓娓道来。首先还是要对各位设计工程师的设计表示肯定,毕竟像我
    一博科技 2025-01-21 16:17 173浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦