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
main.cpp@4:df12939cba66, 2016-03-11 (annotated)
- 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?
User | Revision | Line number | New 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 | } |