0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

极海APM32F427 MCU在RT-Thread系统上使用LwIP网络功能

Geehy极海半导体 来源:21ic论坛极海半导体专区 2026-04-02 15:19 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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

下面是基于RT-Thread的ENV命令行开发环境,在APM32F427上使用LwIP网络协议栈实现网络通信功能的。

1. 工具和RT-Thread源码的准备

1.1 ENV工具的安装和使用

这里只做基本的介绍,详细的使用方法请点击下面链接看RTT的官方文档中心中对ENV工具的介绍。

https://www.rt-thread.org/document/site/#/development-tools/env/env

Env 是 RT-Thread 推出的开发辅助工具,针对基于 RT-Thread 操作系统的项目工程,提供编译构建环境、图形化系统配置及软件包管理功能。

其内置的 menuconfig 提供了简单易用的配置剪裁工具,可对内核、组件和软件包进行自由裁剪,使系统以搭积木的方式进行构建。

ENV工具可以从下面的RTT官方网站下载。

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

11d9d864-2d71-11f1-90a1-92fbcf53809c.png

然后点击码云下载。

1242d6d4-2d71-11f1-90a1-92fbcf53809c.png

点击下载ZIP就行。

当然,如果有git bash的话,可以使用 git clone 命令进行远程源码拉取到本地电脑中。

注意:请下载最新版本的RTT源码包,太老版本的话可能还没有APM32的BSP包。

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

进入apm32f4的bsp根目录下:

12a751ea-2d71-11f1-90a1-92fbcf53809c.png

然后右键在该目录下打开ENV工具(如果没有把ENV添加到右键菜单的话,自己看RTT文档进行操作,或者自行切换ENV路径到该目录下)。

130e4684-2d71-11f1-90a1-92fbcf53809c.png

打开ENV工具之后,在该目录下输入 scons 命令即可编译该BSP。

1373d65c-2d71-11f1-90a1-92fbcf53809c.png

最终编译成功如下:

13d91a30-2d71-11f1-90a1-92fbcf53809c.png

如果使用 mdk/iar 来进行项目开发,可以直接使用 BSP 中的工程文件或者使用以下命令中的其中一种,重新生成工程,再进行编译下载。

scons --target=iar

scons --target=mdk4

scons --target=mdk5

3. 复制APM32F407的BSP修改为APM32F427的BSP

由于官方可能还没有添加APM32F427的BSP目录,但是没关系,由于APM32F407与APM32F427很像。我们基于APM32F407修改为F427即可。

主要就是修改407的时钟配置函数。打开工程中的drv_clk.c文件,修改 clk_init 函数对于时钟的初始化函数。

修改代码如下:

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;

#ifdefined(DATA_IN_ExtSRAM)

SystemInit_ExtSRAM();

#endif/* DATA_IN_ExtSRAM */

SystemClockConfig();

/* Configure the Vector Table location add offset address */

#ifdefVECT_TAB_SRAM

SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */

#else

SCB->VTOR = FMC_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */

#endif

}

4. 使能 LwIP 与 net dev

4.1 首先使能以太网板级外设驱动

在ENV工具中输入 menuconfig 命令:

14347cd6-2d71-11f1-90a1-92fbcf53809c.png

本来在这个配置项下应该有板级外设驱动选项配置的,但是没有看到,很明显是该bsp包还没支持这个功能。那么后面只能自己把以太网板级外设驱动文件(drv_eth.c)添加到keil工程里面了。当然,就算支持该功能,如果没有drv_eth.c这个文件的支持那也没用。

4.2 启用 lwIP 与 net device

1493ae04-2d71-11f1-90a1-92fbcf53809c.png

然后再使能LwIP网络协议栈。其中,在该配置项下面我们把DHCP功能关闭了,使用静态IP地址。然后我们再使能 netif loopback 功能,该功能就是可以自己ping通自己的。

14f1fa68-2d71-11f1-90a1-92fbcf53809c.png

配置完成后,我们保存退出。

最后输入命令:scons --target=mdk5 把刚刚的配置同步到 MDK5 工程。

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

当我们添加了LwIP网络协议栈之后,就可以编译代码后可以下载到开发板运行。如下,我们下载代码到开发板后,在串口终端运行 ifconfig 命令查看网络状态,可以看到有错误:

1555c69c-2d71-11f1-90a1-92fbcf53809c.png

这是因为以太网的驱动文件还没添加进去编译的原因。

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

因为apm32的BSP包里面并没有RTT的以太网板级驱动文件drv_eth.c,所以需要我们自己编写这个文件。这个文件我已经编写好了,然后我们自己把这个文件复制到apm32的bsp包里面,而且手动添加到MDK5的工程中即可:

15b10cf0-2d71-11f1-90a1-92fbcf53809c.png   160f23bc-2d71-11f1-90a1-92fbcf53809c.png

5.2 打开ETH板级外设驱动,和选择PHY芯片型号

因为 drv_eth.c 文件使用了宏 BSP_USING_ETH 默认关闭了这个外设驱动的,需要定义这个宏才能打开这个外设驱动,另外开发板使用的PHY芯片的宏也需要定义,目前支持的芯片类型有,LAN8720、DP83848以及DM9161。

我们就在 drv_eth.c 文件(或者rtconfig.h文件也行)的最前面定义下面两个宏:

#defineBSP_USING_ETH

#definePHY_USING_DP83848C // 根据自己使用的phy芯片型号定义

5.3 添加标准外设驱动文件apm32f4xx_eth.c和apm32f4xx_eth.h

添加了上面那两个宏之后,编译一大堆报错,这是因为MDK还没有添加eth的标准库外设驱动文件apm32f4xx_eth.c和apm32f4xx_eth.h。

1670a2f4-2d71-11f1-90a1-92fbcf53809c.png

我发现RTT的源码里面,apm32的bsp包竟然没有apm32f4xx_eth.c和apm32f4xx_eth.h这两个文件,那没办法了,只好到apm32的官网下载f4的SDK包,然后再把这两个文件复制到bsp包的库目录下面。然后再手动添加到MDK工程里面。

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

添加了标准外设驱动文件apm32f4xx_eth.c到MDK工程之后,这时编译,还是报上面步骤一样的错误,这是因为没有包含 apm32f4xx_eth.h 头文件,我们在 board.h 文件中写上包含该头文件。另外,因为后面的代码有用到apm32f4xx_syscfg.h这个头文件,所以这里一起写上,如下图:

16ceb114-2d71-11f1-90a1-92fbcf53809c.png

5.5 添加 phy_reset 和 ETH_GPIO_Configuration 函数

继续编译,会发现还有两个链接报错,说没有定义 phy_reset 和 ETH_GPIO_Configuration 函数,这两个函数一个是phy芯片硬件复位引脚进行复位的,另外一个函数是eth外设GPIO口的初始化。

1731482e-2d71-11f1-90a1-92fbcf53809c.png

这两个函数是在 drv_eth.c 文件中要用到的,因为这两个函数和板级硬件的关联太大,并不能确定用户使用的是什么GPIO口,所以独立出来由用户自己添加。

我目前使用的事RMII接口和PD11作为复位引脚,我们在 board.c 文件中添加下面的代码。

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

}

ETH_GPIO_Configuration 函数:

/* MII/RMII Media interface selection */

//#defineMII_MODE

#defineRMII_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 */

#ifdefined(MII_MODE) /* Mode MII. */

SYSCFG_ConfigMediaInterface(SYSCFG_INTERFACE_MII);

#elifdefined(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);

#ifdefMII_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

}

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

178c343c-2d71-11f1-90a1-92fbcf53809c.png

到这里已经完成了所有代码的添加和移植了,LwIP网络协议栈也可以正常运行起来了。

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

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

17ed97b8-2d71-11f1-90a1-92fbcf53809c.png

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

18491e1c-2d71-11f1-90a1-92fbcf53809c.png

7. 使用RTT的tcp client和server例程

7.1 配置menuconfig

首先,需要在menuconfig开启使用这两个例程,配置如下:

18a4ff70-2d71-11f1-90a1-92fbcf53809c.png

7.2 更新软件包

保存配置退出之后,我们要去下载在线软件包,在ENV输入 pkgs --update 命令即可,然后可以看到软件包下载下来了。

190c5cce-2d71-11f1-90a1-92fbcf53809c.png

最后,我们执行命令,scons --target=mdk5 同步到 MDK5 工程里面。

注意:前面我们手动添加了一些文件到 MDK 工程里面,如果我们这里执行了 scons --target=mdk5 这个命令之后,其实会把我们之前添加的配置文件全部都移除掉的,这是使用 ENV 的一个不好的地方。

7.3 测试验证

然后,编译下载程序到板子上运行。

这两个例程是以命令的形式放在串口终端下运行的,我们在串口终端下运行 tcpserv 命令,使用开发板作为服务器,如下:

19764472-2d71-11f1-90a1-92fbcf53809c.png

可以看到服务器端口端口是5000。

然后我们在电脑端使用网络调试工具作为客户端,去连接开发板,如下:

19d39654-2d71-11f1-90a1-92fbcf53809c.png

以上,就是在ENV环境下,APM32F4在RT-Thread系统上使用LwIP网络功能的详细过程。

提示:关于文章的第五节,其实已经不需要我们自己添加APM32F427的drv_etc.c网络驱动文件了,因为官方已经做好了。

注:文章作者在原帖中提供了详细代码,有需要请至原文21ic论坛

原文地址:https://bbs.21ic.com/icview-3501388-1-1.html?_dsign=c8a71825

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 网络通信
    +关注

    关注

    4

    文章

    845

    浏览量

    32651
  • 开发环境
    +关注

    关注

    1

    文章

    275

    浏览量

    17673
  • LwIP
    +关注

    关注

    2

    文章

    91

    浏览量

    29748
  • RT-Thread
    +关注

    关注

    32

    文章

    1636

    浏览量

    45190

原文标题:极海芯得 EP.79 | APM32F427在RT-Thread系统上如何使用LwIP网络功能实现网络通信

文章出处:【微信号:geehysemi,微信公众号:Geehy极海半导体】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    RT-Thread最新推出Nano简版

    RT-Thread适时推出第一个RT-Thread Nano简版,适用于家电、消费电子、医疗设备、工控等领域大量使用的32位ARM入门级MCU的场合,支持多任务处理、信号量和邮箱等相
    发表于 07-31 11:35 5901次阅读

    APM32F427如何实现自定义USB HID设备与PC进行通信

    最近需要使用到 APM32F427 枚举成Custom HID设备进行用户自定义通信,但是官方的例程只有提供的HID枚举为鼠标或者键盘类型的设备。这里记录一下,怎么使用Geehy官方的USB中间件,实现自定义的USB HID设备进行用户通信。
    的头像 发表于 03-30 09:30 2741次阅读
    <b class='flag-5'>极</b><b class='flag-5'>海</b><b class='flag-5'>APM32F427</b>如何实现自定义USB HID设备与PC进行通信

    SC0085 AT32RT-Thread运行LwIP协议栈

    示例目的演示RT-Thread运行LwIP协议栈,并搭建一个UDP echo server支持型号列表:支持型号AT32F407xxAT32F
    发表于 08-23 20:40

    RT-Thread系统移植eRPC并添加lwip的步骤

    还有 snprintf 变成 rt_snprintf,memset 变成 rt_memset 等验证有没有发现,我们可以设备跑 eRPC了。到目前为止,我们已经添加了
    发表于 09-05 16:43

    如何将RT-Thread系统移植到GD32F427

    RT-Thread移植到GD32F427。本文主要实现如下功能:1、基于RT-Thread 现在gd32407v-start的BSP更新为
    发表于 12-13 16:28

    【国产MCU系列】 HK32F030 移植 RT-Thread Nano

    如需下载相关开源资料请点击阅读原文这是一个航顺 HK32F030 的 RT-Thread Nano 移植示例,记录了 Keil 裸机工程的基础上进行 RT-Thread Nano 移
    发表于 11-21 18:51 42次下载
    【国产<b class='flag-5'>MCU</b>系列】<b class='flag-5'>在</b> HK32<b class='flag-5'>F</b>030 <b class='flag-5'>上</b>移植 <b class='flag-5'>RT-Thread</b> Nano

    RT-Thread系统移植到STM32f103

    RT-Thread系统移植到STM32f103
    发表于 12-09 12:51 26次下载
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>系统</b>移植到STM32<b class='flag-5'>f</b>103

    【国产MCU系列】 HK32F030 移植 RT-Thread Nano

    这是一个航顺 HK32F030 的 RT-Thread Nano 移植示例,记录了 Keil 裸机工程的基础上进行 RT-Thread Nano 移植的全过程。在按文档中心...
    发表于 01-25 17:42 4次下载
    【国产<b class='flag-5'>MCU</b>系列】<b class='flag-5'>在</b> HK32<b class='flag-5'>F</b>030 <b class='flag-5'>上</b>移植 <b class='flag-5'>RT-Thread</b> Nano

    RT-Thread全球技术大会:RT-Thread编写测试用例

    RT-Thread全球技术大会:RT-Thread编写测试用例           审核编辑:彭静
    的头像 发表于 05-27 16:28 2259次阅读
    <b class='flag-5'>RT-Thread</b>全球技术大会:<b class='flag-5'>在</b><b class='flag-5'>RT-Thread</b><b class='flag-5'>上</b>编写测试用例

    RT-Thread已经全面支持APM32F1系列MCU

    近日,RT-Thread 和其高级会员合作伙伴半导体宣布:正式完成APM32F4系列MCURT-T
    发表于 08-30 09:45 1767次阅读

    APM32F030RCT6_软件问题_RT-Thread注册设备时,进入硬件报错

    APM32F030RCT6_软件问题_RT-Thread注册设备时,进入硬件报错
    发表于 11-09 21:03 0次下载
    <b class='flag-5'>APM32F</b>030RCT6_软件问题_<b class='flag-5'>RT-Thread</b><b class='flag-5'>在</b>注册设备时,进入硬件报错

    机智云设备移植RT-Thread

    程中,通常会有多个功能,这个时候就需要用到实时系统,比如FreeRTOS,AzureRTOSThreadX,RT-Thread等,笔者这里推荐RT-thread
    的头像 发表于 04-19 18:39 1924次阅读
    机智云设备移植<b class='flag-5'>RT-Thread</b>

    RT-Thread移植使用webserver (lwip+httpd)

    开发环境:野火的stm32f407,rt-thread studio版本是版本: 2.2.6,stm32f4的资源包为0.2.2,rt-thread版本为4.0.3。
    的头像 发表于 10-12 12:49 2906次阅读
    <b class='flag-5'>RT-Thread</b>移植使用webserver (<b class='flag-5'>lwip</b>+httpd)

    RT-ThreadLan8720a和 lwip基础移植ntp流程

    开发环境:野火的stm32f407,rt-thread studio版本是版本: 2.2.6,stm32f4的资源包为0.2.2。以RT-Thread中Lan8720和
    的头像 发表于 10-12 16:59 3472次阅读
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>在</b>Lan8720a和 <b class='flag-5'>lwip</b>基础<b class='flag-5'>上</b>移植ntp流程

    APM32F427系列MCU荣获IEC 60730/60335功能安全认证

    近日,APM32F427系列工业级高性能拓展型MCU,成功通过IEC 60730/60335功能安全认证。这标志着该系列产品
    的头像 发表于 02-09 09:15 978次阅读
    <b class='flag-5'>极</b><b class='flag-5'>海</b><b class='flag-5'>APM32F427</b>系列<b class='flag-5'>MCU</b>荣获IEC 60730/60335<b class='flag-5'>功能</b>安全认证