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.hSAUL GPIO 参数board.cboard_init()初始化Kconfig板级 Kconfig 配置Makefile.include / Makefile.features烧录工具选择与特性声明硬件规格MCU板载 MCU 为EFR32MG1B232F256GM32关键参数如下数据来源于 doc.md项目规格MCUEFR32MG1B232F256GM32家族ARM Cortex-M4F系列Series 1厂商Silicon Labs厂商系列EFM32 Mighty Gecko 1BRAM32.0 KiB其中 1.0 KiB 保留给 radio blobFlash256.0 KiBEEPROM无主频最高 38.4 MHzFPU / MPU支持 / 支持DMA8 通道定时器2× 16-bit 1× 16-bit低功耗ADC12-bit ADCUART2× USART 1× LEUARTSPI2× USART 复用I2C1×工作电压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依此类推。描述引脚左引脚右描述GND12VCCPB1334PB12PB1156PD15NCE180-ZG120B 的 pin 878NCE180-ZG120B 的 pin 7PA1910PA0PD141112PD13GND1314GNDTop Header顶部排针编号规则最左侧为 1从左到右递增。描述引脚从左到右NCE180-ZG120B 的 pin 231NCE180-ZG120B 的 pin 222PC113NCE180-ZG120B 的 pin 204PF25PC106NCE180-ZG120B 的 pin 177NCE180-ZG120B 的 pin 168NCE180-ZG120B 的 pin 169Left Header左侧排针编号规则左上角为 1右上角为 2依此类推。描述引脚左引脚右描述NCE180-ZG120B 的 pin 2412SWCLKSWDIO34PB14PB1556NCE180-ZG120B 的 pin 29PF378NCE180-ZG120B 的 pin 31NCE180-ZG120B 的 pin 32910NCE180-ZG120B 的 pin 33NCE180-ZG120B 的 pin 341112NCE180-ZG120B 的 pin 35GND1314Reset从映射表可以看出左侧排针的 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 用作预分频器必须相邻1LETIMER0UART0USART0RX: PA1, TX: PA0默认 STDIO 输出这些定义在 include/periph_conf.h 中有对应实现Timertimer_config[]的第一项使用TIMER0作为.prescaler、TIMER1作为.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-bitztimer_set/ztimer_sleep的开销补偿均为 24若启用CONFIG_EFM32_ZTIMER_USE_LETIMER则改用TIMER_DEV(1)LETIMER0以32.768 kHz运行开销补偿调整为 37。用户界面User Interface外设编号映射引脚说明Button0PB0_PINPD15模式切换Mode Change1PB1_PINPD13Touch Link2PB2_PINPB11波特率复位Baud Rate ResetLED0LED0_PINPF2GPIO2 LED1LED1_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_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支持情况说明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_coretemp与saul_gpio模块见 Makefile.dep。板级配置时钟选择Clock SelectionEFR32MG1B 为不同外设提供了多种时钟源。建议先阅读 Silicon Labs 应用笔记 AN0004.1 熟悉 CMU 时钟树。可用时钟源如下时钟源是否内部频率说明HFRCO是19 MHz启动期间使能可更改HFXO否38.4 MHzLFRCO是32.768 kHzLFXO否32.768 kHzULFRCO否1 kHz作为时间源不太可靠这些时钟源可用于驱动以下时钟分支分支可用源说明HFHFRCO, HFXO内核与外设LFALFRCO, LFXO低功耗定时器LFBLFRCO, LFXO, CORELEDIV2低功耗 UARTLFELFRCO, LFXO实时时钟与日历RTCCCORELEDIV2是一个依赖内核时钟源的分频源会被除以 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 分支走HFXO38.4 MHz低功耗分支均走内部LFRCO。由于#ifndef的保护这些宏可以在编译期被覆盖。关键实践要点代码必须知道实际时钟频率才能正确计算波特率等参数。如果板上 HFXO 或 LFXO 与上表频率不同务必在编译时传入EFM32_HFXO_FREQfreq_in_hz EFM32_LFXO_FREQfreq_in_hz同时可以通过向编译器定义中添加CLOCK_LFAsource覆盖分支时钟源例如CLOCK_LFAcmuSelect_LFRCO需要强调的是上表中的频率是针对本开发板的特定值。低功耗外设Low-power PeripheralsLEUART 可以用低速时钟提供低功耗 UART。当 LFB 分支时钟源为LFRCO 或 LFXO时LEUART 在EM2低功耗模式下仍可工作但波特率被限制为 9600。如果需要更高波特率应将 LFB 时钟源设为CORELEDIV2。注意此设置不会影响板级定义中的外设映射请确保不要在低功耗场景下引用任何低功耗外设之外的资源。RTC 还是 RTTRIOT-OS 同时支持Real-Time TickerRTT与Real-Time ClockRTC。但本板 MCU 家族提供的 RTCC32-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 LocationsEFM32 平台支持将外设映射到不同的引脚预定义位置。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烧录否则默认使用openocdOpenOCD 场景下OPENOCD_DEBUG_ADAPTER默认为stlink使用其他调试硬件时需另行指定。此外还支持BMPBlack Magic Probe作为编程器。OpenOCD 烧录提示使用 OpenOCD 烧录时保持 NRESET 引脚悬空。其配置仅执行软复位soft reset以规避硬件复位信号附着时的问题。烧录命令BOARDe180-zg120b-tb make flash启动 GDB 调试器BOARDe180-zg120b-tb make debug或连接自定义调试器BOARDe180-zg120b-tb make debug-server部分板支持有限度的模拟运行可执行BOARDe180-zg120b-tb make emulate小结Ebyte E180-ZG120B-TB 是 RIOT-OS 对 EFM32 Mighty Gecko 1BEFR32MG1B232F256GM32低功耗无线 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),仅供参考