跳至主要内容

EFR32 (Simplicity Studio) 开发环境与实践笔记

· 閱讀時間約 15 分鐘
w0x7ce
MySelf

发布于 2025-05-22 18:58:38(微信公众号导出记录)。

本文来自公众号后台的“导出文章内容”功能。博客正文由导出长图进行本地 OCR 转写,并保留原始排版图用于逐段核对。

原文链接:查看原文

OCR 转写有效文字约 8119 字;代码、流程图和版式以文末原始排版图为准。

正文(本地 OCR 转写)

original wex7ce EI V1ajero 2025年5月22日 18:58 中国垂港

引言:EFR32系列无线SoC概览 SiliconLabs的EFR32系列无线片上系统(SoC)是专为现代物联网(IoT)应用设计 的核心处理单元。这些SoC的关键特点在于其高性能、低功耗、以及强大的多协议无线连接能 力。EFR32 系列通常集成了一个强大的ARM Cortex-M 系列微控制器核心(如 Cortex- M33或Cortex-M4),并配备了丰富的片上外设,包括多种通信接口{USART,I2C, SPI)、模拟组件(ADC,DAC)、以及多样化的定时器和脉冲宽度调制(PWM)通道。其突出的 无线性能支持包括蓝牙低功耗(BLE)、蓝牙Mesh、Zigbee、Thread、Wi-SUN以及专有无 线协议等多种标准,部分型号甚至支持多协议并发操作。此外,EFR32系列非常注重能源效 率,提供了多种低功耗模式和快速唤醒机制,使其非常适合电池供电的IoT设备。针对日益增 长的IoT安全需求,较新的 EFR32 系列还集成了先进的硬件安全功能,如 Secure Vault”技术,提供安全启动、加密加速、真随机数生成器和安全调试等特性。正是由于 EFR32SoC这种高度集成、多功能、多协议以及对低功耗和安全性的极致追求,使得其开发需 要一个同样强大且高效的集成开发环境,这侵是SimpLicity Studio存在的必要性一它旨 在简化这种复杂系统的配置和应用开发。 EFR32MG22 Common Specs Loa Power Wrdess 5yitem-n-chp Wide Bdectionof HCU Peripherh Protoee Buppert

Bads Parfernarce slusgupeodo opM 1224s 94y @2* 4p 0F5

  • 11Ve3Yarg*po pp

2dseshb 1Veis u3s 4°Cb 2 Pockogu* : 024405 IsErhur : TOFN24mm *4mm 1.30mm Seerity Feetures 282Ginter Loa 5yatem Errgy Cenanpthn podins ergn2 4iu ive UM) M022 36mARxoueK(1MpsGFS) 19nA FX we (2M ap1 0-0PSH D089) an Rot elTuat adi Sw g/nve2 1-s 22nATX czment g dcnx4 powr 25 gAMHs inAdivw Msds (EV0) xi34VHtc

1.44 pA.EV2 Doap

yyerpou payedeg ECOH vienden endRTC urshg fen UWCOy

0.17 μAEM sEM

DSSS ARIMS AE512925, 1 E021 tb24-1, E003A,rd x (TRNO)

一、SimplicityStudioIDE与开发方式概览

Silicon Labs(Silabs)为其EFR32 系列无线SoC提供的主要集成开发环境 是SimplicityStudio,这是一个基于Eclipse 的多功能平台,其核心设计理念在于高度 集成、组件化管理以及配置驱动开发。目标是简化日益复杂的物联网(IoT)应用开发,使开发 者能够通过图形化工具快速搭建和配置项目,同时保持对底层硬件的控制能力。 与一些传统嵌入式开发流程不同,Simplicity Studio强调以一个中心化的项目配置文件 (通需是.sLcp文件)来驱动整个项目的构建。这个文件记录了项目所依赖的SDK版本、 目标芯片、已安装的软件组件(Software Companents)、引脚分配、外设参数配置等关键 信息。当开发者通过图形界面修改这些配置并保存时,IDE会自动生成或更新相关的底层配置 文件和初始化代码,开发者则在这些自动生成的基础上编写应用逻辑。 主要特点:

1.软件组件(Software Components):提供大量预制验的驱动、协议栈模块、服务和第三方

库,开发者可以按需“安装“到项目中。IDE会处理组件间的依赖关系。

@

@

2.引即工具(Pin Tool):图形化界面,用于将芯片的物理引脚分配给特定的外设功能(如

USART TX/RX,PWM 输出,I2C SCL/SDA,GPI0 中断等),并能检查引脚冲突。

3.外设配置器:针对已选用的外设(如TIMER,USART,ADC,I2C)进行详细参数配置

(如时钟源、波特率、PWM频率、ADC分辨率等)。

Ifedl

1.代码生成:基于上述配置,自动生成初始化代强、配置文件头(如sl_conponent_catalo

g.h,定义项目中包含的组件)以及外设实例文件(如sL_pMm_Instances.h)。

5.集成工具糙:内置编译器(GCCARM)、调试卷(GDB 和 Silabs J-Link/STK 调试接

口)、功耗分析器(Energy Prof1ler)和网络分析器(Network Analyzer)。

二、与其他平台开发方式的对比

理解SinplicityStudio的开发方式,可以通过与其他流行平台的对比来加深:

  • 对比 STM32 (STM32CubeMX / STM32CubeIDE):

  • 配置起点与流程:STM32CubeMX通常是项目开始的第一步,用于图形化配置MCU的

时钟、外设、引脚和中间件,然后生成一个包含初始化代码的项目框架。开发者基于此框 架漆加应用逐辑。其流程更偏向于“先配置,后编码,配置基本一次性生成”。

  • SimpLicity Studio的.slcp文件则在项目的整个生命周期中都扮演着核心角

色。开发者可以随时通过它调整组件和配置,IDE会动态更新相关代码。启动项目时, 通常会基于一个示例或模板,然后在其上进行修改和配置。

  • IDE集成:STM32CubeIDE 将CubeMX 的功能集成到了Eclipse 环境中,体验上

与 Simplicity Studio 有相似之处,但CubeMX 本身也可以作为独立工具配合其 他IDE(如 Keil,IAR)使用。Simplicity Studio 则是—个更为封闭和统一的 生态系统。

  • HAL/驱动层: STM32 提供 HAL (Hardware Abstraction Layer) 和 LL (Low-

Layer)驱动.S1labs 提供sl_系列高层 API 和 enlib底层库,概念上类 似,但具体实现和API风格不同

  • 对比 Texas Instruments (TI - 如 Code Composer Studio+ SysConfig):

  • TI 的 SysConfig 工具与 Simplicity Studio 的配置理念有诸多相似之处,它也

是一个图形化配置工具,用于配置驱动程序、外设、引脚和软件栈,并生成相应的C代 码。SysConfig 通需与 TI 的 Code Composer Studio {CCS) IDE 配合使用。

  • 两者都强调通过工具篱化底层配置,让开发者专注于应用,SysConfig的组件化思提也

比较突出。其设计思路在于提供一个清晰的配置层,减少手动编写初始化代码的需要,与 Simpl1city Stud1o通过,slcp文件管理组件和配置的思路有共通之处。

  • 对比 Espressif (ESP32 - ESP-IDF):

  • ESP32 的开发主要依赖 ESP-IDF (Espressif IoT Development

Franework),这是一个基于FreeRTOS 和lwIP 的软件开发框架。

  • 配置方式:ESP-IDF主要使用Kconfig 系统(通过idf-py nenuconfig命令调

出文本菜单界面)进行项目功据、组件和部分驱动参数的配置。这种方式对于熟悉 Linux内核配置的开发者可能比较亲切。

  • 引脚/外设初始化:具体的引脚分配和外设初始化更多地是在C代码中通过调用ESP-

IDF提供的驱动API直接完成,虽然也有配置宏,但其图形化引I脚分配和与IDE集 成的外设配置工具不如前两者突出(VS Code的ESP-IDF 插件提供了一些辅助功 能,但核心配置仍在Kconfig和代码层面)。

  • IDE:官方推荐使用VSCode配合ESP-IDF 插件,或者基于命令行的开发流程。其

设计思路更们重于提供一个灵活的、以代码和构建系统为中心的框架,开发者对构建过程 和组件案成有较高的控制力。 SinplicityStudio的设计思路更倾向于提供一个高度集成的“保娠式"环填,尤其是在管理 复杂的无线协议栈和众多可配置模块时,通过统一的.slcp文件来维护项目的一致性和可配 置性。

一个典型的 EFR32裸机(bare-metal,即不使用RT0S)项目通常包含以下几个关键部分,

如blink_pum_baretetal示例所展示: 职责:初始化系统级服务、协议栈(若有)和用户应用程序。随后进入一个永不退出的 超级循环(super-loop)来调度系统和应用任务。

  • 关键代码分析(nain.c):

1善include“sl_component_catalog.h"//由IDE 生成,定义项目中包含的短件 include st_systen_init.h 1系统初始化函数 #include app-h 1应用层接象头文件 其他条件包含的头文件(知电源管理器) int main(vaid) { 5l_systen_init[):// 初始化 soK 超件、驱动、时钟等 11调用应用层初始化 app_init(); while (1)( slL_system_process_actlon(1:// soK 组件的网期性任务处理 1 1 11应用层的周期性任务处理 app process action(): //... 可熊包含 sl_powcr_sonogcr_slcep(),

  • sl_systen_init():封装了对所有已安装SDK组件的初始化调用,这些姐件和

它们的配置均由.51rp文件定义。

  • app_init[1:将控制权交给应用层进行初始化。

  • sl_systen_process_action()和 app_process_action(]:在超级循环中,前

者确保SDK内部任务(如蓝牙事件处理)得以执行,后者则留给用户执行应用逻 辑。 L.aPp.c·应用层抽象/桥接

  • 职责:作为nin.c和具体业务逻辑模块之间的桥梁,保持main.c的通用性,并

将具体的应用初始化和处理逻辑委托给下一层。

  • 关键代码分析(app.c):

include“bL1nk_pMm_app.h//包含具体业务模块的头文件 )(pTOA)TuT dde PTOA bLink_pwm_init();// 语用业务模块的初始化 1 (PTon)uoTIne ssaooud dde PTOA blink_pwm_pracess_actipn();//调用业务模块的思期处理

  • 这种分层设计使得当应用逻辑变得复杂时,可以通过包含不同的业务模块头文件并在

p.c中调用它们,而无需大幅修改main.c。

  • 职责:实现具体的应用功能。在bLink_pw_barenetal示例中,这里是控制PhM 实

现LED 呼吸灯效果。

  • 关键代码分析(bLink_pM_app.c):

//PMM驱动 APT include "sl_pmm_instances.h* //PM实例(出IDE根遥配置生成) //题既定时据API(用于延时) 5//PMH占空出宣找表(LUT) uinta_t pam_lut[] = { /+ .-. 0-109 的值 ..-*/ }: vold blink_pwm_init(void) { // 使用在 sT_pw_Instances.h 中声原的 sl_phm_lede 实例 sl._pwm_start(6sl_pwm_lede) ; void blink_pwm_process_action(vcid) ( //环改变PMH占空比。实现呼吸效果 for (uinta_t 1 = 0; 1 < 100; 1++) { sl_pwm_set_duty_cycle(6sl_pum_lede, pwm_lut[i]); sl_sleeptimer_delay_millisecond(6): (可能的额外延时) (反向据环)

sl_pwm_instances.h:这个头文件是关键,它通常包含了类似cxtern sl_pan_inst ance_tsl_pmm_Leda:这样的声明。sL_pMm_Lede的具体配置(如关联的 TIMER 外设、输出通道、引脚、PihM疑率、极性等)都是在 S1mpL1c1ty Stud1o 的图形化 配置工具中完成的,井由IDE自动生成到对应的sl_pwm_led3_config.h(或类似名 称)和初始化代码中

  • 设计思路:业务逻辑模块直接使用这些由IDE管理和配置好的外设实例,而无需关心

其底层的具体初始化细节。

假设目标是基于blink_pwm_barcnctal示例的结构,开发一个新的PwM 输出控制(例如, 控制另一个LED或一个小型风扇)。

1.项目创建与准备:

  • 在 Simplicity Studio中,可以基于一个裸机模板创建一个新项目,或者克隆现有

的blink_pn_barenetal 示例

  • 确保选择了正确的目标EFR32芯片或开发板。

2.源加并配置PWN软件组件:

  • PWM Frequency (Hz): 例如 1HGEa (16 kHz).

  • Polarity:通常是 Active High.

  • 打开项目的slcp配置文件。

  • 导航到“SOFTWARECOMPONENTS"标签页。

  • 搜索并安装“PWN”服务(如果尚未安装)。

  • 为新的 PWM 输出创建一个实例,例如命名为custom_Pam(IDE 可能会自动生成

如sl_pwm_custom_pwm 的实例名)。

  • 点击新创建的PMM实例,在右侧的配置面板中设置:

3.引脚配置(Pin Tool):

  • 在custonpum实例的配置界面,找到引脚配置部分,或直接切换到.slcp编辑器

顶部的“PIN TOOL"标签页。

  • 关键步骤:

  • 结果:Pin Tool会自动在后台生成或更新配置,例如在sl_pwm_custcm_pwm_confi

g.h(或类似名称的文件)中定义SL_PWH_CUSTOM_PH_PERIPHERAL,SL_PWH_CUSTO M_PWM OUTPUT_CHANNEL , SL PHM_CUSTON_ PWM_OUTPUT PORT , SL_PAM_CUSTOM PAM _oUTPUT_PIN 等宏。同时 sl_pwm_instanccs.h 中也会出现 sl_pum_custon_pu m实例的而明。

1.在Pin Tool 的外设列表中,找到一个可用的 TIMER外设(如TIMER1,TIMER

2等,避免与SL_pMm_LedO使用的TIMER冲突,除非该TIMER支持多通道独立 PWM且通道未被占用)。

2.选择该TIMER 的一个可用输出通道(CC ChanneL)。

3.在芯片引脚图中,找到一个想要用于PWMM输出的空闲GPI0引脚。

4.将选定的TINER通道功能拖拽或分配到这个GPI0引脚上。

1.添加延时功能(Sleep Tiner):

  • 如果应用需要精确延时,确保“SleepTimer”组件已安装在项目中(通常默认存在于

很多示例中)。 .编写业务逻辑代码:

  • 创建一个新的c文件(例如my_custom_pan_logic.c)和对应的.h文件。

  • 在ny_custon_pun_logic.c 中:

//这量会包含 sL_pwm_ _Custoe_p的声别 #incluie "sl_sleeptiner.h" include"my_custom_pwm_Logic.h" // 自己的头文件 /可以在此定文新的LIT或控别参数 //static uint8_tcustow_duty_cycle =50;// 示例:固定占空比 void ny_custom_pm_init(void) {

51._pwm_start(&sl_pwm_custon_pmm) : // 启t款的 Phmv 实例

//可选:设置初始占空比 // sl_pu_set_duty_cycle{6sT_pa_custo_psm, (=1. fnp aosn: void ny_custom_pum_pracess_action(vaid) { /1在这重实现自定文的PMM控制通辑 11例如:根据某个输人改变占空比,或查实现不同的闪炼模式 // static wint8_± new_duty = B; // ncw_duty = (ncv_duty + 10) 161; // 高单增o-109疆环 // sl_pvm_set_dty_cycLerGst_ou_custon_pwtl, new_duty); // sl_steeptimer_delay_millisecond(100); 11可以漆加其他控别通数,例期: void sct_my_custon_pw_duty(uint8_t duty) ( 5l_phm_set_duty_cycle(&sl_pwm_custom_pwm, duty):

  • 在ny_custon_pum_logic.h 中声明 ny_custon_pum_init() 和 my_custon_pwm_

process_actiont) 等函数 .集成到应用层(app.c):

  • 在 app.c 中 #include my_custon pum_ logic.h.

  • 修改app_init(1:

void app_init(void) { //DLink_pwm_1n1t(); //保留原有示例的初始化(如果需要) my_custon_pmm init):// 须加新模块的初始化

  • 改app_process_action(}:

1(pTon)uotioe ssaoud dde proA //DLink_pwm_process_action();// 保留原有示男的处理(如果离变) my_custan_pmm_proce actian():// 深加所模块的处理

■ ■

7.构建、烧录与调试:

  • 在SimplicityStudio中点击“Build"(锤子图标)。

  • 使用调试器逐步执行代码,观察变量状态。

  • 使用示波器连接到为sl_pwm_custom_pwm配置的GPIO引脚,验证PWM波形是否

符合预期(频率、占空比变化等)。

五、结论

EFR32的开发生态系统通过SimplicityStudio提供了一种高度集成且以配置为驱动的开 发模式。这种方式对于管理包含复杂无线协议栈和众多外设的SoC项目具有优势,能够让开发 者快速搭建原型并选代。其设计思路在于通过工具抽象底层细节,使得开发者能更多地关注应用 层创新。虽然其学习曲线和操作习惯与其他平台(如STM32的CubeMX或ESP32的ESP- IDF)有所不同,但一旦熟悉,其组件化和配置化的特点能显著提升特定类型项目的开发效率。 通过上述以PwM为例的开发流程,可以体会到其“配置优于编码(forhardwaresetup)” 的设计哲学,尤其是在需要快速适配不同硬件或复用已有软件组件的场景下,这种方法的便利性 更为突出。 嵌入式:目录三 <上一篇 下一篇> Hypershell消费级外骨骼:技术、市场与 在两个Linux系统上使用OpenHD搭建无线图 前景深度分析报告 传和数传链路的完整解决方案

原始排版图

EFR32 (Simplicity Studio) 开发环境与实践笔记:微信公众号导出原始排版图