Si-Labs EFM32 Back Up domain and BUrtc demo.
Dependencies: EFM32_BUrtc EFM32_CapSenseSlider EFM32_SegmentLCD mbed
main.cpp
00001 00002 #include "mbed.h" 00003 #include "EFM32_SegmentLCD.h" 00004 #include "EFM32_CapSenseSlider.h" 00005 #include "BUrtc.h" 00006 00007 silabs::EFM32_SegmentLCD segmentDisplay; 00008 silabs::EFM32_CapSenseSlider capSlider; 00009 00010 InterruptIn MinMonth(SW0); 00011 InterruptIn HourDate(SW1); 00012 00013 DigitalOut led1(LED1); 00014 DigitalOut led2(LED2); 00015 00016 char timebuff[20], lcdTime[8]; 00017 int initialized = false; 00018 int month,date,lcdDate,slider; 00019 00020 struct tm t; 00021 00022 void displayRefresh(),timeSet(),dateSet(); 00023 00024 int main() 00025 { 00026 // set up BU domain and BUrtc if not started, else restore system RTC from BUrtc 00027 BUrtcInit(); 00028 00029 // set the reset time 00030 t.tm_sec = 0; // 0-59 00031 t.tm_min = 0; // 0-59 00032 t.tm_hour = 0; // 0-23 00033 t.tm_mday = 17; // 1-31 00034 t.tm_mon = 4; // 0-11 00035 t.tm_year = 116; // years since 1900 00036 00037 // time setting button interrupts 00038 HourDate.fall(&timeSet); 00039 MinMonth.fall(&timeSet); 00040 capSlider.start(); 00041 capSlider.attach_slide(-1, dateSet); 00042 00043 while(1) { 00044 00045 // Sleep while waiting for interrupt 00046 EMU_EnterEM2(true); 00047 // Run display update code on wake up 00048 displayRefresh(); 00049 } 00050 } 00051 00052 void displayRefresh() 00053 { 00054 if (!initialized) { 00055 segmentDisplay.Symbol(LCD_SYMBOL_COL3,true); 00056 segmentDisplay.Symbol(LCD_SYMBOL_COL5,true); 00057 SegmentLCD_Symbol(LCD_SYMBOL_DP10, true); 00058 // set time if RTC is reset 00059 if(time(NULL)<10) { 00060 RTCset(mktime(&t)); 00061 } 00062 initialized = true; 00063 } 00064 time_t seconds = time(NULL); 00065 strftime(timebuff, 2,"%d", localtime(&seconds)); 00066 date = atoi(timebuff); 00067 strftime(timebuff, 2,"%m", localtime(&seconds)); 00068 month = atoi(timebuff); 00069 lcdDate = ((date %31)* 100 + (month % 12)); 00070 strftime(lcdTime,8,"%H%M%S", localtime(&seconds)); 00071 00072 SegmentLCD_Write(lcdTime); 00073 segmentDisplay.Number(lcdDate); 00074 segmentDisplay.Symbol(LCD_SYMBOL_EFM32, seconds & 0x1); 00075 led1=0;led2=0; 00076 } 00077 00078 void dateSet() { 00079 00080 // set date by tapping slider, slow and fast settings 00081 slider = capSlider.get_position(); 00082 led2=!led2; 00083 time_t seconds = time(NULL); 00084 seconds=seconds + (86400 * (slider/10)); 00085 RTCset(seconds); 00086 } 00087 00088 void timeSet() 00089 { 00090 // set hours and minutes with buttons, set date first, can't go backwards 00091 led1=!led1; 00092 time_t seconds = time(NULL); 00093 if(MinMonth){seconds=seconds+60;} 00094 if(HourDate){seconds=seconds+3600;} 00095 RTCset(seconds); 00096 } 00097
Generated on Fri Jul 15 2022 13:50:13 by 1.7.2