IMX6ULL裸机篇之RTC实验-时间错误问题

这篇具有很好参考价值的文章主要介绍了IMX6ULL裸机篇之RTC实验-时间错误问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一.   RTC时间问题

我这里用的开发板上芯片是 IMX6ULL,但是,由于恩智浦提供的 IMX6ULL芯片的参考手册关于 RTC章节的不全面。所以,实际在开发时使用了 《IMX6UL参考手册》。

对参考手册的理解如下:

LPSRTCMR寄存器 与 LPSRTCLR寄存器是存时间的两个寄存器。即用两个寄存器来存时间。

读取SRTC的LPSRTCMR和LPSRTCLR获取时间值的时候,时间是错误的。

手册上写到:LPSRTCMR寄存器是 SRTC实时时钟的高15bitLPSRTCLR寄存器是 SRTC的低32位,这样的话,RTC时钟的计数器就是47 bit (即 15+32)。

二.   RTC时间排查

1.   参考 IMX6ULL的SDK包代码

“I.MX6U参考资料 / I.MX6ULL SDK包” 目录下,有两个程序,分别是 Windows版本与Linux版本,其中 SDK_2.2_MCIM6ULL_RFP_Win.exe为 Windows版本。

(1)  安装 SDK_2.2_MCIM6ULL_RFP_Win.exe

(2)  SDK_2.2_MCIM6ULL_RFP_Win.exe安装完成后,打开 devices\MCIMX6Y2\drivers目录。

(3) devices\MCIMX6Y2\drivers目录下, fsl_snvs_hp.c文件是 针对 HP-RTC 时钟写的用例。

而根据《IMX6UL参考手册》,存储时钟的两个寄存器(即LPSRTCMR寄存器 与 LPSRTCLR寄存器)说明与 LP-RTC时钟是一样的。说明是:LPSRTCMR存储了高15位,LPSRTCLR存储了低32位。

fsl_snvs_hp.c文件中:

设置时间接口:SNVS_HP_RTC_SetDatetime()接口中,设置寄存器的时间值如下:

    base->HPRTCMR = (uint32_t)(seconds >> 17U);
    base->HPRTCLR = (uint32_t)(seconds << 15U);

获取时间接口:SNVS_HP_RTC_GetSeconds()接口中,获取时间,如下:

 tmp = (base->HPRTCMR << 17U) | (base->HPRTCLR >> 15U);

可以得出这样的结论:

可以看出,LPSRTCMR寄存器存储时间值的高15位,LPSRTCLR寄存器存储时间值的低17位。

2.   参考 HP-RTC时钟用例

现在,根据 恩智浦提供的 HP-RTC 时钟代码用例,更改本实验的中 LP-RTC时钟实验代码。更改接口涉及:设置时间接口与获取时间接口。

更改如下:

/*设置时间的函数*/
void rtc_date_set(struct rtc_datetime* rtc_date)
{
    uint64_t seconds = 0;
    unsigned char rtc_state = 0;

    rtc_state = SNVS->HPCR; //记录下RTC的开关状态
    rtc_disable();
    
    seconds = rtc_coverdate_to_seconds(rtc_date);
    SNVS->LPSRTCMR =  (unsigned int)(seconds >> 17); //高15位
    SNVS->LPSRTCLR = (unsigned int)(seconds << 15);  //低17位

    if((rtc_state & 0X01) == 1) //之前已打开RTC
        rtc_enable();
}

/*获取RTC时间函数*/
void rtc_get_datetime(struct rtc_datetime* rtc_date)
{
    uint64_t seconds = 0;
    seconds = (SNVS->LPSRTCMR << 17) | (SNVS->LPSRTCLR >> 15);

    rtc_convertseconds_to_datetime(seconds, rtc_date);
}

3.   调试运行

编译程序后,烧录到SD卡中。在开发板上运行后,时间打印正确。

串口打印如下所示:

IMX6ULL裸机篇之RTC实验-时间错误问题

可以得出结论,LPSRTCMR寄存器作为SRTC计数器的高15位,但是,LPSRTCLR寄存器bit31:15作为SRTC计数器的低17位。相当于SRTC的计数器是个32位的!!!

而不是像《IMX6UL参考手册》中的说明那样:LPSRTCMR寄存器存储时间值的高15位,LPSRTCLR寄存器存储时间值的低32位!!!文章来源地址https://www.toymoban.com/news/detail-463538.html

到了这里,关于IMX6ULL裸机篇之RTC实验-时间错误问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux下的IMX6ULL——开发板的第一个APP和驱动实验(三)

    前言: 万事开头难,如果我们在开发板上开发出第一个应用程序,第一个驱动程序,那么后续的开发就会稍微简单点,下面让我们来进行第一个应用程序和第一驱动程序的开发吧。 目录 一、开发板的第1个APP实验 1.通过Git仓库 2.通过windows上传  二、开发板的第1个驱动实验

    2024年02月08日
    浏览(40)
  • iMX6ULL驱动开发 | 让imx6ull开发板支持usb接口FC游戏手柄

    手边有一闲置的linux开发板iMX6ULL一直在吃灰,不用来搞点事情,总觉得对不住它。业余打发时间就玩起来吧,总比刷某音强。从某多多上买来一个usb接口的游戏手柄,让开发板支持以下它,后续就可以接着在上面玩童年经典游戏啦。  我使用的是正点原子的I.MX6U-ALPHA 开发板,

    2024年02月14日
    浏览(54)
  • 【IMX6ULL驱动开发学习】08.IMX6ULL通过GPIO子系统函数点亮LED

    通过GPIO子系统函数点亮LED 1、GPIO子系统函数 1.1 确定 led 的GPIO标号,查看内核中的gpiochip 查看 gpiochip ,以正点原子的IMX6ULL阿尔法开发板为例 查看原理图,发现led接的引脚是 GPIO1_IO3,对应 /sys/kernel/debug/gpio 中的 gpiochip0 组,gpiochip0 组从0开始算起, 所以 GPIO1_IO3 对应的标号就

    2024年02月10日
    浏览(78)
  • 【IMX6ULL驱动开发学习】22.IMX6ULL开发板读取ADC(以MQ-135为例)

    IMX6ULL一共有两个ADC,每个ADC都有八个通道,但他们共用一个ADC控制器 在imx6ull.dtsi文件中已经帮我们定义好了adc1的节点部分信息 注意 num-channels = 2; ,这个表示指定使用ADC1的两个通道,即通道1和通道2 如果你要使用多个ADC通道,修改这个值即可 配置ADC引脚的 pinctrl ,在自己的

    2024年02月12日
    浏览(63)
  • 【IMX6ULL驱动开发学习】05.IMX6ULL驱动开发_编写第一个hello驱动【熬夜肝】

    经过以下四个步骤,终于可以开始驱动开发了 01.安装交叉编译环境【附下载地址】 02.IMX6ULL烧写Linux系统 03.设置IMX6ULL开发板与虚拟机在同一网段 04.IMX6ULL开发板与虚拟机互传文件 一、获取内核、编译内核 二、创建vscode工作区,添加内核目录和个人目录 三、了解驱动程序编写

    2024年02月06日
    浏览(52)
  • 基于IMX6ULL的智能车载终端项目(代码开源)_imx6ull 开源 linux 项目 车载终端

    1.4 车载终端:杂项功能 车载终端是一个非常复杂且常用的装置,随着电车与自动驾驶技术的不断升级迭代,需求也与日俱增!我们往往需要在终端上附加许许多多其他的功能,比如:智能家居联动、车内环境监测、天气预报与网上浏览等! 作者强调:考虑到篇幅有限,作者

    2024年04月08日
    浏览(54)
  • 【IMX6ULL驱动开发学习】15.IMX6ULL驱动开发问题记录(sleep被kill_fasync打断)

    发现问题的契机: 学习异步通知的时候,自己实现一个功能:按键控制蜂鸣器,同时LED灯在闪烁 结果:LED好像也同时被按键控制了 最后调试结果发现: 应用层的 sleep 被驱动层的 kill_fasync 打断,所以sleep没有执行完就重新进入下一次循环了 修改代码后解决该问题 解决逻辑就

    2024年02月13日
    浏览(51)
  • IMX6ull SPI 协议

    1.1 SPI SPI 全称是 Serial Perripheral Interface,也就是 串行外围设备接口 。 SPI 是 Motorola 公司推出的一种同步串行接口 技术,是一种高速、 全双工的同步通信总线 , SPI 时钟频率相比 I2C 要高很多,最高可以工作 在 上百 MH z。 SPI 以主从方式工作,通常是有一个主设备和一个或多

    2024年02月12日
    浏览(44)
  • 【IMX6ULL驱动开发学习】03.设置IMX6ULL开发板与虚拟机在同一网段(设置开发板静态IP)

    为什么要设置IMX6ULL与虚拟机通信? 因为要把在虚拟机下编译的文件传到IMX6ULL开发板上运行 设置好同一网段,可以互ping后,可以参考这篇博客,实现开发板与虚拟机的文件互传 IMX6ULL开发板与虚拟机互传文件 一、设置windows有线网卡 二、配置虚拟机双网卡(原本有一个NAT网卡

    2024年02月07日
    浏览(69)
  • IMX6ULL|libgpiod控制IO

    在Linux中,最常见的读写GPIO方式就是用GPIO sysfs interface, 是通过操作 /sys/class/gpio 目录下的 export 、 unexport 、gpio{N}/direction, gpio{N} /value (用实际引脚号替代{N})等文件实现的,经常出现shell脚本里面。 在kernel 4.8开始,加入了libgpiod的支持;而原有基于sysfs的访问方式,将被逐

    2024年01月25日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包