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):
| 项目 | 规格 |
|---|---|
| MCU | EFR32MG1B232F256GM32 |
| 家族 | ARM Cortex-M4F |
| 系列 | Series 1 |
| 厂商 | Silicon Labs |
| 厂商系列 | EFM32 Mighty Gecko 1B |
| RAM | 32.0 KiB(其中 1.0 KiB 保留给 radio blob) |
| Flash | 256.0 KiB |
| EEPROM | 无 |
| 主频 | 最高 38.4 MHz |
| FPU / MPU | 支持 / 支持 |
| DMA | 8 通道 |
| 定时器 | 2× 16-bit + 1× 16-bit(低功耗) |
| ADC | 12-bit ADC |
| UART | 2× USART + 1× LEUART |
| SPI | 2× USART 复用 |
| I2C | 1× |
| 工作电压 | 1.85 V – 3.8 V |
从 Kconfig 可以看到,板卡符号BOARD_E180_ZG120B_TB直接select CPU_MODEL_EFR32MG1B232F256GM32,确认了该型号在 RIOT CPU 模型体系中的对应关系;Makefile.features 中同样声明CPU = efm32、CPU_FAM = efr32mg1b、CPU_MODEL = efr32mg1b232f256gm32。
引脚映射(Pin Mapping)
重要注意事项
- 至少在
10199-V1.0修订版的测试板上,大部分丝印标签是错误的,实际连接以本文档的映射表为准。 - 以下所有描述均假设板子方向为 USB 连接器朝上。
Right Header(右侧排针)
编号规则:左上角为 1,右上角为 2,依此类推。
| 描述 | 引脚(左) | 引脚(右) | 描述 |
|---|---|---|---|
| GND | 1 | 2 | VCC |
| PB13 | 3 | 4 | PB12 |
| PB11 | 5 | 6 | PD15 |
| NC(E180-ZG120B 的 pin 8) | 7 | 8 | NC(E180-ZG120B 的 pin 7) |
| PA1 | 9 | 10 | PA0 |
| PD14 | 11 | 12 | PD13 |
| GND | 13 | 14 | GND |
Top Header(顶部排针)
编号规则:最左侧为 1,从左到右递增。
| 描述 | 引脚(从左到右) |
|---|---|
| NC(E180-ZG120B 的 pin 23) | 1 |
| NC(E180-ZG120B 的 pin 22) | 2 |
| PC11 | 3 |
| NC(E180-ZG120B 的 pin 20) | 4 |
| PF2 | 5 |
| PC10 | 6 |
| 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) | 1 | 2 | SWCLK |
| SWDIO | 3 | 4 | PB14 |
| PB15 | 5 | 6 | NC(E180-ZG120B 的 pin 29) |
| PF3 | 7 | 8 | NC(E180-ZG120B 的 pin 31) |
| NC(E180-ZG120B 的 pin 32) | 9 | 10 | NC(E180-ZG120B 的 pin 33) |
| NC(E180-ZG120B 的 pin 34) | 11 | 12 | NC(E180-ZG120B 的 pin 35) |
| GND | 13 | 14 | Reset |
从映射表可以看出:左侧排针的 2/3 号引脚(SWCLK / SWDIO)是烧录与调试的关键信号,配合第 13 脚 GND 即可接入外部 SWD 调试器。
外设映射(Peripheral Mapping)
| 外设 | 编号 | 硬件 | 引脚 | 说明 |
|---|---|---|---|---|
| ADC | 0 | ADC0 | CHAN0:内部温度传感器 | 引脚固定,不支持 14/16-bit 分辨率 |
| RTT | - | RTCC | 1 Hz 间隔,RTT 与 RTC 二选一(见下文) | |
| RTC | - | RTCC | 1 Hz 间隔,RTC 与 RTT 二选一(见下文) | |
| Timer | 0 | TIMER0 + TIMER1 | TIMER0 用作预分频器(必须相邻) | |
| 1 | LETIMER0 | |||
| UART | 0 | USART0 | RX: PA1, TX: PA0 | 默认 STDIO 输出 |
这些定义在 include/periph_conf.h 中有对应实现:
- Timer:
timer_config[]的第一项使用TIMER0作为.prescaler、TIMER1作为.timer的级联(cascade)模式,提供 3 个通道,中断为TIMER1_IRQn(对应isr_timer1);第二项使用低功耗定时器LETIMER0,提供 2 个通道(isr_letimer0)。 - UART:
uart_config[]定义了USART0,rx_pin = GPIO_PIN(PA, 1)、tx_pin = GPIO_PIN(PA, 0),位置选择为USART_ROUTELOC0_RXLOC_LOC0 | USART_ROUTELOC0_TXLOC_LOC0,作为默认 STDIO 输出。 - ADC:
adc_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)
| 外设 | 编号 | 映射 | 引脚 | 说明 |
|---|---|---|---|---|
| Button | 0 | PB0_PIN | PD15 | 模式切换(Mode Change) |
| 1 | PB1_PIN | PD13 | Touch Link | |
| 2 | PB2_PIN | PB11 | 波特率复位(Baud Rate Reset) | |
| LED | 0 | LED0_PIN | PF2 | GPIO2 LED |
| 1 | LED1_PIN | PF3 | Link 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_TOGGLE与LED1_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 | 支持情况 | 说明 |
|---|---|---|---|
| MCU | EFR32MG1B | 支持 | 支持电源模式 |
| 底层驱动 | 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_coretemp与saul_gpio模块(见 Makefile.dep)。
板级配置
时钟选择(Clock Selection)
EFR32MG1B 为不同外设提供了多种时钟源。建议先阅读 Silicon Labs 应用笔记 AN0004.1 熟悉 CMU 时钟树。可用时钟源如下:
| 时钟源 | 是否内部 | 频率 | 说明 |
|---|---|---|---|
| HFRCO | 是 | 19 MHz | 启动期间使能,可更改 |
| HFXO | 否 | 38.4 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 自动处理)。
板级默认时钟在 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_EFMEMLIB 由 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),仅供参考