资讯动态

在 RIOT OS 中使用 NXP FRDM-KL43Z:板级支持、外设配置与烧录指南

发布时间:2026/9/18 5:26:35 来源:尧图企业网站定制
在 RIOT OS 中使用 NXP FRDM-KL43Z板级支持、外设配置与烧录指南【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT导读本文以 RIOT 开源物联网操作系统中boards/frdm-kl43z板级支持包BSP为主线系统讲解基于 MKL43Z256VLH4ARM Cortex-M0的 NXP FRDM-KL43Z Freedom 开发板的时钟树、UART/ADC/I2C/定时器外设映射、板载 LED 与传感器MAG3110、MMA8451Q的 SAUL 接入以及基于 OpenOCD/CMSIS-DAP 的编译烧录流程。读者读完可掌握在 RIOT 中为该板编写应用、定制外设映射和调试部署的完整方法。1. 板级概述一块面向低功耗的 Kinetis L 系列开发板FRDM-KL43Z 是 NXP 出品的 Freedom 系列开发板其核心是MKL43Z256VLH4——一颗基于ARM Cortex-M0内核的 Kinetis L 系列低功耗 MCU。RIOT 将其定位为“低功耗嵌入式应用与 Kinetis L 系列实验”的紧凑平台这一点直接体现在 boards/frdm-kl43z/doc.md 的文档定义中支持组defgroupboards_frdm-kl43z隶属组boards板级支持组说明Support for the NXP FRDM-KL43Z board对 NXP FRDM-KL43Z 开发板的支持从 boards/frdm-kl43z/Makefile.features 可以看到 RIOT 对该板的外设能力声明按字母序排列CPU kinetis CPU_MODEL mkl43z256vlh4 FEATURES_PROVIDED periph_adc FEATURES_PROVIDED periph_i2c FEATURES_PROVIDED periph_rtc FEATURES_PROVIDED periph_rtt FEATURES_PROVIDED periph_timer FEATURES_PROVIDED periph_uart即该板在 RIOT 中默认提供ADC、I2C、RTC、RTT、Timer、UART六类外设抽象接口CPU/CPU_MODEL两个变量把板级实现与cpu/kinetis下的 Kinetis 通用驱动和mkl43z256vlh4具体型号配置关联起来。在 Kconfig 一侧boards/frdm-kl43z/Kconfig 将板名与 CPU 型号绑定config BOARD default frdm-kl43z if BOARD_FRDM_KL43Z config BOARD_FRDM_KL43Z bool default y select CPU_MODEL_MKL43Z256VLH42. 时钟系统8 MHz 内部时钟 32.768 kHz RTC 晶振FRDM-KL43Z 的时钟配置集中定义在 boards/frdm-kl43z/include/periph_conf.h 的clock_config_t clock_config结构体中。该板采用LIRC8M内部 8 MHz 低速参考时钟作为默认模式并以 32.768 kHz 低速晶振驱动 RTCstatic const clock_config_t clock_config { /* * 该配置使系统运行在内部时钟上频率如下 * Core: 8 MHz * Bus: 8 MHz * Flash: 8 MHz */ .clkdiv1 SIM_CLKDIV1_OUTDIV1(0) | SIM_CLKDIV1_OUTDIV4(0), /* 不确定该 RTC 负载电容配置是否正确 */ .rtc_clc RTC_CR_SC8P_MASK | RTC_CR_SC4P_MASK, /* 使用 32 kHz 系统振荡器输出作为 ERCLK32K。 */ .osc32ksel SIM_SOPT1_OSC32KSEL(0), .clock_flags KINETIS_CLOCK_RTCOSC_EN | KINETIS_CLOCK_USE_FAST_IRC | KINETIS_CLOCK_MCGIRCLK_EN | /* 用于 LPUART 时钟 */ KINETIS_CLOCK_MCGIRCLK_STOP_EN | 0, /* 默认使用 LIRC8M 模式 */ .default_mode KINETIS_MCG_MODE_LIRC8M, /* 连接到 EXTAL0 的晶振为 32.768 kHz */ .erc_range KINETIS_MCG_ERC_RANGE_LOW, .osc_clc 0, /* 无负载电容配置KL43Z 上由 rtc_clc 覆盖 */ .fcrdiv MCG_SC_FCRDIV(0), /* LIRC_DIV1 除 1 8 MHz */ .lirc_div2 MCG_MC_LIRC_DIV2(0), /* LIRC_DIV2 除 1 8 MHz */ }; #define CLOCK_CORECLOCK ( 8000000ul) #define CLOCK_MCGIRCLK ( 8000000ul) #define CLOCK_BUSCLOCK (CLOCK_CORECLOCK / 1)几个值得注意的细节CLOCK_CORECLOCK、CLOCK_BUSCLOCK、CLOCK_MCGIRCLK 均为 8 MHz其中CLOCK_MCGIRCLK内部参考时钟被专门启用并配置为LPUART 的时钟源见下文 UART 一节MCGIRCLK_STOP_EN允许其在低功耗停止模式下继续工作。rtc_clc设置了 RTC 振荡器的负载电容位SC8P/SC4P源码注释明确提示“不确定该 RTC 负载电容配置是否正确”属于板级作者遗留的待验证项读者在定制时可根据实际晶振负载需求调整。erc_range KINETIS_MCG_ERC_RANGE_LOW对应外部 32.768 kHz 晶振的低频范围。3. 外设引脚映射periph_conf.h3.1 UARTLPUART0默认控制台接口板载调试/控制台串口使用LPUART0引脚为PTA1RX/ PTA2TX引脚复用功能 MUX 2帧格式8N1static const uart_conf_t uart_config[] { { .dev LPUART0, .freq CLOCK_MCGIRCLK, /* 以内部参考时钟为时钟源 */ .pin_rx GPIO_PIN(PORT_A, 1), .pin_tx GPIO_PIN(PORT_A, 2), .pcr_rx PORT_PCR_MUX(2), .pcr_tx PORT_PCR_MUX(2), .irqn LPUART0_IRQn, .scgc_addr SIM-SCGC5, .scgc_bit SIM_SCGC5_LPUART0_SHIFT, .mode UART_MODE_8N1, .type KINETIS_LPUART, }, }; #define UART_NUMOF ARRAY_SIZE(uart_config) #define LPUART_0_ISR isr_lpuart0 /* 使用 MCGIRCLK内部参考时钟 */ #define LPUART_0_SRC 3关键点.freq CLOCK_MCGIRCLK配合LPUART_0_SRC 3表明 LPUART0 由 MCGIRCLK 驱动该时钟被显式开启正是为了串口用途scgc_addr/scgc_bit给出外设时钟门控SIM_SCGC5的使能位置。启动后该串口即作为 RIOT 的默认 STDIO 输出使用。3.2 ADCADC0 六通道直连 Arduino 排针 A0–A5ADC 使用 ADC0共配置6 个通道与 Arduino 兼容排针 A0–A5 一一对应static const adc_conf_t adc_config[] { /* dev, pin, channel */ { .dev ADC0, .pin GPIO_PIN(PORT_B, 0), .chan 8, .avg ADC_AVG_MAX }, /* Arduino A0 */ { .dev ADC0, .pin GPIO_PIN(PORT_B, 1), .chan 9, .avg ADC_AVG_MAX }, /* Arduino A1 */ { .dev ADC0, .pin GPIO_PIN(PORT_B, 2), .chan 15, .avg ADC_AVG_MAX }, /* Arduino A2 */ { .dev ADC0, .pin GPIO_PIN(PORT_B, 3), .chan 4, .avg ADC_AVG_MAX }, /* Arduino A3 */ { .dev ADC0, .pin GPIO_PIN(PORT_C, 2), .chan 11, .avg ADC_AVG_MAX }, /* Arduino A4 */ { .dev ADC0, .pin GPIO_PIN(PORT_C, 1), .chan 15, .avg ADC_AVG_MAX }, /* Arduino A5 */ }; #define ADC_NUMOF ARRAY_SIZE(adc_config) /* KL43Z ADC 参考电压设置 * 0: VREFH/VREFL 外部引脚对 * 1: VDDA/VSSA 电源引脚 * 2-3: 保留 */ #define ADC_REF_SETTING 0每通道均启用最大平均ADC_AVG_MAX用于抑制采样噪声、提升有效位数。ADC_REF_SETTING 0表示采用VREFH/VREFL 外部基准引脚对即板上的外部基准源源码注释也列出了其他取值含义1 为 VDDA/VSSA 电源基准2–3 保留。3.3 I2CI2C0 与 I2C1 双总线板上配置了两条 I2C 总线均运行在I2C_SPEED_FAST400 kHz 档总线SCLSDA引脚复用I2C0PTE24PTE25MUX 5I2C1PTE1PTE0MUX 6static const i2c_conf_t i2c_config[] { { .i2c I2C0, .scl_pin GPIO_PIN(PORT_E, 24), .sda_pin GPIO_PIN(PORT_E, 25), .freq CLOCK_CORECLOCK, .speed I2C_SPEED_FAST, .irqn I2C0_IRQn, .scl_pcr (PORT_PCR_MUX(5)), .sda_pcr (PORT_PCR_MUX(5)), }, { .i2c I2C1, .scl_pin GPIO_PIN(PORT_E, 1), .sda_pin GPIO_PIN(PORT_E, 0), .freq CLOCK_CORECLOCK, .speed I2C_SPEED_FAST, .irqn I2C1_IRQn, .scl_pcr (PORT_PCR_MUX(6)), .sda_pcr (PORT_PCR_MUX(6)), }, }; #define I2C_NUMOF ARRAY_SIZE(i2c_config) #define I2C_0_ISR isr_i2c0 #define I2C_1_ISR isr_i2c1板载的 MAG3110 磁力计与 MMA8451Q 加速度计都挂在I2C0上见第 5 节因此 I2C0 是板载传感器数据通路I2C1 可供用户扩展外设。3.4 定时器PIT LPTMRRIOT 的periph_timer由两类硬件定时器共同提供#define PIT_NUMOF (1U) #define PIT_CONFIG { \ { \ .prescaler_ch 0, \ .count_ch 1, \ }, \ } #define LPTMR_NUMOF (1U) #define LPTMR_CONFIG { \ { \ .dev LPTMR0, \ .irqn LPTMR0_IRQn, \ .src 2, \ .base_freq 32768u, \ }, \ } #define TIMER_NUMOF ((PIT_NUMOF) (LPTMR_NUMOF)) #define PIT_BASECLOCK (CLOCK_BUSCLOCK) #define PIT_ISR_0 isr_pit1 #define LPTMR_ISR_0 isr_lptmr0PIT周期中断定时器1 路基于总线时钟8 MHz计数。LPTMR低功耗定时器1 路base_freq 32768u由 RTC 32.768 kHz 时钟驱动可用于低功耗场景下的计时。board.h中还根据KINETIS_XTIMER_SOURCE_PIT宏选择 xtimer 的后端默认走LPTMR16 位、32768 Hz并配套定义了 xtimer 的XTIMER_WIDTH、XTIMER_BACKOFF、XTIMER_ISR_BACKOFF、XTIMER_OVERHEAD等校准参数若选择 PIT 后端则沿用默认 xtimer 参数#if IS_ACTIVE(KINETIS_XTIMER_SOURCE_PIT) #define XTIMER_DEV (TIMER_PIT_DEV(0)) #define XTIMER_CHAN (0) #else #define XTIMER_DEV (TIMER_LPTMR_DEV(0)) #define XTIMER_CHAN (0) /* LPTMR 为 16 位由 RTC 驱动运行在 32768 Hz */ #define XTIMER_WIDTH (16) #define XTIMER_BACKOFF (5) #define XTIMER_ISR_BACKOFF (5) #define XTIMER_OVERHEAD (4) #define XTIMER_HZ (32768ul) #endif4. 板载 LED、按键与启动配置board.hboards/frdm-kl43z/include/board.h 定义了板级基础资源LED 引脚低电平点亮。源码注释明确说明原厂原理图中 LED 命名为 LED1/LED2RIOT 将其重映射为从 0 开始的编号——NXP LED1 → RIOT LED0NXP LED2 → RIOT LED1RIOT 名称引脚原厂名称控制寄存器操作LED0PTD5LED1GPIOD-PCOR/PSOR/PTORLED1PTE31LED2GPIOE-PCOR/PSOR/PTOR#define LED0_PIN GPIO_PIN(PORT_D, 5) #define LED1_PIN GPIO_PIN(PORT_E, 31) #define LED0_ON (GPIOD-PCOR LED0_MASK) #define LED0_OFF (GPIOD-PSOR LED0_MASK) #define LED0_TOGGLE (GPIOD-PTOR LED0_MASK)LED 通过 GPIO 的 PCOR清位/PSOR置位/PTOR翻转寄存器直接控制属于低电平有效的板载指示灯。启动配置FOPTKINETIS_FOPT定义了 flash 配置字段——禁用 ROM 引导加载程序直接从 flash 启动用户应用/* 禁用 ROM bootloader从 flash 启动用户应用 */ #define KINETIS_FOPT (0xff ~(NV_FOPT_BOOTSRC_SEL_MASK | NV_FOPT_BOOTPIN_OPT_MASK))这一点与烧录章节中check-fcfield.sh的预烧录检查相互呼应见第 7 节。5. 板载传感器与 SAUL 接入FRDM-KL43Z 板载两颗 I2C 传感器均挂在I2C0上其总线参数直接在board.h中通过*_PARAM_*宏预定义/* MAG3110 三轴磁力计 */ #define MAG3110_PARAM_I2C I2C_DEV(0) #define MAG3110_PARAM_ADDR 0x0E /* MMA8451Q 三轴加速度计 */ #define MMA8X5X_PARAM_I2C I2C_DEV(0) #define MMA8X5X_PARAM_ADDR 0x1D #define MMA8X5X_PARAM_TYPE (MMA8X5X_TYPE_MMA8451)MAG3110三轴磁力计I2C 地址0x0E对应 drivers/mag3110 驱动MMA8451Q三轴加速度计I2C 地址0x1D类型指定为MMA8451对应 drivers/mma8x5x 驱动。当应用启用saul_default模块时boards/frdm-kl43z/Makefile.dep 会自动追加相关依赖ifneq (,$(filter saul_default,$(USEMODULE))) USEMODULE saul_gpio USEMODULE saul_adc USEMODULE mag3110 USEMODULE mma8x5x endif这样一次编译即可把板载 LED、SW1 按键、A0–A3 模拟通道以及 MAG3110/MMA8451Q 两颗传感器统一注册进 SAULSensor Actuator Uber Layer注册表通过saulshell 命令或自动初始化auto_init即可直接枚举与访问。具体到 SAUL 的直连映射boards/frdm-kl43z/include/gpio_params.h 注册了 3 个 GPIO 设备SAUL 名称引脚模式标志LED1(green)LED0_PIN (PTD5)GPIO_OUTSAUL_GPIO_INVERTEDLED2(red)LED1_PIN (PTE31)GPIO_OUTSAUL_GPIO_INVERTEDSW1PTC3GPIO_IN_PU—SAUL_GPIO_INVERTED标志与 LED 低电平有效特性一致写 1 关灯、写 0 开灯。boards/frdm-kl43z/include/adc_params.h 将 A0–A3 注册为 16 位分辨率采样通道ADC_RES_16BIT供 SAUL 直接读取模拟量static const saul_adc_params_t saul_adc_params[] { { .name A0, .line ADC_LINE(0), .res ADC_RES_16BIT }, { .name A1, .line ADC_LINE(1), .res ADC_RES_16BIT }, { .name A2, .line ADC_LINE(2), .res ADC_RES_16BIT }, { .name A3, .line ADC_LINE(3), .res ADC_RES_16BIT }, };6. 板级构建结构一览boards/frdm-kl43z目录的构成与 RIOT 标准板级包一致boards/frdm-kl43z/ ├── Kconfig # BOARD 符号与 CPU_MODEL 选择 ├── Makefile # MODULE board引入 Makefile.base ├── Makefile.dep # saul_default 依赖saul_gpio/saul_adc/mag3110/mma8x5x ├── Makefile.features # CPU、CPU_MODEL 与 FEATURES_PROVIDED ├── Makefile.include # 调试适配器与 FRDM 公共配置 ├── doc.md # 板级文档 └── include/ ├── adc_params.h # SAUL ADC 直连映射 ├── board.h # LED/按键/传感器/xtimer/FOPT 定义 ├── gpio_params.h # SAUL GPIO 直连映射 └── periph_conf.h # 时钟、UART、ADC、I2C、定时器配置Makefile.include负责接入烧录工具链配置并引入 FRDM 系列公共配置# 本板 OpenSDA 出厂预装 PE 调试器固件RIOT 不支持该固件。 # 请从 NXP 官网将 OpenSDA 固件更新为最新的 CMSIS-DAP 固件。 OPENOCD_DEBUG_ADAPTER ? dap # 引入默认 FRDM 板配置 include $(RIOTBOARD)/common/frdm/Makefile.include注意其中的重要提示板载 OpenSDA 调试器出厂时运行的是 PE 调试器固件RIOT 的烧录工具链不支持该固件需要先将其升级为 CMSIS-DAP 固件才能配合 OpenOCD 使用。7. 编译与烧录OpenOCD CMSIS-DAPFRDM 系列的公共烧录配置位于 boards/common/frdm/Makefile.include# 默认使用 OpenOCD 烧录 PROGRAMMER ? openocd # 使用共享的 OpenOCD 配置 # 使用 dap 还是 jlink 取决于 OpenSDA 调试器运行的固件 OPENOCD_DEBUG_ADAPTER ? dap #OPENOCD_DEBUG_ADAPTER ? jlink ifeq ($(CPU_CORE), cortex-m0plus) OPENOCD_KINETIS_FAMILY klx else OPENOCD_KINETIS_FAMILY kx endif OPENOCD_CONFIG ? $(RIOTBOARD)/common/frdm/dist/openocd-$(OPENOCD_KINETIS_FAMILY).cfg # 烧录前检查 flash 配置字段 OPENOCD_PRE_FLASH_CHECK_SCRIPT $(RIOTCPU)/$(CPU)/dist/check-fcfield.sh # 板子在运行一段时间后可能变得不可烧录 # 使用 connect_assert_srst 保证始终可以烧录或复位板子。 OPENOCD_RESET_USE_CONNECT_ASSERT_SRST ? 1 PROGRAMMERS_SUPPORTED openocdFRDM-KL43Z 属于 Cortex-M0CPU_CORE为 cortex-m0plus因此 OpenOCD 使用klx系列配置openocd-klx.cfg。同时CMSIS-DAP 适配器默认OPENOCD_DEBUG_ADAPTER dap对应升级后的 OpenSDA 固件若你的 OpenSDA 刷的是 J-Link 固件可改用jlink。烧录前检查check-fcfield.sh会在烧录前校验 flash 配置字段与board.h中KINETIS_FOPT禁用 ROM bootloader直接相关防止板子因配置字错误而变砖。connect_assert_srst默认开启确保板子在异常状态下仍可被复位与重新烧录。编译并烧录示例# 使用板载 OpenSDACMSIS-DAP编译并烧录 make BOARDfrdm-kl43z flash # 仅编译 make BOARDfrdm-kl43z # 以 J-Link 固件模式的 OpenSDA 烧录 make BOARDfrdm-kl43z OPENOCD_DEBUG_ADAPTERjlink flash前提与限制以上命令需要在已配置好的 RIOT 开发环境含 ARM 交叉编译工具链与 OpenOCD ≥ 0.10.0中执行首次使用前务必完成 OpenSDA 固件的 CMSIS-DAP 升级。8. 上手示例与进一步阅读基于上述板级支持一个最小应用只需在应用目录下指定BOARDfrdm-kl43z即可自动获得串口控制台、LED 控制、A0–A3 ADC 采样与板载传感器的 SAUL 访问能力。可参考仓库内配套测试与示例外设自测程序见 tests/periph_uart、tests/periph_adc、tests/periph_i2c、tests/periph_timer 等目录可用于验证本文介绍的各类引脚映射SAUL 相关用法可参考 tests/saul 与 examples/saulKinetis 系列底层时钟与外设驱动实现位于 cpu/kinetis其中dist/check-fcfield.sh即烧录前检查脚本所在若需定制引脚或增加外设直接修改 boards/frdm-kl43z/include/periph_conf.h 中的*_config[]数组与*_NUMOF宏即可改动后重新编译即生效。【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价