RTC是当下设备中比较普遍的一个部件,很多设备都需要查看时间。RTC实时时钟已经在很多的单片机中集成,以前还要专门的时钟芯片,现在Cortex-M3内核都包括了这个部件了。和以前NXP的ARM7内核不同的是,LPC1768的时钟源只有32K时钟源提供,这一点是要注意的,其他和ARM7一致。
RTC其实也就是一个定时,可以理解为秒定时器,RTC寄存器挺多的,不过寄存器结构相对简单,操作起来还是很方便的。 讲解几个重要的寄存器,中断位置寄存器ILR,时钟控制寄存器CCR,计数器增量中断寄存器CIIR,报警屏蔽寄存器AMR 第一个ILR中断位置寄存器 BIT0,当为1时计数器增量模块产生中断。 BIT1,当为1是报警寄存器产生中断 第二个CCR时钟控制寄存器 BIT0,时钟时能位,为1是时能 BIT1,复位CTC。 BIT4,校准时能 第三个CIIR计数器增量中断寄存器 有上图可以很清楚看出,分别表示年月日时分秒,相应的位置为,就产生相应的中断,比较设置成0x01,既每秒产生一次中断,设置成0x02,既每分钟产生一次中断。 第四个,AMR报警屏蔽寄存器 这个是寄存器是屏蔽相应的报警位,和CIIR位定义相同。 至于其他寄存器像年月日时分秒这个寄存器可以直观知道它的用途,就不在一一描述。 看看软件设计 typedef struct _TIME_TYPE //时间类型定义 { INT8U sec; //秒 INT8U min; //分 INT8U hour; //时 INT8U dom; //日 INT8U mon; //月 INT8U dow; //星期 INT16U year;//年 }Time_Type; void SETNowTime(Time_Type * pdata) { LPC_RTC->SEC = pdata->sec; LPC_RTC->MIN = pdata->min; LPC_RTC->HOUR = pdata->hour; LPC_RTC->DOM = pdata->dom; LPC_RTC->MONTH = pdata->mon; LPC_RTC->DOW = pdata->dow; LPC_RTC->YEAR = pdata->year; } Void RTC_Init (Time_Type * pdata) { LPC_RTC->CCR = 0x0; //禁止时钟时能,准备初始化RTC LPC_RTC->ILR = 0x03;//清除中断 LPC_RTC->CIIR = 0x00;//不产生中断 LPC_RTC->AMR = 0xff; //屏蔽所有报警中断 SETNowTime (pdata); //设置时间 NVIC_EnableIRQ(RTC_IRQn); //时能RTC中断 NVIC_SetPriority(RTC_IRQn, 9);//设置中断优先级 LPC_RTC->CCR = 0x01; // 启动RTC LPC_RTC->CCR = 0x01; //启动RTC计数器 } void RTCTimeSend (void) { USART0_printf("%02d年%02d月%02d日 %02d:%02d:%02d\r\n", LPC_RTC->YEAR,LPC_RTC->MONTH,LPC_RTC->DOM, LPC_RTC->HOUR,LPC_RTC->MIN, LPC_RTC->SEC); } void RTC_IRQHandler(void) { RTCTimeSend();//发送时间 LPC_RTC->ILR = 0x01; //清除中断 } 每秒产生一次中断,在中断中发送时间数据给串口 |
|
来自: BeautymengRoom > 《嵌入式系统》