RTC是当下设备中比较普遍的一个部件,很多设备都需要查看时间。RTC实时时钟已经在很多的单片机中集成,以前还要专门的时钟芯片,现在Cortex-M3内核都包括了这个部件了。和以前NXP的ARM7内核不同的是,LPC1768的时钟源只有32K时钟源提供,这一点是要注意的,其他和ARM7一致。
RTC其实也就是一个定时,可以理解为秒定时器,RTC寄存器挺多的,不过寄存器结构相对简单,操作起来还是很方便的。
讲解几个重要的寄存器,中断位置寄存器ILR、时钟控制寄存器CCR、计数器增量中断寄存器CIIR、报警屏蔽寄存器AMR
第一个ILR中断位置寄存器
BIT0,当为1时计数器增量模块产生中断。
BIT1,当为1是报警寄存器产生中断
第二个CCR时钟控制寄存器
BIT4,校准时能
第三个CIIR计数器增量中断寄存器
有上图可以很清楚看出,分别表示年月日时分秒,相应的位置为,就产生相应的中断,比较设置成0x01,既每秒产生一次中断,设置成0x02,既每分钟产生一次中断。
第四个,AMR报警屏蔽寄存器
这个是寄存器是屏蔽相应的报警位,和CIIR位定义相同。
至于其他寄存器像年月日时分秒这个寄存器可以直观知道它的用途,就不在一一描述。
看看软件设计
每秒产生一次中断,在中断中发送时间数据给串口
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; //清除中断
}
每秒产生一次中断,在中断中发送时间数据给串口