DS3232M RTC demo program. Tested on the K64F (this example) and the KL25Z, but should work on any platform by changing the SDA and SCL pins. USB serial baud rate is 230400, tested on TeraTerm. Demo includes setting the DS3232's time, turning on and off the 32KHz and 1Hz outputs and accessing the DS3232's temperature. Also included are DS3232 user RAM access tests and user RAM CRC data calculations. Since user RAM is battery backed up, CRC routines are included to insure that the data stored in user RAM is intact.

Dependencies:   ds3232m mbed mbed-rtos

Committer:
loopsva
Date:
Fri Dec 19 20:28:39 2014 +0000
Revision:
1:c891c3930f4e
Parent:
0:8d18e427a06b
Child:
2:958004aa28a4
Additional example commands to save and restore text strings in DS3232 user RAM, display user RAM CRC16 data, RTOS hooks.  The RTOS can be enabled by un-commenting line #define "rtos.h".  Tested on K64F (this example) and the KL25Z, with and w/o RTOS

Who changed what in which revision?

UserRevisionLine numberNew contents of line
loopsva 0:8d18e427a06b 1 #include "mbed.h"
loopsva 1:c891c3930f4e 2 //#include "rtos.h" //mbed rtos - uncomment to make RTOS available
loopsva 0:8d18e427a06b 3 #include "ds3232m.h" //Maxim RTC
loopsva 0:8d18e427a06b 4
loopsva 1:c891c3930f4e 5 RawSerial pc(USBTX, USBRX); //onsole interface
loopsva 1:c891c3930f4e 6
loopsva 1:c891c3930f4e 7 #ifdef RTOS_H
loopsva 1:c891c3930f4e 8 Mutex MutexI2C0; //lock/unlock I2C requests
loopsva 1:c891c3930f4e 9 #endif //RTOS_H
loopsva 0:8d18e427a06b 10
loopsva 0:8d18e427a06b 11 #define SDA0 PTE25
loopsva 0:8d18e427a06b 12 #define SCL0 PTE24
loopsva 0:8d18e427a06b 13 ds3232m rtc(SDA0, SCL0, 400000); //Maxim real time clock
loopsva 0:8d18e427a06b 14
loopsva 0:8d18e427a06b 15 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:8d18e427a06b 16 // Time variables
loopsva 0:8d18e427a06b 17
loopsva 0:8d18e427a06b 18 time_t ctTime; //time structure
loopsva 0:8d18e427a06b 19 int DST = 1; //Daylight Saving Time (or as defined in .ini file)
loopsva 0:8d18e427a06b 20 int TZone = -8; //Time Zone from UTC (or as defined in .ini file)
loopsva 0:8d18e427a06b 21 char timebuf_hms[10]; //local time format buffer - 21:16:43
loopsva 0:8d18e427a06b 22 char timebuf_dMyy[14]; //local time format buffer - 01-Apr-2014
loopsva 0:8d18e427a06b 23 char timebuf_dow[1]; //local time format buffer - 5
loopsva 0:8d18e427a06b 24 int StartTime = 0; //time we powered up
loopsva 1:c891c3930f4e 25 bool allowDisplayTime = false; //used to stop displaying date/time when entering data from the console
loopsva 0:8d18e427a06b 26
loopsva 0:8d18e427a06b 27 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:8d18e427a06b 28 //Variables for USB Serial Port RX
loopsva 0:8d18e427a06b 29
loopsva 0:8d18e427a06b 30 uint32_t pcRxQty = 0; //RX data counter/pointer
loopsva 0:8d18e427a06b 31 char pcRxBuffer[128]; //RX data buffer
loopsva 0:8d18e427a06b 32 bool pcRxLine = false; //CR or LF detected (end of line)
loopsva 0:8d18e427a06b 33 bool pcRxEOB = false; //RX buffer is full!!! cannot accept any more characters
loopsva 0:8d18e427a06b 34 char inchar = 0; //RX input character
loopsva 0:8d18e427a06b 35
loopsva 0:8d18e427a06b 36 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:8d18e427a06b 37 // This function is called when a character goes into the RX buffer.
loopsva 0:8d18e427a06b 38
loopsva 0:8d18e427a06b 39 #define DOUPONELINE "\033[1A"
loopsva 0:8d18e427a06b 40 #define BS 0x08 //ascii backspace
loopsva 0:8d18e427a06b 41 #define CR 0x0d //ascii CR
loopsva 0:8d18e427a06b 42 #define LF 0x0a //ascii LF
loopsva 1:c891c3930f4e 43 #define ticC 0x03 //ascii control C
loopsva 1:c891c3930f4e 44 #define DEGC_DEGF_FLOAT 9.0 / 5.0 + 32.0
loopsva 0:8d18e427a06b 45
loopsva 0:8d18e427a06b 46 void PcRxChar(char inchar) {
loopsva 0:8d18e427a06b 47 if(inchar == CR) pc.printf(" %c %c", BS, BS); //NOTE: Bug in K64F has issue with CR and/or LF, these 2 lines are needed
loopsva 0:8d18e427a06b 48 if(inchar == LF) pc.printf(" %c %c", BS, BS);
loopsva 0:8d18e427a06b 49 if(inchar == BS) {
loopsva 0:8d18e427a06b 50 if(pcRxQty == 0) {
loopsva 0:8d18e427a06b 51 pcRxBuffer[pcRxQty] = 0;
loopsva 0:8d18e427a06b 52 } else {
loopsva 0:8d18e427a06b 53 pc.printf("%c %c", BS, BS);
loopsva 0:8d18e427a06b 54 pcRxQty--;
loopsva 0:8d18e427a06b 55 pcRxBuffer[pcRxQty] = 0;
loopsva 0:8d18e427a06b 56 }
loopsva 0:8d18e427a06b 57 } else if((inchar == CR) || (inchar == LF)) {
loopsva 0:8d18e427a06b 58 pcRxLine = true;
loopsva 0:8d18e427a06b 59 pc.printf("\r\n");
loopsva 1:c891c3930f4e 60 } else if(inchar == ticC) {
loopsva 1:c891c3930f4e 61 NVIC_SystemReset();
loopsva 0:8d18e427a06b 62 } else {
loopsva 0:8d18e427a06b 63 if(pcRxQty < (sizeof(pcRxBuffer) - 2)) {
loopsva 0:8d18e427a06b 64 pcRxBuffer[pcRxQty] = inchar;
loopsva 0:8d18e427a06b 65 pcRxQty++;
loopsva 0:8d18e427a06b 66 pcRxBuffer[pcRxQty] = 0;
loopsva 0:8d18e427a06b 67 pc.printf("%c", pcRxBuffer[pcRxQty - 1]);
loopsva 0:8d18e427a06b 68 } else {
loopsva 0:8d18e427a06b 69 pc.printf ("\r\n*** pcRxBuffer is full!!\r\n");
loopsva 0:8d18e427a06b 70 pcRxEOB = true;
loopsva 0:8d18e427a06b 71 }
loopsva 0:8d18e427a06b 72 }
loopsva 0:8d18e427a06b 73 }
loopsva 0:8d18e427a06b 74
loopsva 0:8d18e427a06b 75 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 1:c891c3930f4e 76 // Read received chars from USB UART interrupt
loopsva 0:8d18e427a06b 77
loopsva 1:c891c3930f4e 78 void PcRxIRQ(void){
loopsva 0:8d18e427a06b 79 #if defined(TARGET_KL25Z)
loopsva 0:8d18e427a06b 80 NVIC_DisableIRQ(UART0_IRQn); // n=0, 1 or 2 Disable Rx interrupt on kl25z
loopsva 0:8d18e427a06b 81 #endif
loopsva 0:8d18e427a06b 82 #if defined(TARGET_K64F)
loopsva 0:8d18e427a06b 83 NVIC_DisableIRQ(UART0_RX_TX_IRQn); // n=0, 1 or 2 Disable Rx interrupt on k64f
loopsva 0:8d18e427a06b 84 #endif
loopsva 0:8d18e427a06b 85 #if defined(TARGET_LPC1768)
loopsva 0:8d18e427a06b 86 LPC_UART0->IER = 0; //Disable Rx interrupt on mbed1768
loopsva 0:8d18e427a06b 87 #endif
loopsva 0:8d18e427a06b 88 while (pc.readable()) {
loopsva 0:8d18e427a06b 89 inchar = pc.getc(); //<<<<< broken here!!!! //read data from USB
loopsva 0:8d18e427a06b 90 PcRxChar(inchar); //go process char
loopsva 0:8d18e427a06b 91 }
loopsva 0:8d18e427a06b 92 #if defined(TARGET_KL25Z)
loopsva 0:8d18e427a06b 93 NVIC_EnableIRQ(UART0_IRQn); // n=0, 1 or 2 Re-enable Rx interrupt on kl25z
loopsva 0:8d18e427a06b 94 #endif
loopsva 0:8d18e427a06b 95 #if defined(TARGET_K64F)
loopsva 0:8d18e427a06b 96 NVIC_EnableIRQ(UART0_RX_TX_IRQn); // n=0, 1 or 2 Re-enable Rx interrupt on k64f
loopsva 0:8d18e427a06b 97 #endif
loopsva 0:8d18e427a06b 98 #if defined(TARGET_LPC1768)
loopsva 0:8d18e427a06b 99 LPC_UART0->IER = 1; //RE-enable Rx interrupt on mbed1768
loopsva 0:8d18e427a06b 100 #endif
loopsva 0:8d18e427a06b 101 }
loopsva 0:8d18e427a06b 102
loopsva 0:8d18e427a06b 103 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 1:c891c3930f4e 104 //clear RxData buffer with all 00's and clear flags
loopsva 0:8d18e427a06b 105
loopsva 0:8d18e427a06b 106 void pcClrLineBuf() {
loopsva 0:8d18e427a06b 107 pcRxQty = 0; // data counter/pointer
loopsva 0:8d18e427a06b 108 for(int i = 0; i < (sizeof(pcRxBuffer) - 1); i++) pcRxBuffer[i] = 0; // clear out rx buffer
loopsva 0:8d18e427a06b 109 pcRxLine = false;
loopsva 0:8d18e427a06b 110 pcRxEOB = false;
loopsva 0:8d18e427a06b 111 }
loopsva 0:8d18e427a06b 112
loopsva 0:8d18e427a06b 113 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 1:c891c3930f4e 114 // Update time display values
loopsva 0:8d18e427a06b 115
loopsva 0:8d18e427a06b 116 void UpdateTimeRegs() {
loopsva 0:8d18e427a06b 117 strftime(timebuf_dMyy, 14, "%d-%b-%Y", localtime(&ctTime));
loopsva 0:8d18e427a06b 118 strftime(timebuf_hms, 10, "%H:%M:%S", localtime(&ctTime));
loopsva 0:8d18e427a06b 119 strftime(timebuf_dow, 1, "%u", localtime(&ctTime));
loopsva 0:8d18e427a06b 120 }
loopsva 0:8d18e427a06b 121
loopsva 0:8d18e427a06b 122 void UpdateTime() {
loopsva 0:8d18e427a06b 123 ctTime = time(NULL) + ((TZone + DST) * 3600); //timezone and dst offsets
loopsva 0:8d18e427a06b 124 UpdateTimeRegs();
loopsva 0:8d18e427a06b 125 }
loopsva 0:8d18e427a06b 126
loopsva 0:8d18e427a06b 127 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:8d18e427a06b 128 // display current local date and time
loopsva 0:8d18e427a06b 129
loopsva 0:8d18e427a06b 130 void PrintDateTime() {
loopsva 1:c891c3930f4e 131 pc.printf("%sDate: %s ", DOUPONELINE, timebuf_dMyy);
loopsva 0:8d18e427a06b 132 pc.printf("Time: %s \r\n", timebuf_hms);
loopsva 0:8d18e427a06b 133 }
loopsva 0:8d18e427a06b 134
loopsva 0:8d18e427a06b 135 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:8d18e427a06b 136 //Manually set the date and time
loopsva 0:8d18e427a06b 137
loopsva 0:8d18e427a06b 138 ds3232m::Time_rtc rtc_m = {};
loopsva 0:8d18e427a06b 139 struct tm t;
loopsva 0:8d18e427a06b 140
loopsva 0:8d18e427a06b 141 bool SetRTC() {
loopsva 0:8d18e427a06b 142 pc.printf("Enter current date and time:\n");
loopsva 0:8d18e427a06b 143 pc.printf("MM DD YY HH MM SS[enter]\n");
loopsva 0:8d18e427a06b 144 pcClrLineBuf();
loopsva 0:8d18e427a06b 145
loopsva 0:8d18e427a06b 146 //wait for string above
loopsva 0:8d18e427a06b 147 do{
loopsva 1:c891c3930f4e 148 #ifdef RTOS_H
loopsva 1:c891c3930f4e 149 Thread::wait(10);
loopsva 1:c891c3930f4e 150 #else
loopsva 0:8d18e427a06b 151 wait_ms(10);
loopsva 1:c891c3930f4e 152 #endif
loopsva 0:8d18e427a06b 153 } while((pcRxLine == false) && (pcRxEOB == false));
loopsva 0:8d18e427a06b 154
loopsva 0:8d18e427a06b 155 //load up the time structure
loopsva 0:8d18e427a06b 156 t.tm_year = (2000 + ((pcRxBuffer[6] - '0') * 10) + pcRxBuffer[7] - '0');
loopsva 0:8d18e427a06b 157 t.tm_mon = (((pcRxBuffer[0] - '0') * 10) + pcRxBuffer[1] - '0');
loopsva 0:8d18e427a06b 158 t.tm_mday = (((pcRxBuffer[3] - '0') * 10) + pcRxBuffer[4] - '0');
loopsva 0:8d18e427a06b 159 t.tm_hour = (((pcRxBuffer[9] - '0') * 10) + pcRxBuffer[10] - '0');
loopsva 0:8d18e427a06b 160 t.tm_min = (((pcRxBuffer[12] - '0') * 10) + pcRxBuffer[13] - '0');
loopsva 0:8d18e427a06b 161 t.tm_sec = (((pcRxBuffer[15] - '0') * 10) + pcRxBuffer[16] - '0');
loopsva 0:8d18e427a06b 162
loopsva 0:8d18e427a06b 163 //adjust for tm structure required values
loopsva 0:8d18e427a06b 164 t.tm_year = t.tm_year - 1900;
loopsva 0:8d18e427a06b 165 t.tm_mon = t.tm_mon - 1;
loopsva 0:8d18e427a06b 166 t.tm_wday = t.tm_wday & 7;
loopsva 0:8d18e427a06b 167
loopsva 0:8d18e427a06b 168 //if error exists, exit without changing time
loopsva 1:c891c3930f4e 169 if(t.tm_year < 113) return(32);
loopsva 1:c891c3930f4e 170 if(t.tm_mon > 12) return(16);
loopsva 1:c891c3930f4e 171 if(t.tm_mday > 31) return(8);
loopsva 1:c891c3930f4e 172 if(t.tm_hour > 23) return(4);
loopsva 1:c891c3930f4e 173 if(t.tm_min > 59) return(2);
loopsva 0:8d18e427a06b 174 if(t.tm_sec > 59) return(1);
loopsva 0:8d18e427a06b 175
loopsva 0:8d18e427a06b 176 //set up the DS3232's RTC
loopsva 0:8d18e427a06b 177 rtc_m.sec = t.tm_sec;
loopsva 0:8d18e427a06b 178 rtc_m.min = t.tm_min;
loopsva 0:8d18e427a06b 179 rtc_m.hour = t.tm_hour;
loopsva 0:8d18e427a06b 180 rtc_m.wday = t.tm_wday;
loopsva 0:8d18e427a06b 181 rtc_m.date = t.tm_mday;
loopsva 0:8d18e427a06b 182 rtc_m.mon = t.tm_mon + 1;
loopsva 0:8d18e427a06b 183 rtc_m.year = t.tm_year + 1900;
loopsva 0:8d18e427a06b 184 rtc.setTime(rtc_m); //(time structure)
loopsva 0:8d18e427a06b 185
loopsva 0:8d18e427a06b 186 //set the mbed's time
loopsva 0:8d18e427a06b 187 time_t ctTime = mktime(&t);
loopsva 0:8d18e427a06b 188 //reset system up time since it will be out of whack once the time is updated
loopsva 0:8d18e427a06b 189 StartTime = ctTime; //have to change sysuptime now
loopsva 0:8d18e427a06b 190 ctTime = ctTime - (TZone + DST) * 3600; //take out local time
loopsva 0:8d18e427a06b 191 set_time(ctTime);
loopsva 0:8d18e427a06b 192 UpdateTime();
loopsva 0:8d18e427a06b 193 return(0);
loopsva 0:8d18e427a06b 194 }
loopsva 0:8d18e427a06b 195
loopsva 0:8d18e427a06b 196 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:8d18e427a06b 197 // Load the local mbed-RTC from that external DS3232 RTC
loopsva 0:8d18e427a06b 198
loopsva 0:8d18e427a06b 199 void loadRTC() {
loopsva 0:8d18e427a06b 200 //get data from DS3232
loopsva 0:8d18e427a06b 201 rtc.getTime(rtc_m);
loopsva 0:8d18e427a06b 202 t.tm_sec = rtc_m.sec;
loopsva 0:8d18e427a06b 203 t.tm_min = rtc_m.min;
loopsva 0:8d18e427a06b 204 t.tm_hour = rtc_m.hour;
loopsva 0:8d18e427a06b 205 t.tm_mday = rtc_m.date;
loopsva 0:8d18e427a06b 206 t.tm_mon = rtc_m.mon - 1;
loopsva 0:8d18e427a06b 207 t.tm_year = rtc_m.year - 1900;
loopsva 0:8d18e427a06b 208
loopsva 0:8d18e427a06b 209 //set the mbed's time
loopsva 0:8d18e427a06b 210 time_t ctTime = mktime(&t);
loopsva 0:8d18e427a06b 211 ctTime = ctTime - (TZone + DST) * 3600; //take out local time
loopsva 0:8d18e427a06b 212 set_time(ctTime);
loopsva 0:8d18e427a06b 213 UpdateTime();
loopsva 0:8d18e427a06b 214 }
loopsva 0:8d18e427a06b 215
loopsva 0:8d18e427a06b 216 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:8d18e427a06b 217 // Pull the temperature out of the DS3232 RTC
loopsva 0:8d18e427a06b 218
loopsva 0:8d18e427a06b 219 void Get3232Temp() {
loopsva 0:8d18e427a06b 220 pc.printf("%c", BS);
loopsva 0:8d18e427a06b 221 if(rtc.startTempCycle() == true) {
loopsva 0:8d18e427a06b 222 pc.printf(" - DS3232M start converstion ok \r\n");
loopsva 0:8d18e427a06b 223 } else {
loopsva 0:8d18e427a06b 224 pc.printf(" - DS3232M start converstion BUSY!!! \r\n");
loopsva 0:8d18e427a06b 225 }
loopsva 0:8d18e427a06b 226
loopsva 0:8d18e427a06b 227 //wait for DS3232 temperature conversion to finish
loopsva 0:8d18e427a06b 228 int i = 80;
loopsva 0:8d18e427a06b 229 for(i = 80; i > 0; i--) {
loopsva 1:c891c3930f4e 230 #ifdef RTOS_H
loopsva 1:c891c3930f4e 231 Thread::wait(20);
loopsva 1:c891c3930f4e 232 #else
loopsva 0:8d18e427a06b 233 wait_ms(20);
loopsva 1:c891c3930f4e 234 #endif
loopsva 0:8d18e427a06b 235 if((rtc.checkTempBusy()) == true) break;
loopsva 0:8d18e427a06b 236 }
loopsva 0:8d18e427a06b 237
loopsva 0:8d18e427a06b 238 //timed out or display temperature
loopsva 0:8d18e427a06b 239 if(i > 0) {
loopsva 1:c891c3930f4e 240 float ds3232tempC = rtc.getTemperature();
loopsva 1:c891c3930f4e 241 pc.printf(" - DS3232M Temperature: %.2fC %.1fF\r\n", ds3232tempC, ds3232tempC * DEGC_DEGF_FLOAT);
loopsva 0:8d18e427a06b 242 } else {
loopsva 0:8d18e427a06b 243 pc.printf("*** DS3232M Temperature timeout!!!!\r\n");
loopsva 0:8d18e427a06b 244 }
loopsva 0:8d18e427a06b 245 }
loopsva 0:8d18e427a06b 246
loopsva 0:8d18e427a06b 247 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 1:c891c3930f4e 248 // Checking for characters to execute commands from. It's a thread if RTOS is used.
loopsva 1:c891c3930f4e 249
loopsva 1:c891c3930f4e 250 #ifdef RTOS_H
loopsva 1:c891c3930f4e 251 void cli_thread(void const *argument) {
loopsva 1:c891c3930f4e 252 pc.printf(" - Starting CLI RTOS thread\r\n");
loopsva 1:c891c3930f4e 253 while (true) { //while loop only for RTOS
loopsva 1:c891c3930f4e 254 Thread::wait(73);
loopsva 1:c891c3930f4e 255 #else
loopsva 1:c891c3930f4e 256 void cli_thread() {
loopsva 1:c891c3930f4e 257 #endif
loopsva 1:c891c3930f4e 258 if(pcRxQty != 0) {
loopsva 1:c891c3930f4e 259 pc.printf("\r\n");
loopsva 1:c891c3930f4e 260 if(pcRxBuffer[0] == 'A') rtc.set32KhzOutput(true, false); //turn on 32KHz output
loopsva 1:c891c3930f4e 261 if(pcRxBuffer[0] == 'a') rtc.set32KhzOutput(false, false); //turn off 32KHz output
loopsva 1:c891c3930f4e 262 if(pcRxBuffer[0] == 'B') rtc.set1hzOutput(true, false); //turn on 1Hz output
loopsva 1:c891c3930f4e 263 if(pcRxBuffer[0] == 'b') rtc.set1hzOutput(false, false); //turn off 1Hz output
loopsva 1:c891c3930f4e 264 if(pcRxBuffer[0] == 'c') {
loopsva 1:c891c3930f4e 265 allowDisplayTime = true;
loopsva 1:c891c3930f4e 266 SetRTC(); //change DS3232 time
loopsva 1:c891c3930f4e 267 allowDisplayTime = false;
loopsva 1:c891c3930f4e 268 pcRxBuffer[0] = 'c';
loopsva 1:c891c3930f4e 269 }
loopsva 1:c891c3930f4e 270 if(pcRxBuffer[0] == 'g') { //get and display stored data string
loopsva 1:c891c3930f4e 271 if(rtc.getUserRAM(pcRxBuffer, 128, 126) != 0) {
loopsva 1:c891c3930f4e 272 pc.printf("Get user RAM error!!\r\n");
loopsva 1:c891c3930f4e 273 } else if(pcRxBuffer[0] == NULL) {
loopsva 1:c891c3930f4e 274 pc.printf("User RAM empty!!\r\n");
loopsva 1:c891c3930f4e 275 } else {
loopsva 1:c891c3930f4e 276 //pcRxBuffer[31] = NULL; //guarantee that the string max length is 32 bytes
loopsva 1:c891c3930f4e 277 pc.printf("%s\r\n", pcRxBuffer);
loopsva 1:c891c3930f4e 278 }
loopsva 1:c891c3930f4e 279 pcRxBuffer[0] = 'g';
loopsva 1:c891c3930f4e 280 }
loopsva 1:c891c3930f4e 281 if(pcRxBuffer[0] == 's') { //save data string
loopsva 1:c891c3930f4e 282 allowDisplayTime = true;
loopsva 1:c891c3930f4e 283 pc.printf("Enter text string to save: ");
loopsva 1:c891c3930f4e 284 pcClrLineBuf();
loopsva 1:c891c3930f4e 285 do {
loopsva 1:c891c3930f4e 286 #ifdef RTOS_H
loopsva 1:c891c3930f4e 287 Thread::wait(20);
loopsva 1:c891c3930f4e 288 #else
loopsva 1:c891c3930f4e 289 wait_ms(20);
loopsva 1:c891c3930f4e 290 #endif
loopsva 1:c891c3930f4e 291 } while((pcRxLine == false) && (pcRxEOB == false));
loopsva 1:c891c3930f4e 292 if(rtc.putUserRAM(pcRxBuffer, 128, pcRxQty + 2) != 0) {
loopsva 1:c891c3930f4e 293 pc.printf("Put user RAM error!!\r\n");
loopsva 1:c891c3930f4e 294 }
loopsva 1:c891c3930f4e 295 allowDisplayTime = false;
loopsva 1:c891c3930f4e 296 pcRxBuffer[0] = 's';
loopsva 1:c891c3930f4e 297 }
loopsva 1:c891c3930f4e 298 if(pcRxBuffer[0] == 't') Get3232Temp(); //display the DS3232's temperature
loopsva 1:c891c3930f4e 299 if(pcRxBuffer[0] == 'z') {
loopsva 1:c891c3930f4e 300 rtc.LoadRTCRam();
loopsva 1:c891c3930f4e 301 pc.printf("CRC16 value: 0x%04X\r\n", rtc.calculateCRC16(rtc.RTCbuffer, 0x14, 0xea));
loopsva 1:c891c3930f4e 302 }
loopsva 1:c891c3930f4e 303 if((pcRxBuffer[0] != 'a') && (pcRxBuffer[0] != 'A') && (pcRxBuffer[0] != 'b')
loopsva 1:c891c3930f4e 304 && (pcRxBuffer[0] != 'B') && (pcRxBuffer[0] != 'c') && (pcRxBuffer[0] != 'g')
loopsva 1:c891c3930f4e 305 && (pcRxBuffer[0] != 's') && (pcRxBuffer[0] != 't') && (pcRxBuffer[0] != 'z')) pc.printf("Entry Error!!\r\n");
loopsva 1:c891c3930f4e 306 pc.printf("\r\n");
loopsva 1:c891c3930f4e 307 pcClrLineBuf();
loopsva 1:c891c3930f4e 308 }
loopsva 1:c891c3930f4e 309 #ifdef RTOS_H
loopsva 1:c891c3930f4e 310 } //RTOS while loop
loopsva 1:c891c3930f4e 311 #endif
loopsva 1:c891c3930f4e 312 }
loopsva 1:c891c3930f4e 313
loopsva 1:c891c3930f4e 314 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:8d18e427a06b 315
loopsva 0:8d18e427a06b 316 int main() {
loopsva 0:8d18e427a06b 317 pc.baud(230400);
loopsva 0:8d18e427a06b 318 ctTime = time(NULL);
loopsva 0:8d18e427a06b 319 StartTime = ctTime; //get time we started up
loopsva 1:c891c3930f4e 320 pc.printf("\r\n\r\nDS3232M demo 19-DEC-2014 K. Braun\r\n");
loopsva 0:8d18e427a06b 321
loopsva 1:c891c3930f4e 322 //check for RTOS operation
loopsva 1:c891c3930f4e 323 #ifdef RTOS_H
loopsva 1:c891c3930f4e 324 pc.printf("RTOS installed...\r\n");
loopsva 1:c891c3930f4e 325 #else
loopsva 1:c891c3930f4e 326 pc.printf("not using RTOS...\r\n");
loopsva 1:c891c3930f4e 327 #endif
loopsva 1:c891c3930f4e 328
loopsva 0:8d18e427a06b 329 //pc RX character callback interrupt
loopsva 0:8d18e427a06b 330 pc.printf("Initializing Serial Port Rx Interrupt... \r\n");
loopsva 1:c891c3930f4e 331 pc.attach(&PcRxIRQ, pc.RxIrq);
loopsva 0:8d18e427a06b 332
loopsva 0:8d18e427a06b 333 pc.printf("Checking the mbed's RTC...\r\n");
loopsva 1:c891c3930f4e 334 #ifdef RTOS_H
loopsva 1:c891c3930f4e 335 Thread::wait(1500);
loopsva 1:c891c3930f4e 336 #else
loopsva 1:c891c3930f4e 337 wait_ms(1500);
loopsva 1:c891c3930f4e 338 #endif
loopsva 1:c891c3930f4e 339
loopsva 0:8d18e427a06b 340 ctTime = time(NULL);
loopsva 0:8d18e427a06b 341
loopsva 0:8d18e427a06b 342 //first, see if K64F's RTC already running
loopsva 0:8d18e427a06b 343 if((StartTime == ctTime) || (ctTime <= 1000000000)) {
loopsva 1:c891c3930f4e 344 pc.printf("*** mbed's local RTC is not initialized\r\n");
loopsva 0:8d18e427a06b 345 loadRTC();
loopsva 0:8d18e427a06b 346 StartTime = ctTime;
loopsva 0:8d18e427a06b 347
loopsva 0:8d18e427a06b 348 //now see if DS3232's clock needs to be set
loopsva 0:8d18e427a06b 349 if(ctTime <= 1000000000) {
loopsva 0:8d18e427a06b 350 pc.printf("*** Local RTC stopped, initializing the RTC. !!CHECK BATTERY!!\r\n");
loopsva 0:8d18e427a06b 351 pc.printf("*** Note: Time is incorrect, needs to be updated!!!\r\n");
loopsva 0:8d18e427a06b 352
loopsva 0:8d18e427a06b 353 //set up the DS3232's clock
loopsva 0:8d18e427a06b 354 if(SetRTC() != 0) pc.printf("Entry Error!!");
loopsva 0:8d18e427a06b 355 pcClrLineBuf();
loopsva 0:8d18e427a06b 356 }
loopsva 0:8d18e427a06b 357 }
loopsva 0:8d18e427a06b 358
loopsva 0:8d18e427a06b 359 //sync up the mbed's time with the DS3232's time
loopsva 0:8d18e427a06b 360 loadRTC();
loopsva 0:8d18e427a06b 361 StartTime = ctTime;
loopsva 0:8d18e427a06b 362 pc.printf(" - RTC Start Time: ");
loopsva 0:8d18e427a06b 363 PrintDateTime();
loopsva 0:8d18e427a06b 364 pc.printf(" - Day of Week: %s\r\n", timebuf_dow); //day of the week
loopsva 0:8d18e427a06b 365
loopsva 0:8d18e427a06b 366 //get the DS3232's temperature
loopsva 0:8d18e427a06b 367 Get3232Temp();
loopsva 0:8d18e427a06b 368
loopsva 1:c891c3930f4e 369 #ifdef RTOS_H
loopsva 1:c891c3930f4e 370 //turn on the rest of the os threads
loopsva 1:c891c3930f4e 371 pc.printf("Initializing os threads...\r\n");
loopsva 1:c891c3930f4e 372 Thread th3(cli_thread, NULL, osPriorityNormal);
loopsva 1:c891c3930f4e 373 Thread::wait(300);
loopsva 1:c891c3930f4e 374 #endif
loopsva 1:c891c3930f4e 375
loopsva 0:8d18e427a06b 376 int CheckTime = ctTime;
loopsva 0:8d18e427a06b 377 pc.printf("Hit 'A' or 'a' key to turn on/off the 32KHz output\r\n");
loopsva 0:8d18e427a06b 378 pc.printf("Hit 'B' or 'b' key to turn on/off the 1Hz output (1Hz pin needs pull-up)\r\n");
loopsva 1:c891c3930f4e 379 pc.printf("Hit 'c' key to change the time in the DS3232's\r\n");
loopsva 1:c891c3930f4e 380 pc.printf("Hit 'g' key to get the data string from DS3232 user RAM\r\n");
loopsva 1:c891c3930f4e 381 pc.printf("Hit 's' key to store a data string in the DS3232 user RAM\r\n");
loopsva 0:8d18e427a06b 382 pc.printf("Hit 't' key to get the DS3232's temperature\r\n");
loopsva 1:c891c3930f4e 383 pc.printf("Hit 'z' key to get the user RAM CRC data\r\n");
loopsva 1:c891c3930f4e 384 pc.printf("Hit '^C' key to reboot\r\n");
loopsva 1:c891c3930f4e 385 pc.printf("\r\n");
loopsva 0:8d18e427a06b 386
loopsva 0:8d18e427a06b 387 //Ready!!
loopsva 0:8d18e427a06b 388 while (true) {
loopsva 1:c891c3930f4e 389 #ifdef RTOS_H
loopsva 1:c891c3930f4e 390 Thread::wait(50);
loopsva 1:c891c3930f4e 391 #else
loopsva 1:c891c3930f4e 392 wait_ms(50);
loopsva 1:c891c3930f4e 393 #endif
loopsva 0:8d18e427a06b 394 UpdateTime();
loopsva 0:8d18e427a06b 395 if(CheckTime != ctTime) {
loopsva 0:8d18e427a06b 396 CheckTime = ctTime;
loopsva 1:c891c3930f4e 397 if(allowDisplayTime == false) PrintDateTime();
loopsva 0:8d18e427a06b 398 }
loopsva 1:c891c3930f4e 399 #ifndef RTOS_H
loopsva 1:c891c3930f4e 400 cli_thread();
loopsva 1:c891c3930f4e 401 #endif
loopsva 0:8d18e427a06b 402 }
loopsva 0:8d18e427a06b 403 }