ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

RIOT OS 中的 Silicon Labs EFM32/EFR32/EZR32 移植层解析:时钟、EMU/CMU 与低功耗外设配置指南

RIOT OS 中的 Silicon Labs EFM32/EFR32/EZR32 移植层解析:时钟、EMU/CMU 与低功耗外设配置指南 物联网嵌入式操作系统实时系统【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址https://gitcode.com/GitHub_Trending/riot/RIOT点击查看免费下载本文以 cpu/efm32/doc.md 为骨架深入讲解 RIOT OS 对 Silicon Labs EFM32/EFR32/EZR32 系列 Cortex-M MCU 的移植实现包括所支持的外设清单、内部 RC 振荡器与外部晶振HFXO/LFXO的时钟切换方式、EMU/CMU 初始化参数覆写方法以及通过EFM32_LEUART_ENABLED等变量裁剪低功耗外设以节省内存的具体做法。读完本文你将掌握如何在板级 Makefile 与periph_conf.h中为 EFM32 系板卡配置时钟源和能量管理参数并能从源码层面理解cpu_init()的完整启动链路。模块定位RIOT OS 中的 EFM32 CPU 移植层cpu/efm32目录是整个 RIOT OS 中对 Silicon Labs EFM32/EFR32/EZR32 MCU 系列的唯一实现位置。根据 doc.md 的定义该模块包含所有这些 MCU 的代码与定义并且底层外设驱动直接使用 Silicon Labs 的 Gecko SDKvendor 库。这一点在 Makefile.dep 中得到了印证模块编译时会自动通过USEPKG gecko_sdk引入 Gecko SDK 包。得益于 Gecko SDK 提供统一的em_*系列驱动 API如em_chip.h、em_cmu.h、em_emu.h、em_dbg.hRIOT 的移植层得以用一套代码覆盖多个硅片系列仅在系列差异处通过_SILICON_LABS_32B_SERIES宏做条件编译见 cpu.c。受支持的 MCU 家族原文档列出了以下受支持的家族每个家族在仓库中对应一个独立目录其中包含中断向量表vectors.c、家族信息数据库efm32-info.mk与 Kconfig 配置家族说明仓库目录EFM32GGGiant Geckofamilies/efm32ggEFM32HGHappy Geckofamilies/efm32hgEFM32LGLeopard Geckofamilies/efm32lgEFM32PG1BPearl Gecko 1families/efm32pg1bEFM32PG12BPearl Gecko 2families/efm32pg12bEFM32ZGZero Geckofamilies/efm32zgEFR32MG1BMighty Gecko 1families/efr32mg1bEFR32MG1PMighty Gecko 1families/efr32mg1pEFR32MG12PMighty Gecko 2families/efr32mg12pEZR32WGWonder Gecko带 Sub-GHz 射频families/ezr32wg从仓库实际内容看支持范围比文档列举的更广还包含 families/efm32gg11b、families/efm32gg12b、families/efm32tg11b 与 families/efr32zg23EFR32xG23Series 2。家族目录的加入由 Makefile 依据USEMODULE中的cpu_family模块名动态决定例如选择cpu_efm32gg即编译families/efm32gg。家族信息数据库efm32-info.mk每个家族下的 efm32-info.mk 是一份按 CPU 型号组织的只读数据库每行一个CPU_MODEL格式为系列号 - 内核架构 - Flash 基址 - Flash 大小 - SRAM 基址 - SRAM 大小 - Crypto? - TRNG? - Radio?efm32-info.mk 解析这些字段生成EFM32_SERIES、EFM32_ARCHITECTURE、EFM32_FLASH_START/SIZE、EFM32_SRAM_START/SIZE以及EFM32_CRYPTO、EFM32_TRNG、EFM32_RADIO等变量。这些变量随后被 Makefile.include 用于生成链接脚本的ROM_START_ADDR/ROM_LEN/RAM_START_ADDR/RAM_LEN直接决定固件的内存布局。以 EFM32GG 为例efm32gg940f1024对应的信息是0 cortex-m3 0x00000000 0x00100000 0x20000000 0x00020000 0 0 0即 Series 0、Cortex-M3、1 MiB Flash、128 KiB SRAM。支持的外围设备根据原文档该移植层支持以下外设具体取决于所用 MCU 型号仓库中每个外设都有对应的实现文件外设实现文件按系列拆分ADCadc_series01.c、adc_series2.cCPUIDcpuid.cDACdac.cEtherneteth.c 及驱动 drivers/eth/eth_netdev.cFlash pageflashpage.cGPIOgpio.c、gpio_ll.cHW RNGhwrng_series1.c、hwrng_series2.cPower Managementpm.cPWMpwm.cRTCrtc_series0.c、rtc_series1.cRTTrtt_series0.c、rtt_series1.cSPIspi.cTimertimer_series01.c、timer_series2.cUART含低功耗 LEUARTuart_series01.c、uart_series2.c外围驱动的编译开关位于 periph/Makefile系列差异通过EFM32_SERIES变量Series 0/1 与 Series 2区分例如 RTC/RTT/Timer/ADC/UART 都有 series01 与 series2 两套实现。此外还有两个 EFM32 专属驱动模块efm32_coretemp读取 MCU 内部温度传感器Series 0/1 通过 ADC 通道读取Series 2 有专用寄存器见 Makefile.dep 与 drivers/coretempefm32_eth以太网 netdev 驱动启用后会自动引入iolist、netdev_eth、netdev_new_api、ztimer_msec等模块并FEATURES_REQUIRED periph_eth periph_gpio见 Makefile.dep。时钟配置从内部 RC 到外部晶振原文档指出默认情况下 MCU 运行在内部 RC 振荡器HFRCO上若板上有外部晶振可通过设置CLOCK_HFcmuSelect_HFXO切换CLOCK_LFA、CLOCK_LFB、CLOCK_LFE同理使用cmuSelect_LFXO。未使用的内部 RC 振荡器会被关闭。源码层面的实现Series 0/1 的时钟初始化实现在 cpu.c 的clk_init()中流程如下若选择 HFXO先用板级参数CMU_HFXOINIT调用CMU_HFXOInit()完成初始化再CMU_ClockSelectSet(cmuClock_HF, CLOCK_HF)切换主时钟通过CMU_ClockDivSet(cmuClock_CORE, CLOCK_CORE_DIV)设置 CORE 分频若主时钟是 HFXO则调用CMU_OscillatorEnable(cmuOsc_HFRCO, false, false)关闭 HFRCO——这正是文档中未使用的内部 RC 振荡器将被禁用的出处对 LFA/LFBSeries 1 还有 LFE依次做 LFXO 预初始化与时钟源选择仅当 LFA、LFB、LFE 全部使用 LFXO 时关闭 LFRCOcpu.c。Series 2 的 clk_init() 走另一条路径振荡器初始化、预分频与时钟源选择分别由clk_div_config[]与clk_mux_config[]两个板级配置数组驱动通过CLK_DIV_NUMOF/CLK_MUX_NUMOF循环设置。这两个数组定义在板级periph_conf.h中比 Series 0/1 的单个宏更加灵活。一个值得注意的细节LFRCO 抖动与 LEUART在 Series 1 上clk_init()还做了一件事清除CMU-LFRCOCTRL中的ENCHOP与ENDEM位cpu.c。代码注释给出了原因否则 LFRCO 的抖动过大导致 LEUART 无法稳定工作在 1800 baud 以上。这解释了为何 UART 外设的低功耗模式需要特定的 LFRCO 配置配合。如何配置CLOCK_HF等宏定义在板级的periph_conf.h中EFM32 系列板卡均位于 boards/ 下典型做法是在板级 Makefile 或periph_conf.h中设定/* periph_conf.h 示例 */ #define CLOCK_HF cmuSelect_HFXO /* 使用外部高频晶振 */ #define CLOCK_LFA cmuSelect_LFXO /* 低功耗外设时钟使用外部低频晶振 */ #define CLOCK_LFB cmuSelect_LFXO #define CLOCK_LFE cmuSelect_LFXO选择外部晶振的前提是硬件上确实连接了对应晶振具体晶振参数起振电流、负载电容等通过后文所述的CMU_HFXOINIT/CMU_LFXOINIT描述。若不配置这些宏默认值即为内部 RC 振荡器。EMU 与 CMU 配置可覆写的默认参数原文档说明EMUEnergy Management Unit能量管理单元与 CMUClock Management Unit时钟管理单元使用 Gecko SDK 提供的默认值初始化开发者可以覆写以下宏宏含义CMU_HFXOINIT高频外部晶振初始化参数CMU_HFXOInit_TypeDefCMU_LFXOINIT低频外部晶振初始化参数CMU_LFXOInit_TypeDefEMU_DCDCINIT集成 DC-DC 稳压器初始化参数EMU_DCDCInit_TypeDefEMU_EM23INITEM2/EM3 低功耗模式参数EMU_EM23Init_TypeDefEMU_EM4INITEM4 关断模式参数EMU_EM4Init_TypeDef源码中的默认值cpu.c 为 EMU 相关宏提供了回退默认值全部指向 Gecko SDK 的*_DEFAULT常量#ifndef EMU_DCDCINIT #define EMU_DCDCINIT EMU_DCDCINIT_DEFAULT #endif #ifndef EMU_EM23INIT #define EMU_EM23INIT EMU_EM23INIT_DEFAULT #endif #ifndef EMU_EM4INIT #define EMU_EM4INIT EMU_EM4INIT_DEFAULT #endifCMU 的两个宏CMU_HFXOINIT、CMU_LFXOINIT同样在 cpu.c 中有*_DEFAULT回退且仅对_SILICON_LABS_32B_SERIES 2的型号生效Series 2 只在宏已定义时才调用CMU_HFXOInit()cpu.c。DC-DC 与电源模式初始化DC-DC当芯片带有集成稳压器DCDC_PRESENT且DCDC_COUNT 0时dcdc_init()会执行——若定义了EMU_DCDCINIT_OFF则直接EMU_DCDCPowerOff()关闭否则用EMU_DCDCINIT参数调用EMU_DCDCInit()cpu.c睡眠模式pm_init()使用EMU_EM23INIT初始化 EM2/EM3在 Series 1/2 上再以EMU_EM4INIT初始化 EM4cpu.c。另外若启用了DEVELHELP会调用DBG_EM2DebugEnable(true)让调试单元在 EM2 下保持工作方便开发期调试。完整的启动顺序以上初始化都在cpu_init()中按固定顺序执行cpu.cCHIP_Init()应用芯片 errata 修正RIOTBOOT 场景跳过cortexm_init()初始化 Cortex-M 内核dcdc_init()初始化 DC-DC如存在clk_init()初始化时钟源与通用时钟pm_init()初始化电源管理接口early_init()初始化 stdio使DEBUG()在periph_init()阶段可用periph_init()触发各静态外设的初始化。低功耗配置EFM32_LEUART_ENABLED 与特性裁剪原文档强调EFM32/EFR32/EZR32 支持低功耗外设该支持默认启用但可关闭。设置EFM32_LEUART_ENABLED0会关闭 UART 驱动中的 LEUART 支持大约节省 400 字节并提示参考efm32-features.mk查看更多选项。实现与默认值efm32-features.mk 是该特性的唯一默认定义# 可以从命令行或板级 Makefile 覆写注意部分特性并非适用于所有 EFM32 板卡/CPU。 EFM32_LEUART_ENABLED ? 1该变量被 Makefile.features 消费当EFM32_LEUART_ENABLED1时向编译器追加-DEFM32_LEUART_ENABLED1宏定义驱动代码据此决定是否编译 LEUART 路径。关闭方式# 板级 Makefile 或命令行 EFM32_LEUART_ENABLED 0由于底层 UART 驱动uart_series01.c、uart_series2.c需要同时支持普通 UART 与低功耗 LEUART 两套初始化/收发逻辑关闭 LEUART 后这部分代码与数据不再链接从而节省约 400 字节的 ROM/RAM——这正是文档给出的数值。注意该特性只影响UART 驱动中的 LEUART 支持不影响 LEUART 硬件本身也并非对所有型号都适用见efm32-features.mk的注释。其他低功耗相关默认配置Makefile.default 将pm_layered加入DEFAULT_MODULE即默认启用分层电源管理RIOT 的pm_layered框架这是 EFM32 睡眠模式EM0–EM4接入 RIOT 电源管理的基础Makefile.features 对除efm32hg、efm32tg11b、efm32zg外的家族提供cortexm_mpu特性。特性矩阵与使用约束cpu/efm32/Makefile.features 集中声明了该 CPU 移植层提供的 RIOT 特性features是理解能做什么的第一手依据全部家族通用periph_cpuid、periph_flashpage含periph_flashpage_in_address_space、periph_flashpage_pagewise、periph_gpio/periph_gpio_irq/periph_gpio_ll含上下拉、开漏开源等、periph_rtt_set_counter、periph_rtt_overflow、periph_uart_modecfg、periph_wdt按型号提供periph_hwrng仅当EFM32_TRNG1时提供periph_wdt_cb仅对 Series 1/2 提供Makefile.featuresMPU除efm32hg、efm32tg11b、efm32zg三个无 MPU 家族外均提供cortexm_mpu。需要注意的冲突原文档之外Makefile.features 还声明了两条关键约束FEATURES_CONFLICT periph_rtc:periph_rtt FEATURES_CONFLICT_MSG On the EFM32, the RTC and RTT map to the same hardware peripheral.即RTC 与 RTT 在 EFM32 上映射到同一硬件外设二者不能同时启用。另一个冲突是cortexm_fpu与gecko_sdk_librail_nonfpu使用 librailEFR32 射频库时不能启用 FPU。内存与引导配置cpu/efm32/Makefile.include 中还定义了RIOTBOOT 长度启用periph_usbdev时RIOTBOOT_LEN默认为0x4000否则为0x2000USB 引导区更大注释说明 EFM32 上 riotboot 的默认值偏小链接脚本统一使用 cortexm.ld经由 cortexm.inc.mkFlash 页参数在 include/cpu_conf.h 中定义最小写块 4 字节、4 字节对齐、擦除块为整页。实战如何在板级工程中使用在基于 EFM32 的 RIOT 应用中通常需要做三件事选择 CPU/板卡RIOT 构建系统根据BOARD自动引入对应的cpu/efm32代码与家族模块USEMODULE cpu_$(CPU_FAM)见 Makefile.dep若板卡在 boards/ 下直接BOARDxxx make即可。配置时钟与 EMU/CMU在板级 periph_conf.h位于各板卡目录中定义CLOCK_HF、CLOCK_LFA/LFB/LFE、CMU_HFXOINIT、EMU_DCDCINIT等宏晶振初始化参数参考 Gecko SDK 文档。裁剪低功耗外设在板级 Makefile 或命令行中加入EFM32_LEUART_ENABLED 0以节省约 400 字节。需要注意的是EFM32 上RTC 与 RTT 共享同一硬件外设应用中只能二选一若用到 EFR32 的 Sub-GHz 射频librail还需避免与cortexm_fpu同时启用。总结cpu/efm32是一个典型的vendor 库驱动 RIOT 外设抽象式 CPU 移植层外围驱动直接建立在 Gecko SDK 之上RIOT 层负责统一的periph_*API、内存布局与电源管理接入。文档中寥寥数行描述的时钟宏CLOCK_HF/CLOCK_LFA/CLOCK_LFB/CLOCK_LFE、EMU/CMU 覆写点CMU_HFXOINIT、CMU_LFXOINIT、EMU_DCDCINIT、EMU_EM23INIT、EMU_EM4INIT与低功耗开关EFM32_LEUART_ENABLED在 cpu.c、Makefile.features 等源码中均有完整闭环的实现支撑。掌握了这些配置项与启动链路你就可以在任意 EFM32/EFR32/EZR32 板卡上精准地切换时钟源、定制电源模式并裁剪外设开销。赞分享物联网嵌入式操作系统实时系统【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址https://gitcode.com/GitHub_Trending/riot/RIOT点击查看免费下载相关推荐RIOT-OS 与 Silicon Labs SLSTK3400AEFM32 Happy Gecko开发板支持详解外设映射、低功耗配置与烧录调试RIOT OS 与 Silicon Labs SLSTK3400AEFM32 Happy Gecko开发板支持详解外设映射、低功耗配置与烧录调试 SLST物联网嵌入式操作系统实时系统RIOT 驱动 Silicon Labs SLSTK3402AEFM32 Pearl Gecko PG12开发板外设映射、低功耗配置与 J-Link 烧录实战指南RIOT 驱动 Silicon Labs SLSTK3402AEFM32 Pearl Gecko PG12开发板外设映射、低功耗配置与 J Link 烧录物联网嵌入式操作系统实时系统RIOT 驱动 Silicon Labs SLSTK3301AEFM32 Tiny Gecko 11开发板全指南硬件外设、时钟配置与烧录调试RIOT 驱动 Silicon Labs SLSTK3301AEFM32 Tiny Gecko 11开发板全指南硬件外设、时钟配置与烧录调试 SLSTK3物联网嵌入式操作系统实时系统创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表