拓冰建站拓冰建站
首页 / 资讯中心 / 正文

RIOT 的 Silicon Labs SLWSTK6000B + SLWRB4162A 板级支持:硬件定位、构建系统集成与外设配置全解

RIOT 的 Silicon Labs SLWSTK6000B SLWRB4162A 板级支持硬件定位、构建系统集成与外设配置全解【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址: https://gitcode.com/GitHub_Trending/riot/RIOTSLWSTK6000B 搭配 SLWRB4162A 无线子模块是 RIOT 中面向 EFR32MGMighty Gecko系列 MCU 的 2.4 GHz 多协议无线开发板。本文基于仓库中的板级文档 boards/slwstk6000b-slwrb4162a/doc.md 展开结合该板在 RIOT 构建系统、Kconfig、外设配置与引脚映射中的真实实现说明如何在 RIOT 中构建、烧录和调试这块开发板。读完本文读者可以掌握该板的硬件定位MCU 型号、模块选择机制、Makefile/Kconfig 的继承结构以及 ADC、I2C、SPI、UART、Timer、时钟树等外设的具体配置方式。1. 硬件平台定位EFR32MG 无线 Gecko 平台boards/slwstk6000b-slwrb4162a/doc.md 对该板的一句话定位是SLWSTK6000B 搭配 SLWRB4162A 提供基于 EFR32MG 系列 MCU 的 Wireless Gecko 平台具备扩展内存与射频特性适合高级 2.4 GHz 与多协议无线开发。具体来说SLWSTK6000B 是一块“底板 可换无线模块”的开发套件主底板负责供电、调试接口、板控制器Board Controller和高级能量监测器Advanced Energy Monitor, AEM而真正决定 MCU 型号与射频能力的是插入其中的 SLWRB 系列无线模块。SLWRB4162A 模块的 MCU 为EFR32MG12P332F1024GL125这可以直接从该板的 Kconfig 配置中确认见 boards/slwstk6000b-slwrb4162a/Kconfigconfig BOARD_SLWSTK6000B_SLWRB4162A bool default y select CPU_MODEL_EFR32MG12P332F1024GL125 select BOARD_COMMON_SLWSTK6000Bselect BOARD_COMMON_SLWSTK6000B揭示了 RIOT 的组织方式同一底板的所有模块变体共享一套公共板级支持代码位于 boards/common/slwstk6000b/具体板目录只承担“底板 模块”组合的声明职责。1.1 底板支持的模块与 MCU 映射公共文档 boards/common/slwstk6000b/doc.md 给出了底板与模块的完整映射表所有模块均基于 EFR32 Series 1Mighty GeckoMCU模块MCUSLWRB4150AEFR32MG1P233F256GM48SLWRB4150BEFR32MG1P233F256GM48SLWRB4151AEFR32MG1P232F256GM48SLWRB4152AEFR32MG1P232F256GM48SLWRB4153AEFR32MG1P132F256GM48SLWRB4154AEFR32MG1P732F256GM32SLWRB4158AEFR32MG13P733F512GM48SLWRB4159AEFR32MG13P632F512GM48SLWRB4161AEFR32MG12P432F1024GL125SLWRB4162AEFR32MG12P332F1024GL125SLWRB4163AEFR32MG12P433F1024GL125SLWRB4164AEFR32MG12P433F1024GL125SLWRB4167AEFR32MG13P733F512GM48SLWRB4168AEFR32MG13P732F512GM48SLWRB4169AEFR32MG14P733F256GM48SLWRB4169BEFR32MG14P733F256GM48SLWRB4170AEFR32MG12P433F1024GM68注意并非表中所有 MCU 都获得 RIOT 的默认支持具体以仓库中实际存在的板级目录为准。1.2 从板名解析 CPU 型号info.mk 的实现构建系统如何知道slwstk6000b-slwrb4162a对应哪颗 MCU答案是 boards/common/slwstk6000b/slwstk6000b.info.mk其中每一行记录“模块名 - CPU_MODEL、JLink 设备”的映射# CPU_MODEL - JLINK_DEVICE SLWSTK6000B_MAINBOARD_VARS_slwrb4162a efr32mg12p332f1024gl125 efr32mg12p332f1024gl125第二列的 JLink 设备名efr32mg12p332f1024gl125用于烧录时让 J-Link 驱动识别目标芯片。2. 构建系统集成一个“薄”板目录如何工作该板在仓库中的目录结构非常精简全部文件如下boards/slwstk6000b-slwrb4162a/Makefileboards/slwstk6000b-slwrb4162a/Makefile.depboards/slwstk6000b-slwrb4162a/Makefile.featuresboards/slwstk6000b-slwrb4162a/Makefile.includeboards/slwstk6000b-slwrb4162a/Kconfigboards/slwstk6000b-slwrb4162a/doc.md这是 RIOT 板级支持的典型分层模式下面逐个文件说明。2.1 Makefile委托公共板目录boards/slwstk6000b-slwrb4162a/Makefile 只有三行有效内容MODULE board DIRS $(RIOTBOARD)/common/slwstk6000b include $(RIOTBASE)/Makefile.baseDIRS追加公共板目录意味着该板的所有板级 C 源文件如 boards/common/slwstk6000b/board.c和头文件include/board.h、include/periph_conf.h、include/gpio_params.h都来自公共目录。2.2 Makefile.features模块识别与功能声明boards/slwstk6000b-slwrb4162a/Makefile.features 定义了本板的关键属性CPU_FAM efr32mg12p include $(RIOTBOARD)/common/slwstk6000b/Makefile.featuresCPU_FAM efr32mg12p表明 CPU 家族是 EFR32MG12P。随后包含的公共 features 文件 boards/common/slwstk6000b/Makefile.features 做了两件重要的事从 BOARD 变量解析模块名BOARD_MODULE $(word 2, $(subst -, ,$(BOARD)))即把slwstk6000b-slwrb4162a按-拆开取第二段slwrb4162a作为模块名再结合 info.mk 得到CPU_MODEL efr32mg12p332f1024gl125。若模块无法识别构建会直接报错ifeq (,$(CPU_MODEL)) $(error $(BOARD_MODULE) can not be used with slwstk600b mainboard) endif这解释了为什么BOARD必须使用“底板-模块”完整命名模块名是 CPU 型号解析的输入。声明提供的外设特性FEATURES_PROVIDEDperiph_adc、periph_i2c、periph_rtc、periph_rtt、periph_spi、periph_timer、periph_uart。这些特性使 RIOT 的依赖解析机制features 检查能够判断本板可运行的应用集合。公共目录还进一步包含 Silicon Labs 平台的公共 features boards/common/silabs/Makefile.featuresCPU efm32 FEATURES_PROVIDED arduino_analog FEATURES_PROVIDED arduino_pins FEATURES_PROVIDED efm32_coretemp FEATURES_PROVIDED riotboot即该板按 EFM32 系列 CPU 处理同时提供 Arduino 兼容的模拟/数字引脚接口Arduino 引脚映射定义于 boards/common/silabs/include/arduino_iomap.h、片上核心温度传感器特性和 RIOT 引导加载器支持。2.3 Makefile.dep模块依赖板级依赖声明在 boards/slwstk6000b-slwrb4162a/Makefile.depUSEMODULE board_common_slwstk6000b include $(RIOTBOARD)/common/slwstk6000b/Makefile.dep被包含的公共依赖文件 boards/common/slwstk6000b/Makefile.dep 揭示了编译该板时自动引入的驱动模块# add board common drivers USEMODULE boards_common_silabs USEMODULE silabs_aem USEMODULE silabs_bcsilabs_bc板控制器Board Controller驱动提供虚拟串口实现见 boards/common/silabs/drivers/bc/bc.csilabs_aem高级能量监测器驱动实现见 boards/common/silabs/drivers/aem/aem.c若启用saul_defaultSAUL 默认传感器驱动集还会额外引入efm32_coretemp、saul_gpio和si7021底板上的温度/湿度传感器。2.4 Kconfig 继承链Kconfig 侧同样是两级继承见 boards/slwstk6000b-slwrb4162a/Kconfigconfig BOARD default slwstk6000b-slwrb4162a if BOARD_SLWSTK6000B_SLWRB4162A config BOARD_SLWSTK6000B_SLWRB4162A bool default y select CPU_MODEL_EFR32MG12P332F1024GL125 select BOARD_COMMON_SLWSTK6000B source $(RIOTBOARD)/common/slwstk6000b/Kconfig公共层 boards/common/slwstk6000b/Kconfig 则继续select BOARD_COMMON_SILABS并引入 boards/common/silabs/Kconfig。整体形成BOARD_SLWSTK6000B_SLWRB4162A - BOARD_COMMON_SLWSTK6000B - BOARD_COMMON_SILABS的选择链同时锁定 CPU 型号CPU_MODEL_EFR32MG12P332F1024GL125。3. 外设配置periph_conf.h 逐项解读该板所有 MCU 外设的静态配置集中在 boards/common/slwstk6000b/include/periph_conf.h配置通过 Silicon Labs 的 EMLIB 抽象层完成。以下按外设逐项说明。3.1 时钟树配置periph_conf.h 第 33-47 行 定义了四条时钟分支的默认源#ifndef CLOCK_HF #define CLOCK_HF cmuSelect_HFXO /* 默认使用外部晶振 38.4 MHz */ #endif #ifndef CLOCK_CORE_DIV #define CLOCK_CORE_DIV cmuClkDiv_1 #endif #ifndef CLOCK_LFA #define CLOCK_LFA cmuSelect_LFRCO #endif #ifndef CLOCK_LFB #define CLOCK_LFB cmuSelect_LFRCO #endif #ifndef CLOCK_LFE #define CLOCK_LFE cmuSelect_LFRCO #endif注意每个宏都用#ifndef包裹即可以通过编译定义compiler defines覆盖。可用的时钟源频率为本底板特有值时钟源内/外部频率备注HFRCO内部19 MHz启动时默认使能可切换HFXO外部38.4 MHzLFRCO内部32.768 kHzLFXO外部32.768 kHzULFRCO内部1 kHz作为时间源不可靠时钟源与分支的对应关系分支可用时钟源用途HFHFRCO、HFXO内核与外设LFALFRCO、LFXO低功耗定时器LFBLFRCO、LFXO、CORELEDIV2低功耗 UARTLFELFRCO、LFXO实时时钟与日历RTCC其中 CORELEDIV2 是一个依赖内核时钟源的派生源EMLIB 会自动将其分频 2 或 4 倍以避免超过最大允许频率。由于代码需要知道精确的时钟频率才能正确计算分频与波特率若板载晶振与上表不同需要向编译器传入EFM32_HFXO_FREQfreq_in_hz与EFM32_LFXO_FREQfreq_in_hz也可以通过编译定义覆盖分支时钟源例如CLOCK_LFAcmuSelect_LFRCO。3.2 低功耗 UART 的波特率限制这是一个与省电直接相关的约束当 LFB 分支的时钟源为 LFRCO 或 LFXO 时低功耗 UART 在 EM2 睡眠模式下仍可工作但波特率被限制在9600 baud。若需要更高波特率应将 LFB 时钟源切换为 CORELEDIV2。公共文档同时提醒这个设置不影响periph_conf.h中的引脚映射但应用代码不应再引用低功耗外设。3.3 RTCCRTT 与 RTC 二选一EFR32MG 系列拥有一个 32 位实时时钟与日历RTCC外设它可以配置为计时器ticker模式或日历calendar模式两者互斥——因此 RIOT 的 Real-Time Ticker 与 Real-Time Clock 只能启用其一。以 1 Hz 间隔配置时RTCC 约每 136 年溢出一次。periph_conf.h中 RTT 默认频率定义为 1 Hz第 106-108 行。3.4 ADCADC 使用 ADC0提供两个通道第 54-77 行static const adc_chan_conf_t adc_channel_config[] { { .dev 0, .input adcPosSelTEMP, .reference adcRef1V25, .acq_time adcAcqTime8 }, { .dev 0, .input adcPosSelAVDD, .reference adcRef5V, .acq_time adcAcqTime8 } };第一通道测量片上核心温度TEMP 输入1.25 V 基准第二通道测量 AVDD 电源电压。3.5 I2CI2C0 配置在模块引脚 P13SDA/ P12SCL使用路由位置 LOC16/LOC14标准速率100 kHz 档并启用内部上拉第 84-98 行static const i2c_conf_t i2c_config[] { { .dev I2C0, .sda_pin MODULE_PIN_P13, .scl_pin MODULE_PIN_P12, .loc I2C_ROUTELOC0_SDALOC_LOC16 | I2C_ROUTELOC0_SCLLOC_LOC14, .speed I2C_SPEED_NORMAL, .cmu cmuClock_I2C0, .irq I2C0_IRQn, .use_internal_pull_ups true } };3.6 SPIUSART 复用与 UARTSPI 由 USART1 复用实现仅支持主机模式第 115-127 行MOSI 在 F16、MISO 在 P3、CLK 在 F15路由位置均为 LOC11。默认控制台 UART 使用 USART0RX 在 F7、TX 在 F6路由位置 LOC0第 174-184 行。3.7 Timer级联定时器与低功耗定时器periph_conf.h声明了两套 timer第 138-163 行TIMER0预分频级 TIMER1定时级两路硬件定时器以级联cascade方式组合成一路 64 位定时器提供 3 个捕获/比较通道中断为TIMER1_IRQnLETIMER0低功耗定时器2 个通道中断为LETIMER0_IRQn可配合 LFRCO/LFXO 在 EM2 下工作。3.8 引脚映射MODULE_PIN 的定义来源上面配置中反复出现的MODULE_PIN_P13等宏来自模块专属头文件 boards/common/slwstk6000b/modules/slwrb4162a/include/board_module.h。该文件定义了 SLWRB4162A 模块的全部引脚注意注释强调引脚编号对应模块而非底板例如#define MODULE_PIN_F0 GPIO_PIN(PF, 1) #define MODULE_PIN_F6 GPIO_PIN(PA, 0) /* USART0 TX */ #define MODULE_PIN_F7 GPIO_PIN(PA, 1) /* USART0 RX */ #define MODULE_PIN_P12 GPIO_PIN(PC, 10) /* I2C SCL */ #define MODULE_PIN_P13 GPIO_PIN(PC, 11) /* I2C SDA */ #define MODULE_PIN_P23 GPIO_PIN(PI, 0) /* ... 完整列表共 F0-F21、P0-P45 */GPIO_UNDEF表示该编号在 SLWRB4162A 上没有对应引脚如MODULE_PIN_F4、MODULE_PIN_P18。这也体现了公共底板的扩展机制每个模块变体如 slwrb4150a都有各自独立的modules/module/include/board_module.hperiph_conf.h通过#include board_module.h拿到当前模块的引脚表从而同一套公共配置代码适配不同模块。EFR32 平台支持外设引脚扩展映射extended pin mapping每个外设引脚可独立连接到该外设的一组预定义引脚之一。因此periph_conf.h中的定义由“实际 GPIO 引脚 路由位置loc”两部分组成两者必须匹配详见芯片数据手册。4. 板控制器Board Controller与能量监测AEM4.1 板控制器与虚拟串口SLWSTK6000B 底板自带一个板控制器 MCU它提供一个虚拟串口通过一个 GPIO 使能。RIOT 默认启用该模块对应上文USEMODULE silabs_bc可以通过向make传入DISABLE_MODULEsilabs_bc关闭。使用时需注意两点摘自 boards/common/slwstk6000b/doc.md使用虚拟串口前请确保板控制器固件为最新版本板控制器始终把虚拟串口配置为 115200 baud、8 数据位、无校验、1 停止位115200 8N1MCU 侧输出必须与之匹配。4.2 高级能量监测器AEM该套件搭载 Advanced Energy Monitor可与 Silicon Labs Simplicity Studio 开发软件配合对硬件与代码做代码级实时功耗测量板控制器负责能量采样MCU 侧则配置 CoreDebug 外设通过 SWO 端口输出寄存器与中断数据用于将功耗曲线与代码执行相关联。该特性默认开启可通过DISABLE_MODULEsilabs_aem关闭。一个容易踩的坑Simplicity Studio 做代码关联需要调试符号RIOT 默认生成 GDB 格式调试符号而 Simplicity Studio 要求 DWARF-2 符号GCC 的-gdwarf-2选项需要相应调整编译选项。5. 使用 EMLIB外设抽象与调试断言该板级移植基于 Silicon Labs 的 EMLIB 对外设寄存器做抽象。其收益与代价保证外设配置正确并自动处理芯片勘误errata简化开发大部分读写/获取/设置方法以 inline 函数或宏实现零开销主要开销出现在外设初始化阶段EMLIB 自带断言可以校验外设使用是否正确向编译器传入DEBUG_EFM定义即可启用EMLIB 采用 zlib 风格许可证允许源码分发。6. 编译、烧录与调试6.1 编译该板属于 Cortex-M 类目标板需要交叉编译工具链如arm-none-eabi。以examples下任一应用为例标准编译命令为make -C examples/basic/blinky BOARDslwstk6000b-slwrb4162a如板载晶振与默认值不同或希望切换低功耗分支时钟源可在命令中附加编译定义例如make -C examples/basic/blinky BOARDslwstk6000b-slwrb4162a CFLAGS-DEFM32_HFXO_FREQ38400000 make -C examples/basic/blinky BOARDslwstk6000b-slwrb4162a CFLAGS-DCLOCK_LFAcmuSelect_LFRCO6.2 烧录烧录需要 SEGGER J-Link 调试器底板已集成接口。RIOT 内置烧录支持make -C examples/basic/blinky BOARDslwstk6000b-slwrb4162a flashJ-Link 目标设备名efr32mg12p332f1024gl125来自 boards/common/slwstk6000b/slwstk6000b.info.mk 的映射表。6.3 调试# 启动 RIOT 内置 GDB 调试会话 make -C examples/basic/blinky BOARDslwstk6000b-slwrb4162a debug # 只启动 OpenOCD 调试服务器连接自己的 GDB make -C examples/basic/blinky BOARDslwstk6000b-slwrb4162a debug-server此外部分板支持有限的仿真emulate流程可用make emulate启动make -C examples/basic/blinky BOARDslwstk6000b-slwrb4162a emulate7. 实现状态与限制一览公共文档 boards/common/slwstk6000b/doc.md 给出的外设支持状态设备ID支持备注MCUEFR32MG1P/12P/13P/14P是支持电源模式底层驱动ADC是Flash是GPIO是中断在各引脚间共享见参考手册HWRNG是仅 EFR32MG12P 有 TRNGEFR32MG1P 没有I2C是PWM是RTCC是可配置为 RTT 或 RTC二选一SPI是仅主机模式Timer是UART是USART 与 SPI 共享LEUART 波特率受限见 3.2USB否对本板SLWRB4162A / EFR32MG12P332F1024GL125而言拥有真随机数发生器TRNG无 USB 外设SPI 仅主机模式GPIO 中断在引脚间共享是 EFM32 系列特性编写中断密集应用时需要留意。8. 相关文件索引内容路径板级文档本文核心依据boards/slwstk6000b-slwrb4162a/doc.md板级构建与 Kconfigboards/slwstk6000b-slwrb4162a/Makefile.features、boards/slwstk6000b-slwrb4162a/Kconfig公共底板文档模块表/时钟/烧录boards/common/slwstk6000b/doc.md模块-MCU 映射表boards/common/slwstk6000b/slwstk6000b.info.mk外设静态配置boards/common/slwstk6000b/include/periph_conf.hSLWRB4162A 模块引脚定义boards/common/slwstk6000b/modules/slwrb4162a/include/board_module.h板控制器 / 能量监测驱动boards/common/silabs/drivers/bc/bc.c、boards/common/silabs/drivers/aem/aem.cSilicon Labs 平台公共特性boards/common/silabs/Makefile.features综合来看SLWSTK6000B SLWRB4162A 在 RIOT 中的支持呈现清晰的三层结构具体板目录slwstk6000b-slwrb4162a负责声明 CPU 家族与模块依赖公共底板目录common/slwstk6000b承载时钟树、外设配置、引脚映射与模块识别逻辑Silicon Labs 平台层common/silabs提供 Arduino 引脚兼容、板控制器与能量监测等跨板能力。掌握这一结构后无论是适配新模块、调整时钟源还是排查串口功耗问题都可以直接定位到上表对应的源码文件。【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门