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 Mar 11 18:19:40 2016 +0000
Revision:
4:df12939cba66
Parent:
3:f0eb506d4add
Updated support for v6 of ds3232m library

Who changed what in which revision?

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