RIOT-OS 板级支持解析:Ebyte E180-ZG120B-TB 测试板(EFR32MG1B / EFM32 Mighty Gecko 1B)
2026/9/20 15:30:24 网站建设 项目流程

RIOT-OS 板级支持解析:Ebyte E180-ZG120B-TB 测试板(EFR32MG1B / EFM32 Mighty Gecko 1B)

【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT

本篇技术指南围绕 RIOT 仓库中 boards/e180-zg120b-tb/doc.md 展开,完整讲解 Ebyte E180-ZG120B-TB 测试板在 RIOT-OS 中的板级支持:MCU 硬件规格、三组排针的引脚映射、外设与用户界面分配、时钟树与低功耗配置、RTC/RTT 互斥选择,以及无板载调试器情况下的烧录与调试流程。读者读完可掌握该板卡的真实板级定义(periph_conf.h/board.h),并能在 RIOT-OS 中正确编译、烧录与调试基于此板的应用。

板卡概述

Ebyte E180-ZG120B-TB 是亿佰特(Ebyte)推出的测试板(Test Board),板载Silicon Labs EFR32MG1B232F256GM32微控制器,属于 EFM32 Mighty Gecko 1B 系列。该板面向低功耗应用设计:具备节能外设、多种能量模式(Energy Modes)以及较短的唤醒时间,适合做 Zigbee / Thread / BLE 等无线传感节点与电池供电设备的前期评估与原型验证。

在 RIOT-OS 中,该板的全部板级描述集中在boards/e180-zg120b-tb/目录下,包括:

  • include/periph_conf.h:时钟、ADC、RTT、Timer、UART 等外设的板级实例化
  • include/board.h:按钮 / LED 引脚、ztimer 配置、LED 控制宏
  • include/gpio_params.h:SAUL GPIO 参数
  • board.c:board_init()初始化
  • Kconfig:板级 Kconfig 配置
  • Makefile.include / Makefile.features:烧录工具选择与特性声明

硬件规格(MCU)

板载 MCU 为EFR32MG1B232F256GM32,关键参数如下(数据来源于 doc.md):

项目规格
MCUEFR32MG1B232F256GM32
家族ARM Cortex-M4F
系列Series 1
厂商Silicon Labs
厂商系列EFM32 Mighty Gecko 1B
RAM32.0 KiB(其中 1.0 KiB 保留给 radio blob)
Flash256.0 KiB
EEPROM
主频最高 38.4 MHz
FPU / MPU支持 / 支持
DMA8 通道
定时器2× 16-bit + 1× 16-bit(低功耗)
ADC12-bit ADC
UART2× USART + 1× LEUART
SPI2× USART 复用
I2C
工作电压1.85 V – 3.8 V

从 Kconfig 可以看到,板卡符号BOARD_E180_ZG120B_TB直接select CPU_MODEL_EFR32MG1B232F256GM32,确认了该型号在 RIOT CPU 模型体系中的对应关系;Makefile.features 中同样声明CPU = efm32CPU_FAM = efr32mg1bCPU_MODEL = efr32mg1b232f256gm32

引脚映射(Pin Mapping)

重要注意事项

  • 至少在10199-V1.0修订版的测试板上,大部分丝印标签是错误的,实际连接以本文档的映射表为准。
  • 以下所有描述均假设板子方向为 USB 连接器朝上

Right Header(右侧排针)

编号规则:左上角为 1,右上角为 2,依此类推。

描述引脚(左)引脚(右)描述
GND12VCC
PB1334PB12
PB1156PD15
NC(E180-ZG120B 的 pin 8)78NC(E180-ZG120B 的 pin 7)
PA1910PA0
PD141112PD13
GND1314GND

Top Header(顶部排针)

编号规则:最左侧为 1,从左到右递增。

描述引脚(从左到右)
NC(E180-ZG120B 的 pin 23)1
NC(E180-ZG120B 的 pin 22)2
PC113
NC(E180-ZG120B 的 pin 20)4
PF25
PC106
NC(E180-ZG120B 的 pin 17)7
NC(E180-ZG120B 的 pin 16)8
NC(E180-ZG120B 的 pin 16)9

Left Header(左侧排针)

编号规则:左上角为 1,右上角为 2,依此类推。

描述引脚(左)引脚(右)描述
NC(E180-ZG120B 的 pin 24)12SWCLK
SWDIO34PB14
PB1556NC(E180-ZG120B 的 pin 29)
PF378NC(E180-ZG120B 的 pin 31)
NC(E180-ZG120B 的 pin 32)910NC(E180-ZG120B 的 pin 33)
NC(E180-ZG120B 的 pin 34)1112NC(E180-ZG120B 的 pin 35)
GND1314Reset

从映射表可以看出:左侧排针的 2/3 号引脚(SWCLK / SWDIO)是烧录与调试的关键信号,配合第 13 脚 GND 即可接入外部 SWD 调试器。

外设映射(Peripheral Mapping)

外设编号硬件引脚说明
ADC0ADC0CHAN0:内部温度传感器引脚固定,不支持 14/16-bit 分辨率
RTT-RTCC1 Hz 间隔,RTT 与 RTC 二选一(见下文)
RTC-RTCC1 Hz 间隔,RTC 与 RTT 二选一(见下文)
Timer0TIMER0 + TIMER1TIMER0 用作预分频器(必须相邻)
1LETIMER0
UART0USART0RX: PA1, TX: PA0默认 STDIO 输出

这些定义在 include/periph_conf.h 中有对应实现:

  • Timertimer_config[]的第一项使用TIMER0作为.prescalerTIMER1作为.timer级联(cascade)模式,提供 3 个通道,中断为TIMER1_IRQn(对应isr_timer1);第二项使用低功耗定时器LETIMER0,提供 2 个通道(isr_letimer0)。
  • UARTuart_config[]定义了USART0rx_pin = GPIO_PIN(PA, 1)tx_pin = GPIO_PIN(PA, 0),位置选择为USART_ROUTELOC0_RXLOC_LOC0 | USART_ROUTELOC0_TXLOC_LOC0,作为默认 STDIO 输出。
  • ADCadc_channel_config[]包含两个通道:adcPosSelTEMP(内部温度,参考adcRef1V25)与adcPosSelAVDD(电源电压,参考adcRef5V),对应文档中"CHAN0 为内部温度"的描述。

ztimer 配置

include/board.h 中还给出了 ztimer 的板级配置:默认使用TIMER_DEV(0)(TIMER1 级联链)以250 kHz运行以提升精度,CONFIG_ZTIMER_USEC_WIDTH为 16-bit,ztimer_set/ztimer_sleep的开销补偿均为 24;若启用CONFIG_EFM32_ZTIMER_USE_LETIMER,则改用TIMER_DEV(1)(LETIMER0)以32.768 kHz运行,开销补偿调整为 37。

用户界面(User Interface)

外设编号映射引脚说明
Button0PB0_PINPD15模式切换(Mode Change)
1PB1_PINPD13Touch Link
2PB2_PINPB11波特率复位(Baud Rate Reset)
LED0LED0_PINPF2GPIO2 LED
1LED1_PINPF3Link LED

第四个带有中文描述的按钮是复位按钮(Reset)

对应源码定义在 include/board.h:

#define PB0_PIN GPIO_PIN(PD, 15) #define PB1_PIN GPIO_PIN(PD, 13) #define PB2_PIN GPIO_PIN(PB, 11) #define LED0_PIN GPIO_PIN(PF, 2) #define LED1_PIN GPIO_PIN(PF, 3)

并提供了 LED 控制宏LED0_ON/LED0_OFF/LED0_TOGGLELED1_ON/LED1_OFF/LED1_TOGGLE(内部基于gpio_set/gpio_clear/gpio_toggle)。board.c 中的board_init()(非 RIOTBOOT 场景)会初始化三个按钮引脚为输入。此外 include/gpio_params.h 将 LED0、LED1 及三个按钮注册为 SAUL GPIO,其中按钮配置为GPIO_IN_PU(上拉输入)并带SAUL_GPIO_INVERTED反转标志——即按下时读取到低电平、逻辑上视为"激活"。

实现状态(Implementation Status)

设备ID支持情况说明
MCUEFR32MG1B支持支持电源模式
底层驱动ADC支持
Flash支持
GPIO支持中断在引脚间共享(参见参考手册)
I2C支持
PWM支持
RTCC支持作为 RTT 或 RTC 使用
SPI支持仅主机模式
Timer支持
UART支持USART 与 SPI 共享;LEUART 波特率受限(见下文)
USB不支持

这一状态与 Makefile.features 中FEATURES_PROVIDED声明的periph_adc / periph_rtc / periph_rtt / periph_timer / periph_uart一一对应,并额外提供了efm32_coretemp(板载核内温度传感器,见 board.h 中CORETEMP_ADC = ADC_LINE(0))与riotboot特性。依赖saul_default时会自动追加efm32_coretempsaul_gpio模块(见 Makefile.dep)。

板级配置

时钟选择(Clock Selection)

EFR32MG1B 为不同外设提供了多种时钟源。建议先阅读 Silicon Labs 应用笔记 AN0004.1 熟悉 CMU 时钟树。可用时钟源如下:

时钟源是否内部频率说明
HFRCO19 MHz启动期间使能,可更改
HFXO38.4 MHz
LFRCO32.768 kHz
LFXO32.768 kHz
ULFRCO1 kHz作为时间源不太可靠

这些时钟源可用于驱动以下时钟分支:

分支可用源说明
HFHFRCO, HFXO内核与外设
LFALFRCO, LFXO低功耗定时器
LFBLFRCO, LFXO, CORELEDIV2低功耗 UART
LFELFRCO, LFXO实时时钟与日历(RTCC)

CORELEDIV2是一个依赖内核时钟源的分频源,会被除以 2 或 4 以确保不超过最高时钟频率(由 EMLIB 自动处理)。

板级默认时钟在 include/periph_conf.h 中定义:

#ifndef CLOCK_HF #define CLOCK_HF cmuSelect_HFXO #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

即默认 HF 分支走HFXO(38.4 MHz),低功耗分支均走内部LFRCO。由于#ifndef的保护,这些宏可以在编译期被覆盖。

关键实践要点:代码必须知道实际时钟频率才能正确计算波特率等参数。如果板上 HFXO 或 LFXO 与上表频率不同,务必在编译时传入:

EFM32_HFXO_FREQ=freq_in_hz EFM32_LFXO_FREQ=freq_in_hz

同时,可以通过向编译器定义中添加CLOCK_LFA=source覆盖分支时钟源,例如:

CLOCK_LFA=cmuSelect_LFRCO

需要强调的是,上表中的频率是针对本开发板的特定值

低功耗外设(Low-power Peripherals)

LEUART 可以用低速时钟提供低功耗 UART。当 LFB 分支时钟源为LFRCO 或 LFXO时,LEUART 在EM2低功耗模式下仍可工作,但波特率被限制为 9600。如果需要更高波特率,应将 LFB 时钟源设为CORELEDIV2

注意:此设置不会影响板级定义中的外设映射,请确保不要在低功耗场景下引用任何低功耗外设之外的资源。

RTC 还是 RTT

RIOT-OS 同时支持Real-Time Ticker(RTT)与Real-Time Clock(RTC)。但本板 MCU 家族提供的 RTCC(32-bit 实时时钟与日历)只能配置为ticker 模式日历模式中的一种,因此RTT 与 RTC 同一时刻只能启用其一

RTCC 以1 Hz 间隔配置时,约136 年才会溢出一次,非常适合长时间计时的低功耗应用。

使用 EMLIB

该移植使用 Silicon Labs 的EMLIB抽象外设寄存器。虽然会有一定开销,但它能保证外设被正确初始化、提供芯片勘误(errata)处理并简化开发。确切开销取决于应用与外设的使用方式,但最大开销出现在外设初始化阶段;大量 read/write/get/set 方法以 inline 函数或宏实现(零开销)。

EMLIB 的另一个优势是内置断言(assertions),可确保外设被正确使用。启用方式是在编译器定义中加入:

DEBUG_EFM

EMLIB 由 Silicon Labs 以 zlib 风格许可证发布,允许源码分发。

引脚位置(Pin Locations)

EFM32 平台支持将外设映射到不同的引脚(预定义位置)。periph_conf.h中的定义主要由位置号(location number)实际引脚组成:实际引脚用于通过 GPIO 驱动配置引脚,位置号用于将外设映射到这些引脚——两者必须匹配(参见数据手册)。本 MCU 支持扩展引脚映射,外设的每个引脚都可单独连接到该外设的某个预定义引脚。

这一点在 include/periph_conf.h 的 UART 配置中体现得很直观:USART_ROUTELOC0_RXLOC_LOC0 | USART_ROUTELOC0_TXLOC_LOC0即为位置号定义,而GPIO_PIN(PA, 1)/GPIO_PIN(PA, 0)为实际引脚定义,两者共同完成 USART0 在 PA0/PA1 上的映射。

烧录与调试

该板没有板载编程器/调试器,也没有 bootloader,因此需要外部 SWD 编程器/调试器,例如 SEGGER J-Link 或 ST-Link。至少需要连接SWDIO、SWCLK 和 GND到编程器(对应左侧排针的 3、2、13 号引脚)。

烧录工具的选择逻辑在 Makefile.include 中实现:

JLINK_DEVICE = EFR32MG1BxxxF256 JLINK_PRE_FLASH += r OPENOCD_DEBUG_ADAPTER ?= stlink JLINK ?= JLinkExe ifneq (,$(shell command -v $(JLINK) 2>/dev/null)) PROGRAMMER ?= jlink else PROGRAMMER ?= openocd endif PROGRAMMERS_SUPPORTED += bmp openocd

即:如果$PATH中存在JLinkExe,默认使用jlink烧录,否则默认使用openocd;OpenOCD 场景下OPENOCD_DEBUG_ADAPTER默认为stlink,使用其他调试硬件时需另行指定。此外还支持BMP(Black Magic Probe)作为编程器。

OpenOCD 烧录提示:使用 OpenOCD 烧录时,保持 NRESET 引脚悬空。其配置仅执行软复位(soft reset),以规避硬件复位信号附着时的问题。

烧录命令:

BOARD=e180-zg120b-tb make flash

启动 GDB 调试器:

BOARD=e180-zg120b-tb make debug

或连接自定义调试器:

BOARD=e180-zg120b-tb make debug-server

部分板支持(有限度的)模拟运行,可执行:

BOARD=e180-zg120b-tb make emulate

小结

Ebyte E180-ZG120B-TB 是 RIOT-OS 对 EFM32 Mighty Gecko 1B(EFR32MG1B232F256GM32)低功耗无线 MCU 的典型板级参考实现。理解它的关键在于三件事:一是以 doc.md 的引脚映射为准(丝印不可靠);二是掌握 HFXO/LFRCO 构成的时钟树以及CLOCK_*/EFM32_*_FREQ编译期覆盖机制;三是牢记 RTCC 只能二选一提供 RTT 或 RTC、LEUART 低功耗模式下波特率上限 9600 的限制。结合 periph_conf.h、board.h 与 Makefile.include,开发者即可快速上手该板的低功耗应用开发,并通过外部 SWD 调试器完成烧录与调试。

【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询