Skip to content

Commit 4812fab

Browse files
committed
[RTC] Enhance example
* Apply Arduino Astyle formatting * Display subseconds * Use printf for better formatting * Manage alarm subsecond Signed-off-by: Frederic Pillon <frederic.pillon@st.com>
1 parent 1d07a06 commit 4812fab

File tree

3 files changed

+85
-95
lines changed

3 files changed

+85
-95
lines changed

examples/NonReg/RTC/RTC_Tests/RTC_Config.ino

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,5 @@ void rtc_setTime(const char* date, const char* time) {
3434
// you can use also
3535
//rtc.setTime(hours, minutes, seconds);
3636
//rtc.setDate(weekDay, day, month, year);
37-
}
37+
delay(100);
38+
}

examples/NonReg/RTC/RTC_Tests/RTC_Tests.ino

Lines changed: 68 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -18,26 +18,26 @@
1818
STM32RTC& rtc = STM32RTC::getInstance();
1919

2020
/* Change these values to set the current initial time
21-
*
22-
* format: date: "Dec 31 2017" and time: "23:59:56"
23-
* by default use built date and time
24-
*/
21+
22+
format: date: "Dec 31 2017" and time: "23:59:56"
23+
by default use built date and time
24+
*/
2525
static const char* mydate = __DATE__;
2626
static const char* mytime = __TIME__;
2727
//static const char* mydate = "Dec 31 2017";
2828
//static const char* mytime = "23:59:56";
2929

3030
/* Change these values to set user (a)synchronous prescalers
31-
* value to test.
32-
*
33-
* Default 99/9999 are for RTCCLK = 1MHz
34-
* Example for DISCO_F746NG with a HSE of 25MHz
35-
* HSE divider will be 25 and RTCCLK will be 1MHz. (HSE/HSEdiv)
36-
*
37-
* To have a calendar clock of 1 Hz:
38-
* clk = RTCCLK / ((predA +1) * (predS +1))
39-
* clk = 1000000 / ((99 +1) * (9999+1)) = 1 Hz
40-
*/
31+
value to test.
32+
33+
Default 99/9999 are for RTCCLK = 1MHz
34+
Example for DISCO_F746NG with a HSE of 25MHz
35+
HSE divider will be 25 and RTCCLK will be 1MHz. (HSE/HSEdiv)
36+
37+
To have a calendar clock of 1 Hz:
38+
clk = RTCCLK / ((predA +1) * (predS +1))
39+
clk = 1000000 / ((99 +1) * (9999+1)) = 1 Hz
40+
*/
4141
static int8_t userPredA = 99;
4242
static int16_t userPredS = 9999;
4343

@@ -55,16 +55,16 @@ static STM32RTC::Hour_Format hourFormat = STM32RTC::HOUR_24;
5555
static STM32RTC::AM_PM period = STM32RTC::AM;
5656

5757
#ifndef STM32F1xx
58-
static STM32RTC::Alarm_Match SS_MATCH = STM32RTC::MATCH_SS;
59-
static STM32RTC::Alarm_Match MMSS_MATCH = STM32RTC::MATCH_MMSS;
60-
static STM32RTC::Alarm_Match HHMMSS_MATCH = STM32RTC::MATCH_HHMMSS;
58+
static STM32RTC::Alarm_Match SS_MATCH = STM32RTC::MATCH_SS;
59+
static STM32RTC::Alarm_Match MMSS_MATCH = STM32RTC::MATCH_MMSS;
60+
static STM32RTC::Alarm_Match HHMMSS_MATCH = STM32RTC::MATCH_HHMMSS;
6161
#endif
6262
static STM32RTC::Alarm_Match DHHMMSS_MATCH = STM32RTC::MATCH_DHHMMSS;
6363

6464
void setup()
6565
{
6666
Serial.begin(115200);
67-
while(!Serial) {}
67+
while (!Serial) {}
6868
}
6969

7070
void loop()
@@ -88,7 +88,7 @@ void loop()
8888
Serial.println("Invalid input");
8989
continue;
9090
}
91-
switch(c) {
91+
switch (c) {
9292
case '1':
9393
default:
9494
Serial.println("Test will use LSI_CLOCK");
@@ -105,20 +105,19 @@ void loop()
105105
}
106106
break;
107107
}
108-
109108
Serial.println("Testing asynchronous and synchronous prescaler setting");
110109
int8_t a;
111110
int16_t s;
112111
rtc.getPrediv(&a, &s);
113112
Serial.print("Async/Sync for default LSI clock: ");
114-
Serial.print(a); Serial.print('/'); Serial.println(s);
113+
Serial.printf("%i/%i\n", a, s);
115114
rtc_config(clkSource, rtc.HOUR_24, mydate, mytime);
116115
Serial.print("Async/Sync for selected clock: ");
117116
rtc.getPrediv(&a, &s);
118-
Serial.print(a); Serial.print('/'); Serial.println(s);
117+
Serial.printf("%i/%i\n", a, s);
119118
rtc.end();
120119

121-
if(clkSource == rtc.HSE_CLOCK) {
120+
if (clkSource == rtc.HSE_CLOCK) {
122121
Serial.print("User Async/Sync set to ");
123122
Serial.print(userPredA);
124123
Serial.print("/");
@@ -127,15 +126,15 @@ void loop()
127126
rtc.setPrediv(userPredA, userPredS);
128127
rtc_config(clkSource, rtc.HOUR_24, mydate, mytime);
129128
rtc.getPrediv(&a, &s);
130-
Serial.print(a); Serial.print('/'); Serial.println(s);
129+
Serial.printf("%i/%i\n", a, s);
131130
printDateTime(10, 1000, false);
132131
}
133132

134133
Serial.print("User Async/Sync reset use the computed one: ");
135134
rtc.setPrediv(-1, -1);
136135
rtc_config(clkSource, rtc.HOUR_24, mydate, mytime);
137136
rtc.getPrediv(&a, &s);
138-
Serial.print(a); Serial.print('/'); Serial.println(s);
137+
Serial.printf("%i/%i\n", a, s);
139138

140139
// Check date change
141140
Serial.println("Testing date and time");
@@ -158,22 +157,25 @@ void loop()
158157

159158
Serial.println("Using Epoch API, set to Jan 1, 2016");
160159
rtc.setEpoch(1451606400); // Jan 1, 2016
161-
for (uint32_t i=0; i<8; i++) {
162-
Serial.print("Unix time = ");
163-
Serial.println(rtc.getEpoch());
164-
Serial.print("Seconds since Jan 1 2000 = ");
165-
Serial.println(rtc.getY2kEpoch());
160+
for (uint32_t i = 0; i < 8; i++) {
161+
Serial.printf("Unix time = %u\n", rtc.getEpoch());
162+
Serial.printf("Seconds since Jan 1 2000 = %u\n", rtc.getY2kEpoch());
166163
printDateTime(1, 1000, false);
167164
}
168165

169166
Serial.println("\nTesting alarm");
170167
rtc_config(clkSource, rtc.HOUR_24, mydate, mytime);
171-
byte alarmSeconds = ((seconds+5)<60) ? seconds+5 : 5;
172-
byte alarmMinutes = ((seconds+5)<60) ? minutes : ((minutes+1)<60) ? minutes+1 : 0;
173-
byte alarmHours = ((seconds+5)<60) ? hours : ((minutes+1)<60) ? hours : ((hours+1)<24) ? hours+1 : 0;
174-
byte alarmDay = (hours==alarmHours)? day: ((day+1)<=31) ? day+1 : 1;
168+
byte alarmSeconds = ((seconds + 5) < 60) ? seconds + 5 : 5;
169+
byte alarmMinutes = ((seconds + 5) < 60) ? minutes : ((minutes + 1) < 60) ? minutes + 1 : 0;
170+
byte alarmHours = ((seconds + 5) < 60) ? hours : ((minutes + 1) < 60) ? hours : ((hours + 1) < 24) ? hours + 1 : 0;
171+
byte alarmDay = (hours == alarmHours) ? day : ((day + 1) <= 31) ? day + 1 : 1;
172+
173+
#if defined(STM32_RTC_VERSION) && (STM32_RTC_VERSION >= 0x01010000)
174+
rtc.setAlarmSubSeconds(123);
175+
#endif
175176

176177
#ifndef STM32F1xx
178+
Serial.println("\nEvery minute");
177179
rtc.attachInterrupt(alarmMatch, (void*)&SS_MATCH);
178180
rtc.setAlarmSeconds(alarmSeconds);
179181
rtc.enableAlarm(rtc.MATCH_SS);
@@ -203,7 +205,11 @@ void loop()
203205
Serial.println("\nEvery month");
204206
rtc_setTime(mydate, mytime);
205207
rtc.attachInterrupt(alarmMatch, (void*)&DHHMMSS_MATCH);
208+
#if defined(STM32_RTC_VERSION) && (STM32_RTC_VERSION >= 0x01010000)
209+
rtc.setAlarmTime(alarmHours, alarmMinutes, alarmSeconds, 123);
210+
#else
206211
rtc.setAlarmTime(alarmHours, alarmMinutes, alarmSeconds);
212+
#endif
207213
rtc.setAlarmDay(alarmDay);
208214
rtc.enableAlarm(rtc.MATCH_DHHMMSS);
209215
printDateTime(20, 1000, true);
@@ -219,33 +225,33 @@ void alarmMatch(void *data)
219225
{
220226
STM32RTC::Alarm_Match m = *(STM32RTC::Alarm_Match*)data;
221227

222-
Serial.print("Alarm Match ");
223-
switch(m) {
224-
case STM32RTC::MATCH_OFF:
225-
Serial.println("MATCH_OFF could not happen");
226-
break;
227-
case STM32RTC::MATCH_YYMMDDHHMMSS://kept for compatibility
228-
case STM32RTC::MATCH_MMDDHHMMSS: //kept for compatibility
229-
case STM32RTC::MATCH_DHHMMSS:
230-
Serial.println("MATCH_DHHMMSS");
231-
rtc.setMonth(((rtc.getMonth()+1)<13)? rtc.getMonth()+1: 1);
232-
rtc.setEpoch(rtc.getEpoch()- 10);
233-
break;
234-
case STM32RTC::MATCH_HHMMSS:
235-
Serial.println("MATCH_HHMMSS");
236-
rtc.setEpoch(rtc.getEpoch()+86395);
237-
break;
238-
case STM32RTC::MATCH_MMSS:
239-
Serial.println("MATCH_MMSS");
240-
rtc.setEpoch(rtc.getEpoch()+3595);
241-
break;
242-
case STM32RTC::MATCH_SS:
243-
Serial.println("MATCH_SS");
244-
rtc.setEpoch(rtc.getEpoch()+55);
245-
break;
246-
default:
247-
Serial.println("Unknown STM32RTC::Alarm_Match type");
228+
Serial.print("Alarm Match at ");
229+
printDateTime(1, 0, false);
230+
switch (m) {
231+
case STM32RTC::MATCH_OFF:
232+
Serial.println("MATCH_OFF could not happen");
233+
break;
234+
case STM32RTC::MATCH_YYMMDDHHMMSS://kept for compatibility
235+
case STM32RTC::MATCH_MMDDHHMMSS: //kept for compatibility
236+
case STM32RTC::MATCH_DHHMMSS:
237+
Serial.println("MATCH_DHHMMSS");
238+
rtc.setMonth(((rtc.getMonth() + 1) < 13) ? rtc.getMonth() + 1 : 1);
239+
rtc.setEpoch(rtc.getEpoch() - 10);
240+
break;
241+
case STM32RTC::MATCH_HHMMSS:
242+
Serial.println("MATCH_HHMMSS");
243+
rtc.setEpoch(rtc.getEpoch() + 86395);
244+
break;
245+
case STM32RTC::MATCH_MMSS:
246+
Serial.println("MATCH_MMSS");
247+
rtc.setEpoch(rtc.getEpoch() + 3595);
248+
break;
249+
case STM32RTC::MATCH_SS:
250+
Serial.println("MATCH_SS");
251+
rtc.setEpoch(rtc.getEpoch() + 55);
252+
break;
253+
default:
254+
Serial.println("Unknown STM32RTC::Alarm_Match type");
248255
break;
249256
}
250-
}
251-
257+
}

examples/NonReg/RTC/RTC_Tests/RTC_utils.ino

Lines changed: 15 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,6 @@ static uint8_t conv2d(const char* p) {
66
return 10 * v + *++p - '0';
77
}
88

9-
void print2digits(int number) {
10-
if (number < 10) {
11-
Serial.print("0"); // print a 0 before if the number is < than 10
12-
}
13-
Serial.print(number);
14-
}
15-
169
// sample input: date = "Dec 26 2009", time = "12:34:56"
1710
void initDateTime (const char* date, const char* time) {
1811
year = conv2d(date + 9);
@@ -41,41 +34,31 @@ void initDateTime (const char* date, const char* time) {
4134
// d: delay between each print
4235
// a: display alarm
4336
void printDateTime(uint32_t t, uint32_t d, bool a) {
44-
for (uint32_t i=0; i<t; i++) {
37+
uint32_t subSeconds;
38+
39+
for (uint32_t i = 0; i < t; i++) {
40+
rtc.getTime(&hours, &minutes, &seconds, &subSeconds, &period);
41+
4542
// Print date...
46-
print2digits(rtc.getMonth());
47-
Serial.print("/");
48-
print2digits(rtc.getDay());
49-
Serial.print("/");
50-
print2digits(rtc.getYear());
51-
Serial.print("\t");
43+
Serial.printf("%02d/%02d/%02d\t", rtc.getMonth(), rtc.getDay(), rtc.getYear());
5244

5345
// ...and time
54-
print2digits(rtc.getHours(&period));
55-
Serial.print(":");
56-
print2digits(rtc.getMinutes());
57-
Serial.print(":");
58-
print2digits(rtc.getSeconds());
46+
Serial.printf("%02d:%02d:%02d.%03d", hours, minutes, seconds, subSeconds);
47+
5948
if (hourFormat == rtc.HOUR_12) {
60-
Serial.print(period == rtc.AM ? " AM":" PM");
49+
Serial.print(period == rtc.AM ? " AM" : " PM");
6150
}
62-
if(a) {
51+
if (a) {
6352
// Print day...
64-
Serial.print("\t");
65-
print2digits(rtc.getAlarmDay());
66-
Serial.print("\t");
67-
53+
Serial.printf("\t%02d\t", rtc.getAlarmDay());
6854
// ...and time
69-
print2digits(rtc.getAlarmHours(&period));
70-
Serial.print(":");
71-
print2digits(rtc.getAlarmMinutes());
72-
Serial.print(":");
73-
print2digits(rtc.getAlarmSeconds());
55+
Serial.printf("%02d:%02d:%02d.%03d", rtc.getAlarmHours(&period), rtc.getAlarmMinutes(),
56+
rtc.getAlarmSeconds(), rtc.getAlarmSubSeconds());
7457
if (hourFormat == rtc.HOUR_12) {
75-
Serial.print(period == rtc.AM ? " AM":" PM");
58+
Serial.print(period == rtc.AM ? " AM" : " PM");
7659
}
7760
}
7861
Serial.println();
7962
delay(d);
8063
}
81-
}
64+
}

0 commit comments

Comments
 (0)