ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

RIOT OS SLWSTK6220A 启动套件详解:EZR32WG 低功耗开发、板级配置与烧录调试实践

RIOT OS SLWSTK6220A 启动套件详解:EZR32WG 低功耗开发、板级配置与烧录调试实践 RIOT OS SLWSTK6220A 启动套件详解EZR32WG 低功耗开发、板级配置与烧录调试实践【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT本文基于 RIOT 仓库中 boards/slwstk6220a/doc.md 板卡文档展开系统介绍 Silicon Labs SLWSTK6220A 启动套件EZR32WG 无线开发板在 RIOT-OS 中的硬件资源、外设映射、时钟与低功耗配置要点以及烧录/调试命令。读完后你将掌握如何在这块以超低功耗见长的 48 MHz Cortex-M4F 平台上配置时钟源、使能/禁用板载控制器与能量监视器模块并借助 board.h、periph_conf.h 等板级源码验证文档中的每一条映射。板卡概览SLWSTK6220A 是 Silicon Labs 推出的 EZR32WG 868MHz 无线启动套件核心 MCU 为 EFM32 系列专为低功耗应用设计具备节能外设、多种能量模式Energy Mode以及极短的唤醒时间。该开发板还集成了一片Advanced Energy MonitorAEM高级能量监视器可以实时测量硬件与代码的功耗实现代码级code-level能耗分析——这是它区别于普通评估板的关键能力。MCU 规格项目参数MCUEZR32WG330F256R60内核家族ARM Cortex-M4F系列Series 0厂商Silicon Labs厂商家族EZR32 Wonder GeckoRAM32.0 KiBFlash256.0 KiBEEPROM无主频最高 48 MHzFPU有MPU有DMA12 通道定时器3x 16-bit 1x 16-bit低功耗ADC/DAC12-bit ADC、12-bit DACUART2x UART、3x USART、2x LEUARTSPI3x USARTI2C2x供电 Vcc1.98 V - 3.8 V原理图需通过 Silicon Labs Simplicity Studio 下载MCU 数据手册EZR32WG330_DataSheet与参考手册EZR32LG-RM以及板卡手册UG200 BRD4502C均可在 Silicon Labs 官网获取此处不再列外链。扩展排针引脚定义Pinout以下为板右侧扩展排针的引脚定义。当排针水平朝向你时PIN 1 是左下角的触点PINPIN3V32019RES5V1817RESPD61615PD7PD51413PF13PD41211PB11PD3109PE1PD287PE0PD165PC7PD043PC6VMCU21GND注意Silicon Labs 各启动套件的排针引脚定义并不完全相同移植代码时务必以对应板卡文档为准部分引脚在板载控制器Board Controller使能时被其占用。外设映射Peripheral Mapping外设编号硬件引脚备注ADC0ADC0CHAN0: 片内温度端口固定不支持 14/16-bit 分辨率DAC0DAC0CHAN0: PB11端口固定与 I2C 共用I2C0I2C0SDA: PE0, SCL: PE1I2C_SPEED_LOW与I2C_SPEED_HIGH的实际时钟速率有偏差PWM0TIMER0CHAN0: PF6, CHAN1: PF7映射到 LED0 和 LED1RTT-RTCRTT 与 RTC 二选一见下文RTC-RTCRTC 或 RTT 二选一见下文SPI0USART1MOSI: PD0, MISO: PD1, CLK: PD2Timer0TIMER1 TIMER2TIMER1 作预分频器必须相邻1LETIMER0UART0UART0RX: PE1, TX: PE0STDIO 输出1LEUART0RX: PD5, TX: PD4波特率受限见下文从 periph_conf.h 可以看到 RIOT 对该映射的具体落实I2C配置为I2C1设备SDA/SCL 为 PE0/PE1路由位置I2C_ROUTE_LOCATION_LOC2速率I2C_SPEED_NORMAL并显式启用内部上拉use_internal_pull_ups true——这解释了板上 SDA/SCL 无需外部上拉电阻的设计。SPIUSART1设备MOSI/MISO/CLK 为 PD0/PD1/PD2路由USART_ROUTE_LOCATION_LOC1与文档一致。PWMTIMER0设备两通道引脚 PF6/PF7路由 LOC2正好对应板上两颗 LEDPF6LED0、PF7LED1因此 PWM 与 LED 共享引脚。Timer 0TIMER2计时 TIMER1预分频的级联cascade结构3 个通道Timer 1低功耗LETIMER02 个通道。UARTUART_DEV(0)由USART2承担RX: PB4, TX: PB3UART_DEV(1)由LEUART0承担RX: PD5, TX: PD4。从源码结构看RIOT 将板载控制器使用的 STDIO 串口分配给了USART2而文档表格中的 “UART0: PE0/PE1” 描述的是芯片级 UART0 硬件的引脚两者属于不同层次的路由选择以periph_conf.h的实际配置为准。用户接口按钮与 LED外设编号宏定义引脚备注Button0PB0_PINPE31PB1_PINPE2LED0LED0_PINPF6黄色 LED1LED1_PINPF7黄色 LED以上定义均可在 board.h 中找到其中还封装了便捷的LED0_ON/LED0_OFF/LED0_TOGGLEgpio_set/gpio_clear/gpio_toggle宏应用可直接调用。板上其他资源board.h中还定义了以下板级资源核温传感器CORETEMP_ADC ADC_LINE(0)即 ADC 第 0 通道片内温度输入低功耗存储 LCDSharp LS013B7DH03DISP_SPI SPI_DEV(0)COM 引脚 PE10、CS 引脚 PE11、片选DISP_SELECT_PIN PA8、电源DISP_POWER_PIN PA10温湿度传感器 Si7021挂在I2C_DEV(0)上使能引脚SI7021_EN_PIN PF8板载控制器使能脚BC_PIN PA12。功能实现状态设备ID支持备注MCUEZR32WG是支持能量模式Power modes底层驱动ADC是DAC是Flash是GPIO是中断在引脚间共享见参考手册I2C是PWM是RTC是以 RTT 或 RTC 方式提供SPI是仅主模式Timer是UART是USART 与 SPI 共享LEUART 波特率受限USB否LCD 驱动LS013B7DH03是通过 U8g2 包驱动 Sharp 低功耗存储 LCD温湿度传感器Si7021是Silicon Labs 温湿度传感器其中 SAUL 传感器接口的默认配置可以在 Makefile.dep 中看到启用saul_default时自动引入efm32_coretemp、saul_gpio和si7021模块同时该文件无条件加入boards_common_silabs、silabs_aem、silabs_bc三个公共模块这正是下文“板载控制器默认使能、AEM 默认使能”两个结论的构建系统证据。板级配置要点板载控制器Board Controller该启动套件带有一个 Board Controller它提供一个虚拟串口并通过一个 GPIO 引脚使能。默认使能。可通过make DISABLE_MODULEsilabs_bc关闭该模块。使用虚拟串口前请确保已安装最新版板载控制器固件。板载控制器固定将虚拟串口配置为115200 波特率、8 位数据、无校验、1 位停止位MCU 侧必须使用相同参数。这一约束在驱动源码 boards/common/silabs/drivers/bc/bc.c 中有硬性保障#if ((STDIO_UART_DEV) ! (UART_DEV(0))) #error The BC requires UART_DEV(0). #endif #if ((STDIO_UART_BAUDRATE) ! 115200) #error The BC requires a baud rate of 115200. #endif即 STDIO 必须落在UART_DEV(0)上且波特率必须为 115200否则编译直接报错bc_init()随后将BC_PIN本板为 PA12配置为输出并置高以激活板载控制器。另外低功耗 LCD 在DISP_SELECTED引脚PA8为低时会被板载控制器占用。该引脚不由板级初始化代码处理如果你想在应用中控制这块 LCD必须自行初始化该引脚。高级能量监视器Advanced Energy Monitor开发板上的 AEM 可接入 Simplicity Studio 开发软件测量能耗并与代码关联实现代码级功耗分析板载控制器负责测量能耗为了实时关联代码驱动会配置CoreDebug外设通过SWO端口输出 MCU 寄存器与中断数据PC/IRQ 采样。默认使能可通过make DISABLE_MODULEsilabs_aem关闭。其初始化逻辑见 boards/common/silabs/drivers/aem/aem.cvoid aem_init(void) { /* do not initialize if debugger is not connected */ if (!DBG_Connected()) { return; } /* enable GPIO clock for configuring SWO pins */ ... /* enable PC and IRQ sampling output */ DWT-CTRL AEM_DWT_CTRL; /* set TPIU prescaler to 16 */ TPI-ACPR AEM_TPI_ACPR; ... }从源码可见未连接调试器时aem_init()直接返回零开销连接后依次开启 SWO 路由、CoreDebug 的TRCENA、DWT 的 PC/IRQ 采样并将 TPIU 预分频设为 16、协议设为 NRZ。注意Simplicity Studio 关联代码需要调试符号。RIOT 默认使用 GDB 调试符号而 Simplicity Studio 要求DWARF-2调试符号GCC 参数-gdwarf-2使用 AEM 时需据此调整编译参数。时钟选择各外设可选的时钟源如下。建议先阅读 Silicon Labs 应用笔记AN0004.0EFM32 CMU了解时钟系统。时钟源源内部速率备注HFRCO是14 MHz启动时使能可修改HFXO否48 MHzLFRCO是32.768 kHzLFXO否32.768 kHzULFRCO否1 kHz作为时间源不够可靠时钟分支Branch可选的源分支可用源备注HFHFRCO, HFXO内核与外设LFALFRCO, LFXO低功耗定时器LFBLFRCO, LFXO, CORELEDIV2低功耗 UARTCORELEDIV2是一个派生源取决于为内核供电的时钟源并做 2 或 4 分频以避免超过最大时钟频率由 EMLIB 的 EML 机制自动处理。上表速率针对本启动套件。时钟频率必须对代码已知才能保证速率与波特率计算正确。若你的 HFXO/LFXO 与上表不同请在编译时传入EFM32_HFXO_FREQfreq_in_hz与EFM32_LFXO_FREQfreq_in_hz。分支时钟源可以覆盖例如添加编译定义CLOCK_LFAcmuSelect_LFRCO。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_LFXO #endif #ifndef CLOCK_LFB #define CLOCK_LFB cmuSelect_LFXO #endif即默认HF 走 HFXO48 MHz 晶振、核心不分频、LFA/LFB 走 LFXO外部 32.768 kHz 晶振。所有宏均带#ifndef保护允许通过编译定义覆盖。低功耗外设与 LEUART 波特率限制低功耗 UARTLEUART可以使用低速时钟工作。当 LFB 时钟源为 LFRCO 或 LFXO 时LEUART 在EM2能量模式下仍可用但波特率被限制在 9600。若需要更高速率应把 LFB 时钟源切到CORELEDIV2。注意此设置不会影响板级定义中的外设映射请确保应用不要引用这些受限的低功耗外设。RTC 还是 RTTRIOT-OS 同时支持Real-Time TickerRTT和Real-Time ClockRTC。但该 MCU 家族的硬件只有一个 24-bitReal-Time Counter本质上只是 ticker。RIOT 提供了 ticker-to-calendar 兼容层代价是额外代码体积时间戳与时钟结构之间的互相转换。按 1 Hz 间隔配置时RTC 每194 天溢出一次使用 ticker-to-calendar 模式时该周期被人为延长。因此在该板上RIOT 通常以 RTT 方式提供计时periph_conf.h中RTT_FREQUENCY默认 1 Hz需要日历时间的模块再走兼容层。与之配套的是 ztimer 配置见 board.h默认使用TIMER_DEV(0)、基准 250 kHz更高精度若开启CONFIG_EFM32_ZTIMER_USE_LETIMER则改用TIMER_DEV(1)LETIMER0、基准 32.768 kHz两种模式下ztimer_set/ztimer_sleep的指令开销补偿值24/28 或 37 周期也做了区分。EMLIB 的使用本移植使用 Silicon Labs 的EMLIB对寄存器访问做抽象有一定开销但保证设备被正确初始化、内置芯片勘误errata处理并简化开发最大开销出现在外设配置阶段大量 read/write/get/set 方法以 inline 或宏实现无运行时代价EMLIB 附带断言assertions可确保外设被正确使用。传入编译定义DEBUG_EFM即可启用EMLIB 采用 zlib 风格许可证Silicon Labs 授权允许源码分发。引脚位置Pin LocationsEFM32 平台支持将外设映射到不同引脚预定义 location。periph_conf.h中的定义通常由两部分组成location 编号与实际引脚。实际引脚用于 GPIO 驱动配置location 用于把外设路由到这些引脚——两者必须匹配详见数据手册中的路由表。板级初始化源码解析板级代码量很小全部逻辑集中在 board.cvoid board_init(void) { #ifndef RIOTBOOT /* perform common board initialization */ board_common_init(); #ifdef MODULE_SI7021 /* initialize the Si7021 sensor */ gpio_init(SI7021_EN_PIN, GPIO_OUT); gpio_set(SI7021_EN_PIN); #endif #endif }board_common_init()来自公共层 boards/common/silabs/board_common.c内部调用bc_init()与aem_init()分别处理板载控制器与 AEM若链接了si7021驱动模块则将传感器使能脚SI7021_EN_PINPF8拉高上电处于RIOTBOOTbootloader编译时整体跳过保持最小化。boards/slwstk6220a/Makefile 只有一行关键内容DIRS $(RIOTBOARD)/common/silabs说明本板复用了 Silicon Labs 公共板级层而模块依赖、SAUL 默认传感器组合则声明在 Makefile.dep 中符合 RIOT 的模块依赖惯例。编译、烧录与调试烧录需要SEGGER J-Link调试器。RIOT 支持的命令如下# 烧录 BOARDslwstk6220a make flash # 启动 GDB 调试 BOARDslwstk6220a make debug # 仅启动调试服务器连接自己的调试器 BOARDslwstk6220a make debug-server # 部分板卡支持有限的模拟运行 BOARDslwstk6220a make emulate结合前文常用构建组合示例# 关闭板载控制器需要 PE0/PE1、PA12 等引脚给应用使用 BOARDslwstk6220a make flash DISABLE_MODULEsilabs_bc # 关闭 AEM不连接 Simplicity Studio 做功耗分析时 BOARDslwstk6220a make flash DISABLE_MODULEsilabs_aem # 使用 HFXO/LFXO 非默认频率时 BOARDslwstk6220a make CFLAGS-DEFM32_HFXO_FREQ48000000 -DEFM32_LFXO_FREQ32768 # 覆盖 LFA 时钟源 BOARDslwstk6220a make CFLAGS-DCLOCK_LFAcmuSelect_LFRCO # 启用 EMLIB 断言 BOARDslwstk6220a make CFLAGS-DDEBUG_EFM小结SLWSTK6220A 在 RIOT 中的移植围绕“低功耗”这一主线展开默认时钟配置使用 HFXO LFXO 以获得 48 MHz 高性能与 32.768 kHz 精准低频源LEUART 可在 EM2 下以 9600 波特率继续通信RTC/RTT 由 24-bit RTC 计数器 ticker-to-calendar 兼容层折中实现。工程化层面板载控制器虚拟串口与 AEM代码级能耗分析均以独立模块silabs_bc/silabs_aem提供、默认使能且可一键禁用其强制约束STDIO 必须为 UART0 115200、DWARF-2 符号在源码中以编译期断言和调试器连接检测实现。所有映射关系均可在 boards/slwstk6220a/include/periph_conf.h、boards/slwstk6220a/include/board.h 与公共层 boards/common/silabs/ 中逐项核验。【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表