当前位置:
文档之家› 嵌入式系统及应用-Expt7-ARM RTC
嵌入式系统及应用-Expt7-ARM RTC
ARM RTC寄存器 寄存器:BCD 寄存器
ARM RTC寄存器 寄存器:BCD 寄存器
ARM RTC寄存器 寄存器:BCD 寄存器
ARM RTC寄存器 寄存器:BCD 寄存器
主模块:Main() 主模块
void Main(void) { MMU_Init(); ChangeClockDivider(1,1); // 1:2:4 ChangeMPllValue(0xa1,0x3,0x1); // FCLK=202.8MHz Port_Init(); Int_Init(); spi_LedInit(); //led初始化 初始化 Rtc_Init(9, 4, 10, 13, 59, 20); //实时时钟初始化 实时时钟初始化 //Rtc_EnTick(127, ISR_RtcTick); //启用 启用RTC tick中断 启用 中断 Rtc_EnSecAlarm(0x00, ISR_RtcAlarm); while(1) { if((g_uiEvent & BIT_TICK) != 0) { spi_LedDisplay(0, g_uiTickCount % 10, 0); g_uiEvent &= ~BIT_TICK; } }
RTC模块 模块:Rtc_EnSecAlarm () 模块
void Rtc_EnSecAlarm(BCD val, fnISR isr) { Int_InstallIsr(VC_OFFSET_RTC, isr); rRTCALM |= 0x41; rALMSEC = val; ENABLE_INT(BIT_RTC); }
RTC原理图 原理图
ARM RTC寄存器 寄存器:RTCCON 寄存器
ARM RTC寄存器 寄存器:TickCount 寄存器
ARM RTC寄存器 寄存器:Alarm 寄存器
ARM RTC寄存器 寄存器:Alarm 寄存器
ARM RTC寄存器 寄存器:Alarm 寄存器
ARM RTC寄存器 寄存器:Alarm 寄存器
RTC模块 模块:Rtc_GetDate() 模块
//获取日期 获取日期 void Rtc_GetDate(BCD *pYear, BCD *pMonth, BCD *pDate) { if(pDate != NULL) { *pDate = rBCDDATE; } if(pMonth != NULL) { *pMonth = rBCDMON; } if(pYear != NULL) { *pYear = rBCDYEAR; } }
RTC应用 应用
在一个嵌入式系统中,实时时钟单元可以提供可靠的 在一个嵌入式系统中, 时钟,包括时分秒和年月日; 时钟,包括时分秒和年月日;即使在系统处于关机状态 它也能正常工作(通常采用后备电池供电), ),它的 下,它也能正常工作(通常采用后备电池供电),它的 外围也不需要太多的辅助电路, 外围也不需要太多的辅助电路,典型的就是只需要一个 高精度的晶振。 高精度的晶振。
RTC模块 模块:Rtc_GetTime () 模块
void Rtc_GetTime(BCD *pHour, BCD *pMinute, BCD *pSecond) { if(pSecond != NULL) { *pSecond = rBCDSEC; } if(pMinute != NULL) { *pMinute = rBCDMIN; } if(pHour != NULL) { *pHour = rBCDHOUR; } }
嵌入式系统及应用 Expt7: ARM RTC :
实验任务
学习ARM中断处理机制 中断处理机制 学习 掌握ARM中断处理程序的编写 中断处理程序的编写 掌握 写程序实现: 写程序实现 LED0上显示秒计数器 在LED0上显示秒计数器 上显示时/分 秒 在LED2~LED0上显示时 分/秒;实时时钟
时钟数据采用BCD 编码; 编码; 时钟数据采用 能够对闰年的年月日进行自动处理; 能够对闰年的年月日进行自动处理; 具有告警功能,当系统处于关机状态时, 具有告警功能,当系统处于关机状态时,能产生告警 中断; 中断; 无2000 年问题; 年问题; 具有独立的电源输入; 具有独立的电源输入; 提供毫秒级时钟中断, 提供毫秒级时钟中断,该中断可用作嵌入式操作系统 的内核时钟。 的内核时钟。
RTC模块 模块:Rtc_Init() 模块
void Rtc_Init(UCHAR year, UCHAR mon, UCHAR day, UCHAR hour, UCHAR min, UCHAR sec) { UCHAR bcd; ENABLE_RTC_CON; //rRTCCON = rRTCCON & ~(0x0F) | 0x1 bcd = IntToBCD(year); rBCDYEAR = rBCDYEAR & ~(BITMSK_RTC_BCDYEAR) | bcd; bcd = IntToBCD(mon); rBCDMON = rBCDMON & ~(BITMSK_RTC_BCDMON) | bcd; bcd = IntToBCD(day); rBCDDATE = rBCDDATE & ~(BITMSK_RTC_BCDDATE) | bcd; bcd = IntToBCD(hour); rBCDHOUR = rBCDHOUR & ~(BITMSK_RTC_BCDHOUR) | bcd; bcd = IntToBCD(min); rBCDMIN = rBCDMIN & ~(BITMSK_RTC_BCDMIN) | bcd; bcd = IntToBCD(sec); rBCDSEC = rBCDSEC & ~(BITMSK_RTC_BCDSEC) | bcd; //rRTCCON = 0; //disable rtc }
主模块:ISR_RtcAlarm()/ISR_RtcTick() 主模块
volatile UINT g_uiEvent = 0; //事件位 事件位 volatile UINT g_uiTickCount = 0; //tick count
//trc alarm中断处理函数 中断处理函数 void __irq ISR_RtcAlarm(void) { CLEAR_PENDING(BIT_RTC); g_uiEvent |= BIT_RTC; } //rtc tick中断处理函数 中断处理函数 void __irq ISR_RtcTick(void) { CLEAR_PENDING(BIT_TICK); g_uiEvent |= BIT_TICK; g_uiTickCount ++; }
RTC模块 模块:Rtc_EnTick () 模块
//启用 启用rtc tick计时器 period = (tick+1)/128 sec; 计时器: 启用 计时器 void Rtc_EnTick(UCHAR tick, fnISR isr) { rTICNT = (0x80 | tick); Int_InstallIsr(VC_OFFSET_TICK, isr); ENABLE_INT(BIT_TICK); }