13. 从0学ARM-Cortex-A9 RTC裸机程序编写 (2)

CTLEN位控制CPU和RTC之间的所有接口。因此,您应该在RTC控件中将其设置为“1”,在系统重置后启用数据写入的例程。为了防止无意中写入BCD计数器寄存器,应该关闭电源前将CTLEN位清除为0。

CLKRST是215时钟分频器的计数器复位。在设置RTC时钟之前,应重置215时钟分频器以获得精确的RTC操作。

四、RTC的操作 1. 设置时间

举例:
我们要将当前时间设置为 2020年11月11日, 15:24:50

1) 先将RTC控制使能开启,即RTCCON[0]置为1;
2)然后将时间对应的BCD格式数值,设置到应对的寄存器,BCDYEAR 、BCDMON 、BCDDAY 、BCDHOUR 、BCDMIN 、BCDSEC;
3) 将RTCCON[0]置为0,防止误操作修改了时间;
4)如果我们要访问当前时间,可以直接读取寄存器BCDYEAR 、BCDMON 、BCDDAY 、BCDHOUR 、BCDMIN 、BCDSEC。

void rtc_init(void) { RTCCON = 1;//使能RTC控制写功能 RTC.BCDYEAR = 0x20;// 2020年11月11日, 15:24:50.以BCD码格式写入 RTC.BCDMON = 0x11; RTC.BCDDAY = 0x11; RTC.BCDHOUR = 0x15; RTC.BCDMIN = 0x24; RTC.BCDSEC = 0x50; RTCCON = 0;//关闭RTC控制写功能 } 2. 操作滴答定时器 TICNT

TICNT

RTC计时器是一个递增计数器,并引发计时中断。TICNT寄存器包含32位目标计数值,并且CURTICCNT寄存器包含32位当前计时计数。如果当前滴答数达到TICNT中指定的目标值时,计时中断发生。

一秒钟计数的次数,由RTCCON[7:4]即TICCKSEL位决定:

TICCKSEL

因为我们的晶振频率也是32768,为方便计数,所以我们设置RTCCON[7:4]为0,开启滴答计时器需要设置RTCCON[8]位1:

TICEN

代码如下:

RTCCON = RTCCON & (~(0xf << 4)) | (1 << 8); TICCNT = 32768; 3. 操作ALARM闹钟 RTCALM

RTCALM

RTCALM寄存器控制报警功能的启用和报警时间。请注意,RTCALM寄存器在断电模式下将同时生成ALARM_INT和ALARM_WK信号,但在正常模式下仅生成ALARM_INT信号。设置ALMEN[6]为1以产生ALARM_INT和ALARM_WK信号。

举例:

比如我们想每个小时的25分58秒产生一个中断信号,那我们需要设置RTCALM[1]、RTCALM[0]为1,同时设置RTCALM[6]位1以开启alarm功能,然后将BCD格式的时间设置到寄存器ALMSEC、ALMMIN。

代码如下:

RTCALM.ALM = (1 << 6)|(1 << 0)|(1 << 1);//使能bite:MINEN、SECEN RTCALM.SEC = 0x58; RTCALM.MIN = 0x25; //每小时25:58产生一次中断

alarm功能设置闹钟时间寄存器如下:

ALMSEC

ALMMIN

ALMHOUR

ALMDAY

ALMMON

ALMYEAR

寄存器操作,采用BCD格式。

五、完整代码实现

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpfdgz.html