尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

RIOT 中 MAX313xx RTC 驱动测试应用全解析:从 shell 命令到源码级验证

RIOT 中 MAX313xx RTC 驱动测试应用全解析:从 shell 命令到源码级验证 RIOT 中 MAX313xx RTC 驱动测试应用全解析从 shell 命令到源码级验证【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT本指南围绕 RIOT 仓库中的 tests/drivers/max313xx/README.md 展开系统讲解如何构建、烧录并运行 Analog Devices MAX313xx 系列实时时钟RTC的驱动测试应用覆盖 MAX31331 与 MAX31343 两种器件变体、全部 shell 命令的用法与参数并结合 drivers/include/max313xx.h 与 drivers/max313xx/max313xx.c 源码说明每条命令背后的寄存器操作与底层原理。读完本文你将掌握 MAX313xx 驱动的验证流程、硬件参数配置方法以及如何在应用中复用其时间、闹钟、温度、方波输出与涓流充电等功能。测试应用概述tests/drivers/max313xx是 RIOT 中针对 MAX313xx 系列 I2C 实时时钟的驱动测试应用。该应用不依赖额外的 Python 测试脚本而是直接通过RIOT shell提供一组命令用于配置与控制 RTC读写当前时间设置与读取闹钟仅 ALARM1使能/禁止闹钟中断读取片内温度仅 MAX31343配置 SQW 方波输出频率仅 MAX31343配置涓流充电器trickle charger配置温度自动转换模式与采样间隔仅 MAX31343开关振荡器timekeeping运行内置自检self-test。从 main.c 可以看到应用启动后首先调用max313xx_init()初始化设备然后进入shell_run()等待用户输入命令。当前实现状态根据 README 及 drivers/include/max313xx.h 中的说明该驱动当前存在以下限制不支持中断驱动本身不处理 RTC 产生的中断应用需要在外部自行用gpio_init_int配置对应引脚并提供回调不支持 User RAM器件内置的用户存储空间User Storage Memory尚未实现仅支持 ALARM1ALARM2 能力受限暂未支持Countdown Timer 也尚未实现只需配置 I2C 总线参数中仅需选定 RTC 所连接的 I2C 总线。从 max313xx_internal.h 还可以看到MAX31331与MAX31343两个变体同一时刻只能启用一个同时启用会在编译期报错#error Only one driver variant can be used at a time!。支持器件与变体选择驱动目前支持两款器件器件特性差异MAX31331基础 RTC支持时间、闹钟、涓流充电MAX31343在 MAX31331 基础上增加片内温度传感器、SQW 方波输出、温度自动转换AUTOMODE选型方式有两种在 Makefile 中修改默认DRIVER ? max31331如需 MAX31343取消#DRIVER ? max31343一行的注释在命令行用DRIVER环境变量指定README 推荐的用法优先级高于 Makefile 内的?赋值DRIVERmax31331 make -C tests/drivers/max313xx/ flash termflash term表示编译并烧录后立即打开串口终端进入 shell。切换为 MAX31343 时同理DRIVERmax31343 make -C tests/drivers/max313xx/ flash termUSEMODULE $(DRIVER)Makefile会把对应变体作为伪模块引入而max31331/max31343这两个伪模块在 drivers/max313xx/Makefile.include 中声明。此外测试应用还依赖ztimer_sec、shell与shell_cmds_defaultMakefile。硬件依赖与板卡约束驱动层面要求目标板提供periph_i2c外设并依赖rtc_utils工具模块见 drivers/max313xx/Makefile.dep。由于测试应用体积较大Makefile.ci 将arduino-duemilanove、arduino-uno、atmega328p、nucleo-l011k4、samd10-xmini、stk3200等内存较小的板卡列入BOARD_INSUFFICIENT_MEMORY这些板卡无法运行本测试。硬件参数配置驱动初始化只需要知道器件挂在哪条 I2C 总线上。默认参数定义在 drivers/max313xx/include/max313xx_params.h#ifndef MAX313XX_PARAM_I2C # define MAX313XX_PARAM_I2C I2C_DEV(0) /** Default I2C bus */ #endif #ifndef MAX313XX_PARAMS # define MAX313XX_PARAMS { \ .i2c MAX313XX_PARAM_I2C, \ } #endif static const max313xx_params_t max313xx_params[] { MAX313XX_PARAMS };也就是说器件默认挂接在I2C_DEV(0)上。若你的板卡把 RTC 接到其他 I2C 总线可在板级配置或应用构建参数中覆盖MAX313XX_PARAM_I2C例如定义为I2C_DEV(1)。测试应用在main()中使用max313xx_params[0]作为参数main.cmax313xx_init()会把参数中的 I2C 总线存入设备描述符max313xx.c。器件在总线上的7 位 I2C 地址固定为0x68写地址 0xD0定义于 max313xx_internal.h。初始化与振荡器停止标志max313xx_init()会读取状态寄存器MAX313XX_REG_STATUS并检查Oscillator Stop FlagOSF。OSF 在以下情况被置位上电复位、电池耗尽或振荡器曾停止运行——此时芯片内的时间无效。对应返回值drivers/include/max313xx.h返回值含义0初始化成功时间有效-EINVAL参数为空指针-EIOI2C 通信错误-ENODATA振荡器曾停止时间无效需先调用max313xx_set_time()设置时间测试应用对-ENODATA的处理是打印警告warning: oscillator was stopped; time is invalid – please set itmain.c。当时间寄存器被写入后OSF 标志会自动清除max313xx_internal.h因此首次上电后应先执行time_set。Shell 命令详解以下所有命令均在 RIOT shell 中直接输入执行。时间参数统一使用 ISO 8601 风格字符串YYYY-MM-DDTHH:mm:ss共 19 个字符解析逻辑见 main.c输出格式为YYYY-MM-DDTHH:mm:ss。time_get —— 读取当前时间time_get调用max313xx_get_time()从器件读取 7 个时间寄存器秒、分、时、星期、日、月、年并解析为struct tm后打印例如current time: 2026-01-09T00:00:00实现上时间寄存器以BCD 编码存储max313xx.c其中星期映射关系为芯片 1..7 →tm_wday0..6世纪位CENTURY月寄存器 bit7决定年份落在 1900 还是 2000 年代。time_set —— 设置当前时间time_set 2026-01-09T00:00:00调用max313xx_set_time()写入时间寄存器。注意数据手册规定写入的时间要到下一个内部 1 Hz 时钟沿才会被锁存因此写入后立即读回可能得到旧值drivers/include/max313xx.h。驱动在写寄存器前会校验时间合法性年份仅支持2000–2099非法输入返回-ERANGEmax313xx.c。alarm_set / alarm_get —— 设置与读取闹钟alarm_set 2026-01-09T00:00:30 alarm_getalarm_set调用max313xx_set_alarm()写入 ALARM1 的 6 个寄存器max313xx.c。根据数据手册要求驱动在写闹钟寄存器前会自动先关闭闹钟中断A1IEalarm_get则读取已配置的闹钟时间若从未设置过会返回-ENOENT并打印no alarm setmain.c。注意两点使能闹钟中断前必须等待至少 1 秒见set_alarm_int说明这是数据手册的硬性要求drivers/include/max313xx.halarm_get不会检查掩码位masking bits若掩码位被设置RTC 实际匹配闹钟时可能不会考虑全部时间字段drivers/include/max313xx.h。set_alarm_int —— 使能/禁止闹钟中断set_alarm_int 0|1控制中断使能寄存器中的 A1IE 位max313xx.c。禁止闹钟传0的同时会清除闹钟标志 A1F。如前所述调用alarm_set后若要使能中断必须先等待至少 1 秒再执行set_alarm_int 1。temp —— 读取温度仅 MAX31343temp调用max313xx_get_temp()读取温度寄存器0x1A/0x1B。返回值单位为百分之一摄氏度centi-degC例如8475表示 84.75°Cdrivers/include/max313xx.h。驱动将原始 16 位值右移 6 位后乘以 25 得到 centi-degCmax313xx.c。测试应用格式化输出为temperature: 26.50°C。在 MAX31331 上该命令不编译通过IS_USED(MODULE_MAX31343)条件编译保护见 main.c。sqw —— 设置 SQW 方波输出频率仅 MAX31343sqw 0-5可选频率对应max313xx_sqw_freq_t枚举见 drivers/include/max313xx.h参数频率01 Hz12 Hz24 Hz38 Hz416 Hz532 Hz调用max313xx_set_sqw()写入 RTC_CFG2 寄存器的 SQW 频率字段max313xx.c在 MAX31331 上调用会返回-ENOTSUP。trickle —— 配置涓流充电器涓流充电器用于缓慢为连接在 VBAT 上的超级电容或可充电备份电池充电充电电流满足I (VCC - V_diode - V_BAT) / R。启用充电trickle diode 0|1 res 0|2|3diode0 仅肖特基二极管1 二极管 肖特基res0 3 kΩ2 6 kΩ3 11 kΩ对应max313xx_trickle_res_t见 drivers/include/max313xx.h。禁用充电trickle 0驱动针对两款器件写入的寄存器字段不同MAX31331 使用 TRICKLE 寄存器的使能位 电阻选择字段MAX31343 使用 TCHE 字段仅0x5能真正使能涓流充电与 D_TRICKLE 字段max313xx.c。automode —— 温度自动转换模式仅 MAX31343automode 0|1 ttsint 0-7第一个参数1开启 AUTOMODE0关闭ttsint自动温度转换间隔写入 TS_Config 寄存器的TTSINT字段TS_Config[5:3]对应 drivers/include/max313xx.httsint间隔01 s12 s24 s38 s416 s532 s664 s7128 s调用max313xx_temp_set_automode()完成写寄存器max313xx.c。power —— 振荡器开关power 0|1power 1使能振荡器设置 RTC_CFG1 的 ENOSC 位继续计时max313xx_poweron()power 0关闭振荡器停止计时max313xx_poweroff()。ENOSC 位在 MAX31331 与 MAX31343 中位于 RTC_CFG1 的不同 bitbit0 vs bit1见 max313xx_internal.h驱动在源码中已分别处理。test —— 内置自检testtest命令串行执行一组自动化检查main.c是验证驱动与硬件工作是否正常的快捷方式写参考时间并读回写入_ref_time2026-01-09 00:00:00星期四后ztimer_sleep2 秒等待 1 Hz 锁存边界再读回并与参考时间比对允许 [0, 3s] 的窗口误差时间推进检查再等待 2 秒确认读回时间严格大于参考时间证明振荡器在走时闹钟写入/读回把闹钟设为当前时间 2 秒写入后再读回允许 ±1 秒误差闹钟清除调用max313xx_set_alarm_int(false)关闭闹钟中断并清除标志温度读取仅 MAX31343读取温度并打印。全部通过输出[test] all tests PASSED。该自检对开发板调试非常实用可用于确认 I2C 连线、器件变体选择和时间走时是否正常。驱动源码要点寄存器级实现整个驱动通过i2c_read_regs/i2c_write_regs访问 7 位地址0x68的器件max313xx.c寄存器映射定义在 max313xx_internal.h共享寄存器Status0x00、Interrupt Enable0x01、RTC_CFG10x03、RTC_CFG20x04等时间寄存器MAX31331 起始于0x08MAX31343 起始于0x06两器件寄存器布局不同驱动用#if IS_USED(MODULE_...)分别定义状态标志A1Fbit0闹钟1标志、A2Fbit1、OSFbit6振荡器停止标志中断使能A1IEbit0、A2IEbit1。值得注意的设计细节max313xx_set_time()在写入时强制置位月寄存器的世纪位MAX313XX_MONTH_CENTURYmax313xx.c因此通过本驱动设置的时间年份总是落在 2000 年代max313xx_set_alarm()写寄存器前自动关闭 A1IEmax313xx.c防止写入中途闹钟触发温度转换采用 14 位有效数据右移 6 位并乘以 25精度为 0.25°C 的整数倍最终以 centi-degC 返回。在应用中使用驱动与 walltime 集成除了本测试应用MAX313xx 驱动还可以直接用于业务应用。在应用的 Makefile 中加入USEMODULE max31331 # 或 max31343并在板级配置中指定 I2C 总线后即可调用 drivers/include/max313xx.h 中导出的 APImax313xx_init、max313xx_get_time、max313xx_set_time、max313xx_set_alarm、max313xx_get_alarm、max313xx_set_alarm_int、max313xx_poweron、max313xx_poweroff、max313xx_trickle_charge_enable/disable以及仅 MAX31343 支持的max313xx_set_sqw、max313xx_get_temp、max313xx_temp_set_automode。若希望把 MAX313xx 接入 RIOT 的walltime抽象可在 Makefile 中添加drivers/include/max313xx.hUSEMODULE walltime_impl_max31331 # 或 walltime_impl_max31343此时 max313xx.c 中的walltime_impl_init/walltime_impl_get/walltime_impl_set会被编译将 RTC 桥接到 walltime 框架上层应用即可用统一的 walltime 接口读写时间。快速上手流程总结接线将 MAX313xx 的 SDA/SCL 连接到板卡空闲 I2C 总线默认I2C_DEV(0)注意器件地址固定为0x68选型确认器件型号是 MAX31331 还是 MAX31343在 Makefile 中设置或通过DRIVER环境变量传入编译烧录DRIVERmax31331 make -C tests/drivers/max313xx/ flash termMAX31343 同理改为DRIVERmax31343flash term会烧录并打开串口终端初始化检查启动后若提示oscillator was stopped先执行time_set写入有效时间功能验证依次执行time_get、time_set、alarm_set、alarm_get、power、trickleMAX31343 还可执行temp、sqw、automode整体回归执行test运行内置自检输出[test] all tests PASSED即代表驱动与硬件工作正常。通过上述命令与源码对照即可完整掌握 RIOT 中 MAX313xx RTC 驱动的使用方式、寄存器级实现细节以及器件变体间的差异为在产品应用中集成 MAX31331/MAX31343 提供可靠的验证基础。【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表