ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

RIOT OS 测试应用深度解析:Atmel IO1 Xplained 扩展板的驱动测试程序

2026/9/19 13:51:38 拓冰建站 浏览量
RIOT OS 测试应用深度解析:Atmel IO1 Xplained 扩展板的驱动测试程序 物联网嵌入式操作系统实时系统【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址https://gitcode.com/GitHub_Trending/riot/RIOT点击查看免费下载IO1 Xplained 是 Atmel Xplained Pro 评估平台的一款扩展板板载温度传感器、光照传感器、microSD 卡槽、LED 与 GPIO 引脚是验证 RIOT OS 传感器/外设驱动栈的理想载体。本文以 tests/drivers/io1_xplained 目录下的测试应用为主体结合 drivers/io1_xplained 驱动源码完整讲解该测试程序的构建方式、初始化流程、各外设测试逻辑以及底层实现原理帮助读者掌握在 RIOT OS 中为多外设扩展板编写集成测试的完整方法。IO1 Xplained 扩展板与测试应用概览Atmel IO1 Xplained 是 Atmel Xplained Pro 评估平台的扩展板通过标准的 Xplained Pro 扩展接口与主机板相连。从 drivers/include/io1_xplained.h 的驱动接口注释可以看到这块扩展板集成了以下资源AT30TSE75x 温度传感器通过 I2C 接口访问复用 drivers/at30tse75x 驱动TEMT6000 光照传感器通过 ADC 采样驱动内直接使用periph/adc实现microSD 卡连接器通过 SPI 接口访问复用 drivers/sdcard_spi 驱动一颗黄色 LED2 个可扩展 GPIO 引脚。官方驱动注释指出该扩展板可搭配 samr21-xpro、samd21-xpro、saml21-xpro 等 Atmel Xplained Pro 系列评估板使用而这些板卡在 RIOT OS 中均有对应的 boards 定义。tests/drivers/io1_xplained下的测试应用main.c正是为了验证这一整套板载外设在 RIOT OS 下的可用性它依次检查温度读取、SD 卡 CID 信息读取、光照强度采样以及 LED 的置位/清零/翻转操作并通过串口持续打印测试结果。构建配置最小依赖的 Makefile测试应用的构建文件非常精简tests/drivers/io1_xplained/Makefile 全文如下include ../Makefile.drivers_common USEMODULE io1_xplained USEMODULE ztimer_msec include $(RIOTBASE)/Makefile.include../Makefile.drivers_common是 tests 下驱动类测试的公共构建片段负责引入测试所需的通用模块与打印设施USEMODULE io1_xplained引入扩展板驱动USEMODULE ztimer_msec引入毫秒级 ztimer 定时器测试主循环中的ztimer_sleep(ZTIMER_MSEC, DELAY_1S)即依赖该模块。值得注意的是io1_xplained驱动的依赖并非手动罗列而是由 drivers/io1_xplained/Makefile.dep 自动解析FEATURES_REQUIRED periph_gpio FEATURES_REQUIRED periph_adc USEMODULE at30tse75x USEMODULE sdcard_spi即启用io1_xplained模块后构建系统会自动要求目标板卡具备 GPIO 与 ADC 外设特性FEATURES_REQUIRED并自动拉入at30tse75x与sdcard_spi两个底层驱动模块。这正是 RIOT OS 模块化依赖管理Makefile.dep 体系的典型体现上层模块只需声明自身需求下层依赖由构建系统递归补齐。此外tests/drivers/io1_xplained/Makefile.ci 将atmega8、nucleo-l011k4、samd10-xmini列为BOARD_INSUFFICIENT_MEMORY即这些板卡因 Flash/RAM 容量不足无法在 CI 中运行本测试。初始化流程逐外设检查的 io1_xplained_init测试程序首先调用驱动核心 API 完成扩展板初始化static io1_xplained_t dev; if (io1_xplained_init(dev, io1_xplained_params[0]) ! IO1_XPLAINED_OK) { puts([Error] Cannot initialize the IO1 Xplained extension\n); return 1; }其中io1_xplained_params[]来自 drivers/io1_xplained/include/io1_xplained_params.h默认参数为#ifndef IO1_XPLAINED_PARAM_ADDR #define IO1_XPLAINED_PARAM_ADDR (0x07) #endif #ifndef IO1_XPLAINED_PARAMS #define IO1_XPLAINED_PARAMS { .addr IO1_XPLAINED_PARAM_ADDR } #endif唯一的配置项addr是温度传感器 AT30TSE75x 的地址偏移。驱动内部见 drivers/io1_xplained/io1_xplained.c将其与基础地址组合#define IO1_TEMPERATURE_BASE_ADDR (0x48) #define IO1_TEMPERATURE_DEFAULT_ADDR (0x07)即实际 I2C 地址为0x48 | 0x07 0x4F。初始化成功后驱动还会调用at30tse75x_set_resolution(dev-temp, AT30TSE75X_RESOLUTION_12BIT)将温度传感器设置为最高 12 位分辨率。io1_xplained_init的完整流程在 drivers/io1_xplained/io1_xplained.c 中实现依次为保存参数到设备描述符通过 I2C 初始化 AT30TSE75x 温度传感器失败返回-IO1_XPLAINED_NOTEMP初始化 SD 卡检测引脚GPIO_IN检测引脚为反逻辑低电平表示卡已插入插入时构造sdcard_spi_params_t并调用sdcard_spi_init失败返回-IO1_XPLAINED_NOSDCARD初始化光照传感器所用 ADC 通道失败返回-IO1_XPLAINED_NOLIGHT依次初始化 LED、GPIO1、GPIO2 为输出分别对应-IO1_XPLAINED_NOLED、-IO1_XPLAINED_NOGPIO1、-IO1_XPLAINED_NOGPIO2。全部成功后返回IO1_XPLAINED_OK。这些返回值在 drivers/include/io1_xplained.h 中以枚举定义测试程序只需比较返回值即可精确定位失败外设这种逐外设上报错误码的设计让板卡调试非常直观。测试主循环温度、SD 卡、光照与 LED 轮询验证main()在完成初始化后进入一个无限循环tests/drivers/io1_xplained/main.c每个外设测试之间通过ztimer_sleep(ZTIMER_MSEC, DELAY_1S)DELAY_1S 1U * MS_PER_SEC间隔 1 秒便于肉眼观察 LED 状态与串口输出。温度读取at30tse75x_get_temperature(dev.temp, temperature); printf(Temperature [°C]: %i.%03u\n, (int)temperature, (unsigned)((temperature - (int)temperature) * 1000));温度直接取自驱动描述符中的dev.tempat30tse75x_t类型见 drivers/include/io1_xplained.h将浮点温度拆分为整数部分与千分位小数打印输出形如Temperature [°C]: 24.500。SD 卡 CID 信息读取if (!gpio_read(IO1_SDCARD_SPI_PARAM_DETECT)) { _sd_card_cid(); ... }由于卡检测引脚反逻辑插入时读到低电平因此取反后为真才执行。_sd_card_cid()直接读取dev.sdcard.cid结构体字段并逐项打印 MID厂商 ID、OIDOEM/应用 ID、PNM产品名最多 5 字符、PRV产品版本、PSN序列号PRIu32格式化、MDT制造日期与 CID_CRC。这些字段来自 drivers/sdcard_spi 驱动解析出的 CID 寄存器内容。若未插入 SD 卡则该分支被跳过。光照强度读取uint16_t light; io1_xplained_read_light_level(light); printf(Light level: %i\n, light);io1_xplained_read_light_level在 drivers/io1_xplained/io1_xplained.c 中实现以 10 位分辨率对IO1_LIGHT_ADC_LINEADC_LINE(0)采样随后取反得到光照值*light (1023 - sample)——数值越大表示环境越亮输出范围 01023。若 ADC 采样失败则返回-IO1_XPLAINED_READ_ERR。LED 状态机验证gpio_set(IO1_LED_PIN); /* 点亮 */ ztimer_sleep(...); gpio_clear(IO1_LED_PIN); /* 熄灭 */ ztimer_sleep(...); gpio_toggle(IO1_LED_PIN); /* 翻转 */ ztimer_sleep(...); gpio_toggle(IO1_LED_PIN); /* 再次翻转 */通过periph/gpio的gpio_set/gpio_clear/gpio_toggle三种操作完整验证 LED 输出引脚行为每个状态保持 1 秒串口侧可直接目视确认硬件工作正常。引脚映射与硬件布局细节测试与驱动使用的全部引脚宏定义集中在 drivers/io1_xplained/include/io1_xplained_internals.h它们与 Xplained Pro 扩展接口的固定布局一一对应资源宏定义引脚/通道温度传感器 I2C 基址IO1_TEMPERATURE_BASE_ADDR0x48温度传感器地址偏移IO1_TEMPERATURE_DEFAULT_ADDR0x07SD 卡 SPI 设备IO1_SDCARD_SPI_PARAM_SPISPI_DEV(1)SD 卡片选IO1_SDCARD_SPI_PARAM_CSGPIO_PIN(1, 3)SD 卡时钟IO1_SDCARD_SPI_PARAM_CLKGPIO_PIN(1, 23)SD 卡 MOSIIO1_SDCARD_SPI_PARAM_MOSIGPIO_PIN(1, 22)SD 卡 MISOIO1_SDCARD_SPI_PARAM_MISOGPIO_PIN(1, 2)SD 卡电源IO1_SDCARD_SPI_PARAM_POWERGPIO_UNDEF未接线SD 卡检测IO1_SDCARD_SPI_PARAM_DETECTGPIO_PIN(0, 23)低有效光照 ADC 通道IO1_LIGHT_ADC_LINEADC_LINE(0)光照 ADC 分辨率IO1_LIGHT_ADC_RESADC_RES_10BITLEDIO1_LED_PINGPIO_PIN(0, 18)GPIO1IO1_GPIO1_PINGPIO_PIN(0, 13)GPIO2IO1_GPIO2_PINGPIO_PIN(0, 28)这些宏在初始化阶段被逐个用于gpio_init、adc_init与 SPI 参数构造是理解板级适配与驱动移植的入口。若读者需要将 IO1 Xplained 适配到新的 Xplained Pro 主机板只需核对新板卡的引脚映射并覆盖这些宏或通过 board 目录下的头文件重定义即可。SAUL 集成传感器数据进入统一注册表除测试应用外该驱动还提供 SAULSensor Actuator Uber Layer适配层见 drivers/io1_xplained/io1_xplained_saul.c温度读取回调把浮点温度放大 100 倍并以UNIT_TEMP_C、scale -2的物理量格式上报即phydat_t表示摄氏度精度到百分之一度。SAUL 条目名称在 drivers/io1_xplained/include/io1_xplained_params.h 中注册为#define IO1_XPLAINED_SAUL_INFO {{ .name Temperature (IO1 Xplained) }, \ { .name LED (IO1 Xplained) }, \ { .name GPIO1 (IO1 Xplained) }, \ { .name GPIO2 (IO1 Xplained) }}同时在启用MODULE_SAUL_GPIO时LED、GPIO1、GPIO2 三个引脚会注册为saul_gpio_params_t输出条目其中 LED 带SAUL_GPIO_INVERTED标志表示板载 LED 低电平点亮。这意味着温度数据可以通过saul命令行工具或auto_init机制被上层应用直接消费无需编写额外胶水代码。编译、烧录与运行在 RIOT OS 中运行本测试的标准流程如下# 以 samr21-xpro 为例IO1 Xplained 官方支持的评估板之一 make -C tests/drivers/io1_xplained BOARDsamr21-xpro flash termmake会依据Makefile.dep自动解析io1_xplained→at30tse75x/sdcard_spi→periph_gpio/periph_adc的完整依赖链flash目标烧录固件term打开串口终端观察输出将 IO1 Xplained 扩展板插入 Xplained Pro 扩展接口后复位板卡即可看到初始化成功提示与周期性的外设测试输出。典型的串口输出序列如下IO1 Xplained extension test application -------------Initializing------------ Initialization successful --------Starting tests -------- Temperature [°C]: 24.500 ------------------------------------- Light level: 512 -------------------------------------若初始化失败程序会在串口打印[Error] Cannot initialize the IO1 Xplained extension并以退出码 1 结束此时可结合上文所述错误码枚举定位具体失败外设温度传感器、SD 卡、ADC、LED 或 GPIO。小结本文以 tests/drivers/io1_xplained/README.md 所描述的测试应用为线索串联起 RIOT OS 中多外设扩展板驱动测试的完整链路从 Makefile 的最小依赖声明、Makefile.dep 的自动依赖解析到 io1_xplained.c 的逐外设初始化、main.c 的轮询测试逻辑再到 io1_xplained_saul.c 的 SAUL 数据上报。这套驱动 参数头文件 SAUL 适配 集成测试的完整结构也是 RIOT OS 所有传感器/执行器驱动共用的开发范式可作为编写新扩展板驱动与测试的参考模板。赞分享物联网嵌入式操作系统实时系统【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址https://gitcode.com/GitHub_Trending/riot/RIOT点击查看免费下载相关推荐RIOT OS 板级支持解析Atmel SAM L21 Xplained Prosaml21-xpro开发板使用指南RIOT OS 板级支持解析Atmel SAM L21 Xplained Prosaml21 xpro开发板使用指南 导读 本文围绕 RIOT OS 仓库物联网嵌入式操作系统实时系统RIOT OS 板卡支持Atmel SAM D10 Xplained Minisamd10-xmini开发板使用指南RIOT OS 板卡支持Atmel SAM D10 Xplained Minisamd10 xmini开发板使用指南 本文以 RIOT OS 仓库中 bo物联网嵌入式操作系统实时系统RIOT OS 中的 Atmel SAM R21 Xplained Pro 板卡支持指南硬件资源、外设配置与烧录调试实战RIOT OS 中的 Atmel SAM R21 Xplained Pro 板卡支持指南硬件资源、外设配置与烧录调试实战 本篇技术指南围绕 RIOT OS 对物联网嵌入式操作系统实时系统创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考