RTC定时控制
时间:10-02
整理:3721RD
点击:
在NUC472内部配有RTC计时器,通过与LCD5110的配合即可将RTC的计时值及控制状态显示出来。由于前面我们已经实现了LCD5110屏的显示,所以只需在适当的位置添加显示语句即可达到目的。
在计时控制中涉及的RTC函数有:RTC定时标识函数 RTC_AlarmHandle()和RTC中断函数RTC_IRQHandler(),其内容如下:
- void RTC_AlarmHandle(void)
- {
- /* Alarm 标识 */
- g_bAlarm = TRUE;
- }
- void RTC_IRQHandler(void)
- {
- if ( (RTC->INTEN & RTC_INTEN_ALMIEN_Msk) && (RTC->INTSTS & RTC_INTSTS_ALMIF_Msk) )
- {
- RTC->INTSTS = 0x1;
- RTC_AlarmHandle();
- }
- }
主函数的作用为:设置RTC计时值、设置定时值、启动RTC、使能定时中断、显示秒计时值、显示RTC定时器状态等,主函数的内容如下:
- int32_t main(void)
- {
- S_RTC_TIME_DATA_T sInitTime;
- S_RTC_TIME_DATA_T sCurTime;
- SYS_Init();
- GPIO_Configuration();
- SetLCD_CS_Low();
- PD7 = 1;
- LCD_Init();
- LCD_Clear();
- LCD_write_english_string(0,0,"Nokia5110 v1.0");
-
- /* 起始时间设置 */
- sInitTime.u32Year = 2017;
- sInitTime.u32Month = 6;
- sInitTime.u32Day = 10;
- sInitTime.u32Hour = 12;
- sInitTime.u32Minute = 30;
- sInitTime.u32Second = 10;
- sInitTime.u32Dayelecfans = RTC_TUESDAY;
- sInitTime.u32TimeScale = RTC_CLOCK_24;
- RTC_Open(&sInitTime);
- /* 显示定时长度 */
- LCD_write_english_string(0,0,"RTC Alarm Test - 40s");
- g_bAlarm = FALSE;
- /* 获取当前时间 */
- RTC_GetDateAndTime(&sCurTime);
- /* 显示秒计时值 */
- LCD_set_XY(0,2);
- LCD_write_char(sCurTime.u32Second/10 + '0');
- LCD_write_char(sCurTime.u32Second%10 + '0');
-
- /* 设置闹钟时间 */
- sCurTime.u32Second = sCurTime.u32Second + 31;
- RTC_SetAlarmDateAndTime(&sCurTime);
- /* 使能RTC Alarm 中断 */
- RTC_EnableInt(RTC_INTEN_ALMIEN_Msk);
- NVIC_EnableIRQ(RTC_IRQn);
- /* 显示秒计数值 */
- while(!g_bAlarm)
- {
- RTC_GetDateAndTime(&sCurTime);
- LCD_set_XY(0,2);
- LCD_write_char(sCurTime.u32Second/10 + '0');
- LCD_write_char(sCurTime.u32Second%10 + '0');
- }
-
- /* 关闭 RTC Alarm I中断 */
- RTC_DisableInt(RTC_INTEN_ALMIEN_Msk);
- NVIC_DisableIRQ(RTC_IRQn);
- /* 提示RTC Alarm 测试完成 */
- LCD_write_english_string(0,0,"RTC Alarm Test End !");
- while(1);
- }
经编译和下载,其执行效果如图1和图2所示。如添加一个继电器则可使用该程序实现对电器的定时控制。
图1 定时测试进行中
图2 完成定时测试