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:
Thu Dec 25 21:43:17 2014 +0000
Revision:
3:f0eb506d4add
Parent:
2:958004aa28a4
Child:
4:df12939cba66
Using updated, non-RTOS ds3232m library only. No other changes made.

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 2:958004aa28a4 270 uint16_t errorValue = 0;
loopsva 1:c891c3930f4e 271 if(pcRxBuffer[0] == 'g') { //get and display stored data string
loopsva 2:958004aa28a4 272 errorValue = rtc.getUserRAM(pcRxBuffer, 128, 126);
loopsva 2:958004aa28a4 273 if(errorValue) {
loopsva 2:958004aa28a4 274 pc.printf("'Get' user RAM error: %d\r\n", errorValue);
loopsva 1:c891c3930f4e 275 } else if(pcRxBuffer[0] == NULL) {
loopsva 1:c891c3930f4e 276 pc.printf("User RAM empty!!\r\n");
loopsva 1:c891c3930f4e 277 } else {
loopsva 1:c891c3930f4e 278 //pcRxBuffer[31] = NULL; //guarantee that the string max length is 32 bytes
loopsva 1:c891c3930f4e 279 pc.printf("%s\r\n", pcRxBuffer);
loopsva 1:c891c3930f4e 280 }
loopsva 1:c891c3930f4e 281 pcRxBuffer[0] = 'g';
loopsva 2:958004aa28a4 282 errorValue = 0;
loopsva 1:c891c3930f4e 283 }
loopsva 1:c891c3930f4e 284 if(pcRxBuffer[0] == 's') { //save data string
loopsva 1:c891c3930f4e 285 allowDisplayTime = true;
loopsva 1:c891c3930f4e 286 pc.printf("Enter text string to save: ");
loopsva 1:c891c3930f4e 287 pcClrLineBuf();
loopsva 1:c891c3930f4e 288 do {
loopsva 1:c891c3930f4e 289 #ifdef RTOS_H
loopsva 1:c891c3930f4e 290 Thread::wait(20);
loopsva 1:c891c3930f4e 291 #else
loopsva 1:c891c3930f4e 292 wait_ms(20);
loopsva 1:c891c3930f4e 293 #endif
loopsva 1:c891c3930f4e 294 } while((pcRxLine == false) && (pcRxEOB == false));
loopsva 2:958004aa28a4 295 errorValue = rtc.putUserRAM(pcRxBuffer, 128, pcRxQty + 2);
loopsva 2:958004aa28a4 296 if(errorValue) pc.printf("'Put' user RAM error: %d\r\n", errorValue);
loopsva 1:c891c3930f4e 297 allowDisplayTime = false;
loopsva 1:c891c3930f4e 298 pcRxBuffer[0] = 's';
loopsva 2:958004aa28a4 299 errorValue = 0;
loopsva 1:c891c3930f4e 300 }
loopsva 1:c891c3930f4e 301 if(pcRxBuffer[0] == 't') Get3232Temp(); //display the DS3232's temperature
loopsva 1:c891c3930f4e 302 if(pcRxBuffer[0] == 'z') {
loopsva 1:c891c3930f4e 303 rtc.LoadRTCRam();
loopsva 1:c891c3930f4e 304 pc.printf("CRC16 value: 0x%04X\r\n", rtc.calculateCRC16(rtc.RTCbuffer, 0x14, 0xea));
loopsva 1:c891c3930f4e 305 }
loopsva 1:c891c3930f4e 306 if((pcRxBuffer[0] != 'a') && (pcRxBuffer[0] != 'A') && (pcRxBuffer[0] != 'b')
loopsva 1:c891c3930f4e 307 && (pcRxBuffer[0] != 'B') && (pcRxBuffer[0] != 'c') && (pcRxBuffer[0] != 'g')
loopsva 1:c891c3930f4e 308 && (pcRxBuffer[0] != 's') && (pcRxBuffer[0] != 't') && (pcRxBuffer[0] != 'z')) pc.printf("Entry Error!!\r\n");
loopsva 1:c891c3930f4e 309 pc.printf("\r\n");
loopsva 1:c891c3930f4e 310 pcClrLineBuf();
loopsva 1:c891c3930f4e 311 }
loopsva 1:c891c3930f4e 312 #ifdef RTOS_H
loopsva 1:c891c3930f4e 313 } //RTOS while loop
loopsva 1:c891c3930f4e 314 #endif
loopsva 1:c891c3930f4e 315 }
loopsva 1:c891c3930f4e 316
loopsva 1:c891c3930f4e 317 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:8d18e427a06b 318
loopsva 0:8d18e427a06b 319 int main() {
loopsva 0:8d18e427a06b 320 pc.baud(230400);
loopsva 0:8d18e427a06b 321 ctTime = time(NULL);
loopsva 0:8d18e427a06b 322 StartTime = ctTime; //get time we started up
loopsva 3:f0eb506d4add 323 pc.printf("\r\n\r\nDS3232M demo Christmas-2014 K. Braun\r\n");
loopsva 0:8d18e427a06b 324
loopsva 1:c891c3930f4e 325 //check for RTOS operation
loopsva 1:c891c3930f4e 326 #ifdef RTOS_H
loopsva 1:c891c3930f4e 327 pc.printf("RTOS installed...\r\n");
loopsva 1:c891c3930f4e 328 #else
loopsva 1:c891c3930f4e 329 pc.printf("not using RTOS...\r\n");
loopsva 1:c891c3930f4e 330 #endif
loopsva 1:c891c3930f4e 331
loopsva 0:8d18e427a06b 332 //pc RX character callback interrupt
loopsva 0:8d18e427a06b 333 pc.printf("Initializing Serial Port Rx Interrupt... \r\n");
loopsva 1:c891c3930f4e 334 pc.attach(&PcRxIRQ, pc.RxIrq);
loopsva 0:8d18e427a06b 335
loopsva 0:8d18e427a06b 336 pc.printf("Checking the mbed's RTC...\r\n");
loopsva 1:c891c3930f4e 337 #ifdef RTOS_H
loopsva 1:c891c3930f4e 338 Thread::wait(1500);
loopsva 1:c891c3930f4e 339 #else
loopsva 1:c891c3930f4e 340 wait_ms(1500);
loopsva 1:c891c3930f4e 341 #endif
loopsva 1:c891c3930f4e 342
loopsva 0:8d18e427a06b 343 ctTime = time(NULL);
loopsva 0:8d18e427a06b 344
loopsva 0:8d18e427a06b 345 //first, see if K64F's RTC already running
loopsva 0:8d18e427a06b 346 if((StartTime == ctTime) || (ctTime <= 1000000000)) {
loopsva 1:c891c3930f4e 347 pc.printf("*** mbed's local RTC is not initialized\r\n");
loopsva 0:8d18e427a06b 348 loadRTC();
loopsva 0:8d18e427a06b 349 StartTime = ctTime;
loopsva 0:8d18e427a06b 350
loopsva 0:8d18e427a06b 351 //now see if DS3232's clock needs to be set
loopsva 0:8d18e427a06b 352 if(ctTime <= 1000000000) {
loopsva 0:8d18e427a06b 353 pc.printf("*** Local RTC stopped, initializing the RTC. !!CHECK BATTERY!!\r\n");
loopsva 0:8d18e427a06b 354 pc.printf("*** Note: Time is incorrect, needs to be updated!!!\r\n");
loopsva 0:8d18e427a06b 355
loopsva 0:8d18e427a06b 356 //set up the DS3232's clock
loopsva 0:8d18e427a06b 357 if(SetRTC() != 0) pc.printf("Entry Error!!");
loopsva 0:8d18e427a06b 358 pcClrLineBuf();
loopsva 0:8d18e427a06b 359 }
loopsva 0:8d18e427a06b 360 }
loopsva 0:8d18e427a06b 361
loopsva 0:8d18e427a06b 362 //sync up the mbed's time with the DS3232's time
loopsva 0:8d18e427a06b 363 loadRTC();
loopsva 0:8d18e427a06b 364 StartTime = ctTime;
loopsva 0:8d18e427a06b 365 pc.printf(" - RTC Start Time: ");
loopsva 0:8d18e427a06b 366 PrintDateTime();
loopsva 0:8d18e427a06b 367 pc.printf(" - Day of Week: %s\r\n", timebuf_dow); //day of the week
loopsva 0:8d18e427a06b 368
loopsva 0:8d18e427a06b 369 //get the DS3232's temperature
loopsva 0:8d18e427a06b 370 Get3232Temp();
loopsva 0:8d18e427a06b 371
loopsva 1:c891c3930f4e 372 #ifdef RTOS_H
loopsva 1:c891c3930f4e 373 //turn on the rest of the os threads
loopsva 1:c891c3930f4e 374 pc.printf("Initializing os threads...\r\n");
loopsva 1:c891c3930f4e 375 Thread th3(cli_thread, NULL, osPriorityNormal);
loopsva 1:c891c3930f4e 376 Thread::wait(300);
loopsva 1:c891c3930f4e 377 #endif
loopsva 1:c891c3930f4e 378
loopsva 0:8d18e427a06b 379 int CheckTime = ctTime;
loopsva 2:958004aa28a4 380 pc.printf("Hit 'A' or 'a' - turn on/off the 32KHz output\r\n");
loopsva 2:958004aa28a4 381 pc.printf("Hit 'B' or 'b' - turn on/off the 1Hz output (1Hz pin needs pull-up)\r\n");
loopsva 2:958004aa28a4 382 pc.printf("Hit 'c' - change the date & time\r\n");
loopsva 2:958004aa28a4 383 pc.printf("Hit 'g' - get data string from DS3232 user RAM\r\n");
loopsva 2:958004aa28a4 384 pc.printf("Hit 's' - store data string in the DS3232 user RAM\r\n");
loopsva 2:958004aa28a4 385 pc.printf("Hit 't' - get DS3232's temperature\r\n");
loopsva 2:958004aa28a4 386 pc.printf("Hit 'z' - get user RAM CRC data\r\n");
loopsva 2:958004aa28a4 387 pc.printf("Hit '^C' - reboot\r\n");
loopsva 1:c891c3930f4e 388 pc.printf("\r\n");
loopsva 0:8d18e427a06b 389
loopsva 0:8d18e427a06b 390 //Ready!!
loopsva 0:8d18e427a06b 391 while (true) {
loopsva 1:c891c3930f4e 392 #ifdef RTOS_H
loopsva 1:c891c3930f4e 393 Thread::wait(50);
loopsva 1:c891c3930f4e 394 #else
loopsva 1:c891c3930f4e 395 wait_ms(50);
loopsva 1:c891c3930f4e 396 #endif
loopsva 0:8d18e427a06b 397 UpdateTime();
loopsva 0:8d18e427a06b 398 if(CheckTime != ctTime) {
loopsva 0:8d18e427a06b 399 CheckTime = ctTime;
loopsva 1:c891c3930f4e 400 if(allowDisplayTime == false) PrintDateTime();
loopsva 0:8d18e427a06b 401 }
loopsva 1:c891c3930f4e 402 #ifndef RTOS_H
loopsva 1:c891c3930f4e 403 cli_thread();
loopsva 1:c891c3930f4e 404 #endif
loopsva 0:8d18e427a06b 405 }
loopsva 0:8d18e427a06b 406 }