RIOT-OS 中的 Silicon Labs SLSTK3401A 开发板支持:硬件解析、板级配置与烧录调试指南
【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT
导读
本文聚焦 RIOT-OS 对Silicon Labs SLSTK3401A(EFM32 Pearl Gecko PG1)开发板的完整支持,内容包括板载 MCU 与外设的硬件规格、扩展头引脚分布、RIOT-OS 外设映射、板控制器与 Advanced Energy Monitor(AEM)的启用/禁用方式、时钟树配置、RTCC 的 RTC/RTT 二选一约束、EMLIB 使用说明,以及基于 SEGGER J-Link 的烧录与调试命令。读完本文,你将能够在 RIOT-OS 环境下为 SLSTK3401A 编写应用、裁剪板级模块、调整时钟源,并独立完成编译、烧录与 GDB 调试。
板级总览:专为低功耗设计的 Pearl Gecko 评估套件
SLSTK3401A 是 Silicon Labs 推出的EFM32 Pearl Gecko PG1 入门套件,板载 EFM32 微控制器,专为低功耗应用设计:具备节能外设、多种能量模式(EM0–EM4)以及极短的唤醒时间。套件自带Advanced Energy Monitor(AEM),可以实时测量硬件与代码的功耗,并将能耗与具体代码执行相关联,是低功耗开发的重要工具。
RIOT-OS 官方将该板收录于boards/slstk3401a/目录,Doxygen 分组为boards_slstk3401a(见 doc.md)。板级构建采用"公共板支持 + 单板差异"的模式:Makefile通过DIRS = $(RIOTBOARD)/common/silabs引入所有 Silicon Labs 开发板的公共代码,单板只保留芯片型号、引脚定义等差异(见 Makefile)。
硬件规格:MCU 与外设一览
MCU 核心参数
板载 MCU 型号为EFM32PG1B200F256GM48,属于 EFM32 Pearl Gecko 1B 系列(Series 1):
| 项目 | 规格 |
|---|---|
| 内核 | ARM Cortex-M4F(带 FPU) |
| 频率 | 最高 40 MHz |
| RAM | 32.0 KiB |
| Flash | 256.0 KiB |
| MPU | 支持 |
| DMA | 8 通道 |
| 定时器 | 2×16-bit + 1×16-bit(低功耗) |
| ADC | 12-bit |
| UART | 2×USART + 1×LEUART |
| SPI | 2×USART(复用) |
| I2C | 1× |
| Vcc | 1.85 V–3.8 V |
该配置在 Makefile.features 中体现为CPU_FAM = efm32pg1b、CPU_MODEL = efm32pg1b200f256gm48,并提供periph_adc、periph_i2c、periph_rtc、periph_rtt、periph_spi、periph_timer、periph_uart七项外设特性。
扩展头 Pinout
文档给出的是板子右侧扩展排针的引脚分布:将排针水平面向自己时,PIN 1 位于左下角。
| PIN | PIN | ||
|---|---|---|---|
| 3V3 | 20 | 19 | RES |
| 5V | 18 | 17 | RES |
| PC10 | 16 | 15 | PC11 |
| PA1 | 14 | 13 | PB13 |
| PA0 | 12 | 11 | PD11 |
| PC9 | 10 | 9 | PD10 |
| PC8 | 8 | 7 | PA4 |
| PC7 | 6 | 5 | PA3 |
| PC6 | 4 | 3 | PA2 |
| VMCU | 2 | 1 | GND |
使用前需注意两点:其一,Silicon Labs 不同入门套件的排针定义并不通用;其二,部分引脚在使能后会被板控制器占用(详见下文"板控制器"一节)。
外设映射与实现状态
RIOT-OS 外设映射
板级外设映射同时记录在 doc.md 与 periph_conf.h 中,两处完全一致:
| 外设 | 编号 | 硬件 | 引脚 | 备注 |
|---|---|---|---|---|
| ADC | 0 | ADC0 | CHAN0: 内部温度 | 引脚固定,不支持 14/16-bit 分辨率 |
| I2C | 0 | I2C0 | SDA: PC10, CLK: PC11 | I2C_SPEED_LOW与I2C_SPEED_HIGH时钟速率有偏差 |
| RTT | – | RTCC | – | 1 Hz 间隔,与 RTC 二选一 |
| RTC | – | RTCC | – | 1 Hz 间隔,与 RTT 二选一 |
| SPI | 0 | USART1 | MOSI: PC6, MISO: PC7, CLK: PC8 | 仅主机模式 |
| Timer | 0 | TIMER0 + TIMER1 | – | TIMER0 用作预分频器(必须相邻) |
| 1 | LETIMER0 | – | 低功耗定时器 | |
| UART | 0 | USART0 | RX: PA1, TX: PA0 | 默认 STDIO 输出 |
| 1 | LEUART0 | RX: PD11, TX: PD10 | 波特率受限(见下文) |
对应源码实现要点:
- ADC:periph_conf.h 定义了两个通道:
adcPosSelTEMP(1.25 V 参考、内部温度)与adcPosSelAVDD(5 V 参考)。板级board.h通过CORETEMP_ADC ADC_LINE(0)将片上温度传感器接到saul的efm32_coretemp模块。 - I2C:使用
I2C0,location 15(SDALOC_LOC15 | SCLLOC_LOC15),速度I2C_SPEED_NORMAL并启用了内部上拉(use_internal_pull_ups = true)。 - SPI:USART1 的 location 11,仅主机模式。
- Timer:Timer 0 采用级联(cascade)模式——TIMER0 作预分频器、TIMER1 作主定时器,提供 3 个通道;Timer 1 为 LETIMER0,提供 2 个通道,可运行在低功耗时钟上。
- UART:USART0(location 0)是默认 STDIO 输出;LEUART0(location 18)为低功耗 UART。
用户交互接口
| 外设 | 编号 | 宏 | 引脚 | 备注 |
|---|---|---|---|---|
| 按键 | 0 | PB0_PIN | PF6 | – |
| 1 | PB1_PIN | PF7 | – | |
| LED | 0 | LED0_PIN | PF4 | 黄色 |
| 1 | LED1_PIN | PF5 | 黄色 |
在 board.h 中,按键与 LED 引脚均定义为GPIO_PIN(PF, n),并配套了LED0_ON/OFF/TOGGLE、LED1_ON/OFF/TOGGLE宏供应用直接调用。SAUL 的 GPIO 映射(见 gpio_params.h)将 2 个 LED 注册为GPIO_OUT,2 个按键注册为带内部上拉的GPIO_IN_PU并标记SAUL_GPIO_INVERTED(按下为低电平)。
实现状态
| 设备 | ID | 支持 | 备注 |
|---|---|---|---|
| MCU | EFM32PG1B | 是 | 支持多种能量模式 |
| 低层驱动 | ADC / Flash / GPIO / I2C / PWM / RTCC / SPI / Timer / UART | 是 | GPIO 中断在引脚间共享(见参考手册);SPI 仅主机模式;USART 与 SPI 共享,LEUART 波特率受限 |
| USB | 否 | – | |
| LCD 驱动 | LS013B7DH0 | 是 | Sharp 低功耗 Memory LCD |
| 温湿度传感器 | Si7021 | 是 | Silicon Labs 温湿度传感器 |
从 Makefile.dep 可以看到默认依赖:启用saul_default时会自动拉入efm32_coretemp(片上温度)、saul_gpio与si7021;同时无条件加入boards_common_silabs、silabs_aem、silabs_bc三个板级模块。board.c的board_init()在使能MODULE_SI7021时,会通过SI7021_EN_PIN(PD9)上电使能 Si7021 传感器(见 board.c 与 board.h)。
板级配置详解
板控制器(Board Controller)
SLSTK3401A 自带一块板控制器,它通过 USB 提供一个虚拟串口,并通过一个 GPIO 引脚使能。该引脚默认使能,若不需要可通过编译参数关闭:
make ... DISABLE_MODULE=silabs_bc两个关键注意事项:
- 使用虚拟串口前,请确保已安装最新版板控制器固件;
- 板控制器始终按 115200 baud、8 数据位、无校验、1 停止位配置虚拟串口,因此 MCU 侧也必须以相同参数发送数据。
此外,板控制器在DISP_SELECTED引脚为低时也会占用低功耗 LCD。该引脚默认不被板级初始化,如果应用需要控制板载 Memory LCD,必须在应用内自行初始化该引脚。
在 RIOT-OS 中,板控制器模块的实现位于 boards/common/silabs/drivers/bc/,board_common_init()会在初始化阶段调用bc_init()(见 board_common.c)。
Advanced Energy Monitor(AEM)
AEM 是本套件的核心特色:可接入 Simplicity Studio 开发软件,测量能量消耗并与代码关联,实现代码级功耗分析。
其工作原理是:板控制器负责能量测量;为实现实时代码关联,会配置CoreDebug外设,通过SWO 端口输出 MCU 寄存器数据与中断数据。该特性默认开启,可用以下命令关闭:
make ... DISABLE_MODULE=silabs_aem需要特别注意的是:Simplicity Studio 需要调试符号来关联代码。RIOT-OS 默认生成 GDB 调试符号,而 Simplicity Studio 需要DWARF-2调试符号(GCC 对应-gdwarf-2),如需使用请相应调整编译参数。AEM 驱动位于 boards/common/silabs/drivers/aem/,在board_common_init()中通过aem_init()初始化(见 board_common.c)。
时钟选择(Clock selection)
EFM32 的多个外设分支可选用不同时钟源,动手配置前建议先阅读 Silicon Labs 的 AN0004.1(EFM32 CMU 应用笔记)熟悉各时钟。本套件可用的时钟源如下:
| 时钟源 | 内部 | 频率 | 备注 |
|---|---|---|---|
| HFRCO | 是 | 19 MHz | 启动时使能,可更改 |
| HFXO | 否 | 40 MHz | – |
| LFRCO | 是 | 32.768 kHz | – |
| LFXO | 否 | 32.768 kHz | – |
| ULFRCO | 否 | 1 kHz | 作为时间源不太可靠 |
各时钟分支及其可用源:
| 分支 | 时钟源 | 用途 |
|---|---|---|
| HF | HFRCO, HFXO | 内核、外设 |
| LFA | LFRCO, LFXO | 低功耗定时器 |
| LFB | LFRCO, LFXO, CORELEDIV2 | 低功耗 UART |
| LFE | LFRCO, LFXO | 实时时钟与日历(RTCC) |
其中CORELEDIV2派生自内核时钟源,会被除以 2 或 4 以避免超过最大时钟频率(由 EMLIB 自动处理)。上述频率为本套件特有,不可直接套用到其他板卡。
编译期配置:代码需要知道准确的时钟频率才能正确计算外设速率与波特率。若板上的 HFXO 或 LFXO 与上表不同,必须通过编译参数指定:
make ... EFM32_HFXO_FREQ=freq_in_hz EFM32_LFXO_FREQ=freq_in_hz若要覆盖某个分支的默认时钟源,可向编译定义中追加CLOCK_<分支>=<源>,例如:
make ... CLOCK_LFA=cmuSelect_LFRCO在 periph_conf.h 中可以看到本板默认值:CLOCK_HF = cmuSelect_HFXO、CLOCK_CORE_DIV = cmuClkDiv_1、CLOCK_LFA/LFB/LFE = cmuSelect_LFXO,且全部用#ifndef包裹,允许在编译时通过宏覆盖——这正是文档所述命令行配置生效的底层机制。
低功耗外设(LEUART)
低功耗 UART(LEUART)可以使用低速时钟。当LFB 分支选用 LFRCO 或 LFXO 时,LEUART 仍可在EM2低功耗模式下工作,但波特率被限制为9600 baud。若需要更高波特率,应将 LFB 时钟源切换为CORELEDIV2。
注意:该设置不会影响板级定义中的外设映射,但请确保应用代码不要引用任何依赖低功耗时钟的外设。
RTC 与 RTT 二选一
RIOT-OS 同时支持Real-Time Ticker(RTT)与Real-Time Clock(RTC),但本板 MCU 家族的 RTCC 是 32 位"实时时钟与日历",只能配置为滴答(ticker)模式或日历(calendar)模式之一,因此同一时间只能启用 RTT 与 RTC 中的一个。RTCC 按1 Hz间隔配置时,约136 年才会溢出一次。periph_conf.h中RTT_FREQUENCY默认被定义为 1 Hz(见 periph_conf.h),与文档描述一致。
使用 EMLIB 抽象外设寄存器
本移植使用 Silicon Labs 的EMLIB库抽象外设寄存器。虽然会带来一定开销,但能确保设备正确初始化、内建芯片勘误(errata)处理并简化开发。具体开销与应用及外设使用方式有关,最大开销出现在外设初始化阶段;大量 read/write/get/set 方法以内联函数或宏实现,几乎没有额外开销。
EMLIB 的另一优势是内置断言(assertions),可确保外设被正确使用。要启用断言,请在编译定义中传入:
make ... CFLAGS=-DDEBUG_EFMEMLIB 由 Silicon Labs 以 zlib 风格许可证发布,允许分发源码。
引脚位置(Pin locations)与扩展引脚映射
EFM32 平台支持将外设映射到不同的预定义引脚(predefined locations)。periph_conf.h中的定义主要由两部分组成:location 编号与实际引脚号。实际引脚用于通过 GPIO 驱动配置引脚,而 location 用于将外设路由到这些引脚——两者必须匹配,详细规则请参考芯片数据手册。
本 MCU 还支持扩展引脚映射(extended pin mapping):外设的每个引脚都可以分别连接到该外设预定义引脚集中的任意一个引脚,为硬件设计提供了极大灵活性(前述periph_conf.h中各外设配置中的*_ROUTELOC*_LOC*宏正是 location 的具体体现)。
编译、烧录与调试
烧录依赖SEGGER J-Link软件,RIOT-OS 提供以下命令:
烧录固件:
BOARD=slstk3401a make flash启动 GDB 调试器:
BOARD=slstk3401a make debug连接自己的调试器(仅启动调试服务器):
BOARD=slstk3401a make debug-server部分板卡支持有限模拟,可尝试:
BOARD=slstk3401a make emulate从构建系统层面看,Makefile.include中设置了JLINK_PRE_FLASH += r(烧录前执行 J-Link 的r复位命令),并引入公共的 Silicon Labs 板级 Makefile(见 Makefile.include),J-Link 的完整烧录流程由$(RIOTBOARD)/common/silabs/Makefile.include统一提供。
快速上手示例
结合以上配置,一个典型的开发流程如下:
- 进入应用目录(例如
examples/basic/hello-world),执行BOARD=slstk3401a make编译; - 烧录:
BOARD=slstk3401a make flash(需连接板载 J-Link); - 串口交互:板控制器虚拟串口固定为 115200/8-N-1,可打开串口终端查看 STDIO 输出(USART0/PA0–PA1);
- 低功耗开发:使用 LETIMER0 作为低功耗定时器,LEUART 在 LFB 使用 LFRCO/LFXO 时可工作于 EM2(波特率限 9600);需要更高波特率时将 LFB 切到 CORELEDIV2;
- 功耗分析:保持
silabs_aem模块启用,将调试符号切换为 DWARF-2(-gdwarf-2)后接入 Simplicity Studio,即可获得代码级能耗关联数据; - 裁剪模块:通过
DISABLE_MODULE=silabs_bc或DISABLE_MODULE=silabs_aem关闭板控制器或 AEM 以节省资源。
参考资源(仓库内)
- 板级文档:doc.md
- 板级定义与 LED/按键宏:board.h
- 外设配置(时钟/ADC/I2C/SPI/Timer/UART):periph_conf.h
- 板级初始化:board.c
- SAUL GPIO 映射:gpio_params.h
- 构建特性/依赖/包含规则:Makefile.features、Makefile.dep、Makefile.include
- Silicon Labs 公共板级支持:boards/common/silabs/(含 board_common.c、AEM/BC/PIC 驱动)
- Kconfig 板级配置入口:Kconfig
【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考