[RA4 & RA6] Zephyr的RTC应用

[复制链接]
5|0
ZenithSeeker 发表于 2026-4-24 16:22 | 显示全部楼层 |阅读模式


RTC 硬件适配1 发现 RA4M2 有 RTC 硬件
**RA4M2 确实有 RTC 硬件(FSP HAL 支持),地址 **0x40044000,但 Zephyr 的 SoC DTSI 中没有定义 rtc 节点。
2 修改 SoC DTSI
文件:zephyr/dts/arm/renesas/ra/ra4/r7fa4m2ax.dtsi
**在 **soc { } 节点结束前添加 RTC 节点:
rtc: rtc@40044000 {    compatible = "renesas,ra-rtc";    reg = <0x40044000 0x80>;    clocks = <&subclk>;           /* 32768 Hz 子时钟 */    alarms-count = <1>;    interrupt-parent = <&nvic>;  /* ★ 必须指定中断父节点 ★ */    interrupts = <4 1>, <5 1>, <6 1>;  /* CARRY/PERIODIC/ALARM */    interrupt-names = "cup", "prd", "alm";    status = "disabled";};
关键参数:
参数
说明

地址0x40044000RA4M2 RTC 寄存器基地址
时钟&subclk32768 Hz 子时钟振荡器
IRQ 4CARRY每秒一次,进位中断
IRQ 5PERIODIC周期中断(可配 1Hz)
IRQ 6ALARM闹钟中断
statusdisabled默认禁用,overlay 中启用
注意:添加 interrupt-parent = <&nvic> 是必须的,否则编译报错 "no interrupt parent found"。nvic 是 ARM Cortex-M 的中断控制器,在 ra4-cm33-common.dtsi 中定义。
3 RTC 驱动 API
**RA4M2 使用 Zephyr 的 **rtc 子系统,通过 zephyr/drivers/rtc.h 暴露接口:
#include <zephyr/drivers/rtc.h>// 获取 RTC 设备const struct device *rtc_dev = DEVICE_DT_GET(DT_NODELABEL(rtc));​// 读取时间struct rtc_time now;int ret = rtc_get_time(rtc_dev, &now);if (ret == -ENODATA) {    // 时间未设置,需要初始化    struct rtc_time init_tm = {        .tm_year = 126,   /* 2026 = 1900 + 126 */        .tm_mon  = 0,     /* January */        .tm_mday = 1,        .tm_hour = 0,        .tm_min  = 0,        .tm_sec  = 0,        /* struct rtc_time 和 struct tm 布局完全兼容 */    };    rtc_set_time(rtc_dev, &init_tm);}​// 设置时间rtc_set_time(rtc_dev, &time_struct);4 验证结果RTC: rtc@40044000 readyRTC: not set, initializing...RTC: time set to 2026-01-01 00:00:00clock init doneTH: T=19 H=58
RTC 驱动已成功编译(zephyr/drivers/rtc/rtc_renesas_ra.c),首次上电自动初始化时间,后续重启时间持续走动。

RA 系列移植速查表1 I2C 外设
项目
RA4M2

设备节点DT_NODELABEL(iic0)
驱动配置CONFIG_I2C_RENESAS_RA_IIC=y
引脚定义RA_PSEL(RA_PSEL_I2C, 端口, 引脚)
中断必须显式配置(board DTS 可能缺失)
RIIC0 中断号速查:
中断
IRQ

RXI(接收)87
TXI(发送)88
TEI(发送结束)89
ERI(错误)902 设备树 overlay 编写检查清单□ 外设节点状态设为 "okay"□ pinctrl 引脚配置正确(PSEL 宏)□ pinctrl-0 和 pinctrl-names 引用正确□ 中断号(interrupts)是否需要显式配置?□ clock-frequency 是否需要配置?□ 子节点(如传感器)是否需要 label 属性?□ interrupt-parent 是否指定?3 Zephyr v4 兼容性注意
v3 写法
v4 推荐写法
原因

DEVICE_DT_GET_ANY()device_get_binding()ordinal 符号可能不存在
隐式 overlay显式list(APPEND DTC_OVERLAY_FILE ...)保证 overlay 被应用4 RA 系列通用时钟
时钟
频率
用途

&xtal24 MHz主晶振
&pll100 MHz系统 PLL
&subclk32768 Hz子时钟(RTC 用)
&loco32768 Hz低频振荡器5 Zephyr Kconfig 配置优先级
优先级
说明

应用prj.conf最高,覆盖一切
boardKconfig.defconfig中等
SoCKconfig.defconfig较低
驱动Kconfig默认值最低
常见错误速查
错误信息
原因
解决方法

interrupts is marked as requiredoverlay 中缺少 interrupts补全 interrupts/interrupt-names
no interrupt parent found节点缺少interrupt-parent添加interrupt-parent = <&nvic>
CRC operation failed: -22硬件 CRC 未就绪CONFIG_CRC8=n使用软件 CRC
__device_dts_ord_XX undeclaredDEVICE_DT_GET_ANY ordinal 问题改用device_get_binding()
Skipped. Contents already matchJLink 跳过写入erase+loadfile强制烧录
device not ready设备 status != "okay" 或时钟未使能overlay 中设为 "okay"
RTC time has not been set(-ENODATA)RTC 首次上电未初始化调用rtc_set_time()设置初始时间
9120869e990bb43312.png

您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

170

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部
0