测试环境
开发环境:RT-Thread studio 2.2.1 + NuWriter v1.18 RT-Thread版本:4.0.5
1 NUC980 RTC介绍
1.1 概述
实时时钟(RTC)控制器提供实时时钟和日历信息,RTC控制器的时钟源来自外部32.768 kHz低速晶振。它还提供RTC报警功能,用户可以预设报警时间和报警日历。RTC时间和日历信息的数据格式均以BCD格式表示。而且在系统电源关闭时可以由独立的外部电源(一般是3.3V电池)进行供电。
1.2 特点
支持实时计数器和日历计数器,用于RTC时间和日历检查。 支持时间(小时、分钟、秒)和日历(年、月、日)报警和报警设置。 可选择12小时或24小时模式。 支持闰年。 支持星期计数器。 支持32.768 kHz时钟源的频率补偿机制。 所有时间和日历信息均以BCD格式表示。 支持具有8个周期间隔选项1/128、1/64、1/32、1/16、1/8、1/4、1/2和1秒的周期性RTC时间刻度中断。 支持RTC时间和报警中断。 在产生报警或相关报警中断时,支持芯片从空闲或断电模式唤醒。 支持64字节的备用寄存器来存储用户的重要信息。
1.3 框图
RTC的框图也比较简单,因为官方已经做好了RTC驱动,所以这里不列RTC的相关寄存器了。
开发板上的RTC电路比较简单,主要是外部时钟晶振和电池供电两部分。
时钟源采用外部32.768KHz的晶振。
RTC外部电源接到CON2上,需要自己焊接一个排针,方便外接电池供电。
下面实物图已经外接了一个3.3V的电池来给RTC供电。
2 创建工程
首先确认已经安装了NK-980IOT开发板的支持包
然后选择 文件-新建-RT-Thread项目
命名工程名,选择NK-980IOT开发板,确认创建工程。
3 编译下载程序
下载程序的时候如果找不到uboot等支持文件,可以到rtthread源码里找。
接下来编译程序,然后将编译的rtthread.bin文件下载到开发板。
在下载程序的时候遇到的一个问题,程序一直无法执行。
程序下载到SDRAM里可以执行,而下载到SPI NAND却无法运行。从提示信息看NAND读取的程序空间大小是0x10000,而env环境文档里明明定义的是0x100000,少读了一个0,程序没有读取完导致无法执行。修改env文件,把读取大小多加一个0,然后下载,程序可以正常执行。
4 设置RTC日期时间
程序上使用了LED5闪烁指示程序正在运行,使用key1按键控制是否打印输出日期和时间,这样方便进行RTC时间设置。但是运行程序后,设置日期和时间没有反应。
使用env工具生成Keil工程,在折腾了一番后发现使用Keil工程编译的程序RTC可以正常设置日期时间。
已经有了RTC驱动,设置日期和时间就很方便了,使用msh命令rtc_set_date设置日期(年 月 日)。例如rtc_set_date 2022 3 12设置日期2022年3月12日。使用msh命令rtc_set_time设置时间(时 分 秒)。例如rtc_set_time 12 10 30设置时间12:10:30。另外就是星期是自动跟随日期变化的,这一点非常方便,不用单独设置星期了。
当然,也可以使用函数设置日期和时间,函数在rtc.c文件里,如下:
例如调用函数set_date(2022,3,12);设置日期2022年3月12日。
例如调用函数set_time(12,10,30);设置时间12:10:30。
5 时间精度
对比网络时间设置RTC日期和时间。
断电2天后测试RTC时间,比标准时间快了8秒。相当于一天快4秒,一个月大概误差2分钟,比我之前STM32G0芯片做的RTC精度上要高一些,对于这个时间精度是可以接受的。
6 总结
NK980IOT的RTC使用起来非常方便,设置也很简单。结合RT-Thread使用,既可以msh命令设置,也可以使用函数设置。
设置日期的时候星期是自动设置的,这点很方便,之前做的RTC星期是需要单独设置的。
测试中用到按键和LED灯程序,直接使用的软件包,这就是RT-Thread的好处,各种软件包可以使用,很方便。避免了重复造轮子,节省了开发时间。
|