RTC demonstration program. Prompts user for input and sets RTC. Created for Nucleo F446RE. On the F446RE board, reset and even downloading new code doesn't disrupt or reset the RTC.
main.cpp@0:a338d4ab50c9, 2018-07-28 (annotated)
- Committer:
- CSTritt
- Date:
- Sat Jul 28 12:31:40 2018 +0000
- Revision:
- 0:a338d4ab50c9
- Child:
- 1:811c5881ca5c
Initial version of my set and get RTC example.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
CSTritt | 0:a338d4ab50c9 | 1 | /* |
CSTritt | 0:a338d4ab50c9 | 2 | Project: my_SetRTC, File: main.cpp. |
CSTritt | 0:a338d4ab50c9 | 3 | |
CSTritt | 0:a338d4ab50c9 | 4 | Based on mktime example: weekday calculator from |
CSTritt | 0:a338d4ab50c9 | 5 | http://www.cplusplus.com/reference/ctime/mktime. Modified to set Mbed/Nucleo |
CSTritt | 0:a338d4ab50c9 | 6 | RTC. |
CSTritt | 0:a338d4ab50c9 | 7 | |
CSTritt | 0:a338d4ab50c9 | 8 | Modified by C. S. Tritt |
CSTritt | 0:a338d4ab50c9 | 9 | Last modified: 7/28/18 (v. 1.0) |
CSTritt | 0:a338d4ab50c9 | 10 | */ |
CSTritt | 0:a338d4ab50c9 | 11 | #include <mbed.h> // wait, etc. |
CSTritt | 0:a338d4ab50c9 | 12 | //#include <mbed_mktime.h> // For _rtc_mktime. Didn't work. |
CSTritt | 0:a338d4ab50c9 | 13 | //#include <stdio.h> // printf, scanf - incl. in mbed.h. |
CSTritt | 0:a338d4ab50c9 | 14 | //#include <time.h> // time_t, struct tm, time, mktime in mbed.h. |
CSTritt | 0:a338d4ab50c9 | 15 | |
CSTritt | 0:a338d4ab50c9 | 16 | int main () |
CSTritt | 0:a338d4ab50c9 | 17 | { |
CSTritt | 0:a338d4ab50c9 | 18 | // Create variables. |
CSTritt | 0:a338d4ab50c9 | 19 | time_t rawtime; |
CSTritt | 0:a338d4ab50c9 | 20 | struct tm* timeinfo; |
CSTritt | 0:a338d4ab50c9 | 21 | int year, month ,day, hours, minutes, secs; |
CSTritt | 0:a338d4ab50c9 | 22 | const char* weekday[] = { "Sunday", "Monday", |
CSTritt | 0:a338d4ab50c9 | 23 | "Tuesday", "Wednesday", |
CSTritt | 0:a338d4ab50c9 | 24 | "Thursday", "Friday", "Saturday"}; |
CSTritt | 0:a338d4ab50c9 | 25 | |
CSTritt | 0:a338d4ab50c9 | 26 | // Prompt user for date and time. |
CSTritt | 0:a338d4ab50c9 | 27 | printf("\nTurn echo on to see your input.\n"); |
CSTritt | 0:a338d4ab50c9 | 28 | printf("\nEnter year (YYYY): "); scanf ("%d",&year); |
CSTritt | 0:a338d4ab50c9 | 29 | printf("\nEnter month (1 to 12): "); scanf ("%d",&month); |
CSTritt | 0:a338d4ab50c9 | 30 | printf("\nEnter day (D or DD): "); scanf ("%d",&day); |
CSTritt | 0:a338d4ab50c9 | 31 | printf("\nEnter hours (0 to 23):"); scanf ("%d",&hours); |
CSTritt | 0:a338d4ab50c9 | 32 | printf("\nEnter hours (0 to 59):"); scanf ("%d",&minutes); |
CSTritt | 0:a338d4ab50c9 | 33 | printf("\nEnter hours (0 to 59):"); scanf ("%d",&secs); |
CSTritt | 0:a338d4ab50c9 | 34 | |
CSTritt | 0:a338d4ab50c9 | 35 | // Get current RTC time structure. |
CSTritt | 0:a338d4ab50c9 | 36 | time(&rawtime); |
CSTritt | 0:a338d4ab50c9 | 37 | timeinfo = localtime(&rawtime); // Modify to local time. |
CSTritt | 0:a338d4ab50c9 | 38 | |
CSTritt | 0:a338d4ab50c9 | 39 | // Modify it using user input. |
CSTritt | 0:a338d4ab50c9 | 40 | timeinfo->tm_year = year - 1900; // tm_year are from 1900. |
CSTritt | 0:a338d4ab50c9 | 41 | timeinfo->tm_mon = month - 1; // tm_month are 0 to 11. |
CSTritt | 0:a338d4ab50c9 | 42 | timeinfo->tm_mday = day; |
CSTritt | 0:a338d4ab50c9 | 43 | timeinfo->tm_hour = hours; |
CSTritt | 0:a338d4ab50c9 | 44 | timeinfo->tm_min = minutes; |
CSTritt | 0:a338d4ab50c9 | 45 | timeinfo->tm_sec = secs; |
CSTritt | 0:a338d4ab50c9 | 46 | |
CSTritt | 0:a338d4ab50c9 | 47 | // Call mktime: timeinfo->tm_wday will be set. |
CSTritt | 0:a338d4ab50c9 | 48 | mktime(timeinfo); |
CSTritt | 0:a338d4ab50c9 | 49 | |
CSTritt | 0:a338d4ab50c9 | 50 | // tm_wday are 0 to 6. Use to check entered values. |
CSTritt | 0:a338d4ab50c9 | 51 | printf("\nThis must be a %s.\n", weekday[timeinfo->tm_wday]); |
CSTritt | 0:a338d4ab50c9 | 52 | |
CSTritt | 0:a338d4ab50c9 | 53 | // Set the mbed RTC to the current time. Not interupt safe. Should be |
CSTritt | 0:a338d4ab50c9 | 54 | // _rtc_mktime, but that didn't work. |
CSTritt | 0:a338d4ab50c9 | 55 | set_time(mktime(timeinfo)); |
CSTritt | 0:a338d4ab50c9 | 56 | |
CSTritt | 0:a338d4ab50c9 | 57 | while (true) { // Loop forever more. |
CSTritt | 0:a338d4ab50c9 | 58 | // Get current time. |
CSTritt | 0:a338d4ab50c9 | 59 | time_t nowSecs = time(NULL); |
CSTritt | 0:a338d4ab50c9 | 60 | |
CSTritt | 0:a338d4ab50c9 | 61 | // Display it in various ways. |
CSTritt | 0:a338d4ab50c9 | 62 | printf("\nTime as seconds since January 1, 1970 = %d\n", nowSecs); |
CSTritt | 0:a338d4ab50c9 | 63 | printf("Time as a basic string = %s", ctime(&nowSecs)); // ctime incl. \n. |
CSTritt | 0:a338d4ab50c9 | 64 | char buffer[32]; |
CSTritt | 0:a338d4ab50c9 | 65 | strftime(buffer, 32, "%I:%M %p\n", localtime(&nowSecs)); |
CSTritt | 0:a338d4ab50c9 | 66 | printf("As a custom string = %s\n", buffer); |
CSTritt | 0:a338d4ab50c9 | 67 | |
CSTritt | 0:a338d4ab50c9 | 68 | // Sleep for 1 second. |
CSTritt | 0:a338d4ab50c9 | 69 | wait(1.0); |
CSTritt | 0:a338d4ab50c9 | 70 | } |
CSTritt | 0:a338d4ab50c9 | 71 | } |