【经验】APM32F4 MCU在RT-Thread系统上添加以太网驱动和使用LwIP网络组件的方法
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网络功能也是大同小异的,按照这个过程基本都可以把网络功能应用起来。
- |
- +1 赞 0
- 收藏
- 评论 0
本文由拾一转载自极海半导体 微信公众号,原文标题为:APM32芯得 EP.22 | APM32F4在RT-Thread系统上添加以太网驱动和使用LwIP网络组件,本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。
相关推荐
【经验】如何在JFLASH中添加极海半导体Geehy APM32系列MCU
本文主要介绍极海半导体MCU产品如何使用第三方Segger公司的JFLASH配合J-Link仿真器对指定型号MCU的Flash进行擦除、写入及读取操作的目的。
tandby模式下,如何唤醒MCU APM32的RTC与WKUP?
APM32F103系列低功耗模式有三种:睡眠模式、停止模式和待机模式。通过关闭内核、时钟源、设置调压器来降低功耗。本文极海半导体解析了APM32的tandby模式下的RTC唤醒与WKUP唤醒功能如何实现。
APM32芯得 | 基于极海APM32E103系列MCU的SPI转CAN芯片MCP2515移植测试
极海半导体APM32E103系列MCU支持CAN协议2.0A和2.0B,通信波特率最大为1Mbit/s,并且拥有双CAN接口,能适应更多的应用场合。将杜邦线按照引脚配置,接好线后仿真就能测试回环模式下收发数据了。可以看到断点打到接收部分,可以接收到CAN数据,与发送的数据一致。
极海半导体32位MCU-M0选型表
极海半导体的APM32系列是基于Arm® Cortex®-M0+/M3/M4内核的优质国产32位通用MCU,具有低功耗、高性能、高集成度以及快速移植等特性。凭借优异的系统性能、丰富的协处理功能以及灵活的使用体验,有助于用户缩短产品设计时间、降低开发成本、实现性能最优化。
产品型号
|
品类
|
内核
|
Frequency(MHz)
|
FLASH(KB)
|
SRAM(KB)
|
I/Os
|
Vmin(V)
|
Vmax(V)
|
GPTMR(16bit)
|
GP TMR(32bit)
|
Advanced TMR(16bit)
|
Basic TMR
|
Systick(24bit)
|
ADC 12-bit Cell
|
ADC 12-bit channels
|
DAC 12-bit Cell
|
DAC 12-bit channels
|
Analog Comparator
|
TSC (Channels)
|
SPI
|
I2S
|
I2C
|
U(S)ART
|
CAN
|
SDIO
|
USB Device
|
Package
|
对照型号
|
APM32F072V8T6
|
32位MCU
|
ARM Cortex-M0
|
48MHz
|
64KB
|
16KB
|
87
|
2V
|
3.6V
|
5
|
1
|
1
|
2
|
1
|
1
|
16
|
1
|
2
|
2
|
24
|
2
|
2
|
2
|
4
|
1
|
0
|
1
|
LQFP 100
|
-
|
选型表 - 极海半导体 立即选型
【经验】极海MCU APM32F103 IAP的实现方式
拿到了一块APM32F103VC的MINI开发板,在学习了一段时间后发现其有非常丰富的外设资源,主频能达到96Mhz。最近在项目中使用到了IAP(In Application Programming)功能,特来评估一下APM32F103的IAP实现方式。
APM32芯得 EP.36 | APM32F4实现用U盘记录LOG信息
MCU 组成的系统在实际应用中,经常需要记录系统 LOG 信息,可以是系统不同任务执行情况的 LOG 信息,也可以是内核寄存器等便于维护调试的信息,或者是传感器的信息等。本文内容利用 APM32F407xx 的 OTG Host 和 Fatfs 文件系统,加上 RTC 功能来实现数据记录。
还可以这样玩?极海半导体APM32F411系列MCU与pyocd的火花
前段时间笔者学习了一下如何使用pyocd配合APM32F411VCTINY板在命令行下给它进行各种骚操作,在使用一段时间后就想着:pyocd是基于python的,那是不是也可以使用python脚本+pyocd使用起来呢?本文中极海半导体与大家分享能够自动化完成重复操作的设计经验。
极海半导体APM32F407系列MCU支持国密算法,助力国产安全可控,适用于新能源等领域
极海推出的APM32F407系列MCU,结合当前环境要求,设计出了支持国密算法(SM2,SM3,SM4)的IP, 符合国家密码管理局认定和公布的密码算法标准及其应用规范,并凭借显著的性能优势,已应用至新能源、工业控制、医疗设备等众多领域。
极海联亮相2024全球MCU及嵌入式生态发展大会,展出新技术和产品并发表演讲
2024年7月25日,2024全球MCU及嵌入式生态发展大会在深圳君悦酒店举行,由AspenCore主办。极海作为特邀嘉宾在主论坛进行演讲,并展出新技术和产品,包括搭载Arm Cortex M52内核且采用Helium技术的G32R5系列实时控制MCU和针对电机市场的栅极驱动器与APM32M3514系列SoC等新品。
【应用】国产工业级高性能MCU APM32F407VGT6用于PLC工控板,主频168MHz,通信外设丰富
某客户主要做各种工业自动控制系统装置,其中一款国产PLC工控板主控要更换成国产物料,推荐极海工业级高性能MCU APM32F407系列,主频高达168MHz、通信外设资源丰富,工作温度范围-40℃到+85℃。
【应用】极海工业级APM32F003系列MCU无线充方案,工作主频48MHz,能满足小体积、低功耗嵌入式应用需求
极海工业级通用型APM32F003系列MCU,具有大容量、宽温幅、高精度等产品特性。通过整合增强型实时控制能力与丰富的外设资源配置,能以更为经济的开发成本获取更加复杂、先进的产品功能,可有效满足无线充电小体积、低功耗的嵌入式应用需求。
APM32F411xCXE ARM®Cortex®-M4F核基32位MCU用户手册
极海半导体 - 基于ARM®CORTEX®-M4F内核的32位MCU,MICRO-CONTROLLER UNIT,ARM® CORTEX®-M4F CORE-BASED 32-BIT MCU,微控制器单元,MCU,APM32,APM32F411XCXE SERIES,APM32F411XCXE
【应用】极海32位MCU用于光伏逆变器,内置3个精度12位的ADC,主频高达168MHz
极海半导体APM32F407VGT6在硬件上标准LQFP100封装,高达168MHz的主频,独立FPU模块,高达82个I/O,操作简单,提供标准DEMO驱动程序等优点,是光伏逆变器应用或者其他通用MCU场景的优秀选择。
【经验】极海APM32全系列MCU在线调试仿真工具GEEHY-LINK,支持全速运行、单步调试等调试方式
GEEHY-LINK是一款仿真器和编程器一体化的开发工具,可以在keil集成开发环境下对极海半导体APM32全系列MCU产品进行在线调试仿真。支持全速运行、单步调试和断点设置等各种调试方式。
APM32F103xCXDXE基于ARM®Cortex®-M3的32位MCU用户手册
本手册详细介绍了APM32F103xCxDxE系列基于Arm® Cortex®-M3内核的32位微控制器(MCU)的系统架构、内存和外设。内容包括系统架构概述、内存映射、启动配置、Flash存储器、外部存储器控制器(EMMC)、外部内存控制器(SMC)、动态内存控制器(DMC)、复位和时钟管理(RCM)、电源管理单元(PMU)、备份寄存器(BAKPR)、嵌套向量中断控制器(NVIC)、外部中断/事件控制器(EINT)、直接内存访问(DMA)、调试MCU(DBGMCU)、通用输入/输出引脚(GPIO)、多功能输入/输出引脚(AFIO)、定时器、看门狗定时器(WDT)、实时时钟(RTC)、通用同步/异步收发器(USART)、内部集成电路接口(I2C)、串行外设接口/片上音频接口(SPI/I2S)、控制器局域网(CAN)、安全数字输入/输出接口(SDIO)、全速USB设备接口(USBD)、模数转换器(ADC)、数模转换器(DAC)、循环冗余校验计算单元(CRC)、浮点单元(FPU)以及芯片电子签名等。
极海半导体 - ARM® CORTEX® -M3 BASED 32-BIT MCU,基于ARM®CORTEX®-M3的32位MCU,微型控制器,MICRO-CONTROLLER,MCU,APM32F103XCXDXE,APM32F103XDXE,APM32F103XCXDXE SERIES,APM32F103XC,APM32F
电子商城
现货市场
服务
可定制显示屏的尺寸0.96”~15.6”,分辨率80*160~3840*2160,TN/IPS视角,支持RGB、MCU、SPI、MIPI、LVDS、HDMI接口,配套定制玻璃、背光、FPCA/PCBA。
最小起订量: 1000 提交需求>
拥有IC烧录机20余款,100余台设备,可以烧录各种封装的IC;可烧录MCU、FLASH、EMMC、NAND FLASH、EPROM等各类型芯片,支持WIFI/BT模组PCBA烧录、测试。
最小起订量: 1 提交需求>
登录 | 立即注册
提交评论