Skip to content

Commit 0df97f0

Browse files
angelnufpistm
andauthored
Add support for subSeconds alarms (#25)
Co-authored-by: Frederic Pillon <[email protected]>
1 parent d2e5f13 commit 0df97f0

File tree

4 files changed

+48
-10
lines changed

4 files changed

+48
-10
lines changed

README.md

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ This library is based on the Arduino RTCZero library.
1010
The library allows to take control of the internal RTC of the STM32 boards.
1111

1212
Singleton design pattern is used to ensure that only one STM32RTC instance is instantiated:
13-
```
13+
```C++
1414
/* Get the rtc object */
1515
STM32RTC& rtc = STM32RTC::getInstance();
1616
```
@@ -58,6 +58,18 @@ _Time and date configuration (added for convenience)_
5858
* **`void getTime(uint8_t *hours, uint8_t *minutes, uint8_t *seconds, uint32_t *subSeconds, AM_PM *period = NULL)`**
5959
* **`void getDate(uint8_t *weekDay, uint8_t *day, uint8_t *month, uint8_t *year)`**
6060

61+
### Since STM32RTC version > 1.0.3
62+
63+
_SubSeconds alarm management_
64+
65+
* **`void setAlarmSubSeconds(uint32_t subSeconds)`**
66+
67+
* **Updated API:**
68+
* **`void setAlarmTime(uint8_t hours, uint8_t minutes, uint8_t seconds, uint32_t subSeconds = 0)`**
69+
* **`uint32_t getEpoch(uint32_t *subSeconds = nullptr)`**
70+
* **`void setEpoch(uint32_t ts, uint32_t subSeconds = 0)`**
71+
* **`void setAlarmEpoch(uint32_t ts, Alarm_Match match = MATCH_DHHMMSS, uint32_t subSeconds = 0)`**
72+
6173
### Since STM32 Core version > 1.5.0
6274
_Reset time management_
6375
By default, if a time is set it will not be reset after a reboot.
@@ -66,7 +78,7 @@ Using `begin(true)` or `begin(true, HOUR_24)` will reset the RTC registers.
6678

6779
To know if a time has already been set use:
6880
* **`bool isTimeSet(void)`**
69-
```
81+
```C++
7082
if (!rtc.isTimeSet()) {
7183
// Set the time
7284
rtc.setHours(hours);

keywords.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ getAlarmMinutes KEYWORD2
4848
getAlarmSeconds KEYWORD2
4949
getAlarmSubSeconds KEYWORD2
5050

51+
setAlarmSubSeconds KEYWORD2
5152
setAlarmSeconds KEYWORD2
5253
setAlarmMinutes KEYWORD2
5354
setAlarmHours KEYWORD2

src/STM32RTC.cpp

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -703,6 +703,20 @@ void STM32RTC::setDate(uint8_t weekDay, uint8_t day, uint8_t month, uint8_t year
703703
}
704704
}
705705

706+
/**
707+
* @brief set RTC alarm subseconds.
708+
* @param subseconds: 0-999 (in ms)
709+
* @retval none
710+
*/
711+
void STM32RTC::setAlarmSubSeconds(uint32_t subSeconds)
712+
{
713+
if (_configured) {
714+
if (subSeconds < 1000) {
715+
_alarmSubSeconds = subSeconds;
716+
}
717+
}
718+
}
719+
706720
/**
707721
* @brief set RTC alarm second.
708722
* @param seconds: 0-59
@@ -768,12 +782,13 @@ void STM32RTC::setAlarmHours(uint8_t hours, AM_PM period)
768782
* @param seconds: 0-59
769783
* @retval none
770784
*/
771-
void STM32RTC::setAlarmTime(uint8_t hours, uint8_t minutes, uint8_t seconds)
785+
void STM32RTC::setAlarmTime(uint8_t hours, uint8_t minutes, uint8_t seconds, uint32_t subSeconds)
772786
{
773787
if (_configured) {
774788
setAlarmHours(hours);
775789
setAlarmMinutes(minutes);
776790
setAlarmSeconds(seconds);
791+
setAlarmSubSeconds(subSeconds);
777792
}
778793
}
779794

@@ -848,9 +863,10 @@ void STM32RTC::setAlarmDate(uint8_t day, uint8_t month, uint8_t year)
848863

849864
/**
850865
* @brief get epoch time
866+
* @param subSeconds: optional pointer to where to store subseconds of the epoch in ms
851867
* @retval epoch time in seconds
852868
*/
853-
uint32_t STM32RTC::getEpoch(void)
869+
uint32_t STM32RTC::getEpoch(uint32_t *subSeconds)
854870
{
855871
struct tm tm;
856872

@@ -870,6 +886,9 @@ uint32_t STM32RTC::getEpoch(void)
870886
tm.tm_hour = _hours;
871887
tm.tm_min = _minutes;
872888
tm.tm_sec = _seconds;
889+
if (subSeconds != nullptr) {
890+
*subSeconds = _subSeconds;
891+
}
873892

874893
return mktime(&tm);
875894
}
@@ -886,8 +905,10 @@ uint32_t STM32RTC::getY2kEpoch(void)
886905
/**
887906
* @brief set RTC alarm from epoch time
888907
* @param epoch time in seconds
908+
* @param Alarm_Match match enum
909+
* @param subSeconds subSeconds in ms
889910
*/
890-
void STM32RTC::setAlarmEpoch(uint32_t ts, Alarm_Match match)
911+
void STM32RTC::setAlarmEpoch(uint32_t ts, Alarm_Match match, uint32_t subSeconds)
891912
{
892913
if (_configured) {
893914
if (ts < EPOCH_TIME_OFF) {
@@ -901,15 +922,17 @@ void STM32RTC::setAlarmEpoch(uint32_t ts, Alarm_Match match)
901922
setAlarmHours(tmp->tm_hour);
902923
setAlarmMinutes(tmp->tm_min);
903924
setAlarmSeconds(tmp->tm_sec);
925+
setAlarmSubSeconds(subSeconds);
904926
enableAlarm(match);
905927
}
906928
}
907929

908930
/**
909931
* @brief set RTC time from epoch time
910932
* @param epoch time in seconds
933+
* @param subSeconds subSeconds in ms
911934
*/
912-
void STM32RTC::setEpoch(uint32_t ts)
935+
void STM32RTC::setEpoch(uint32_t ts, uint32_t subSeconds)
913936
{
914937
if (_configured) {
915938
if (ts < EPOCH_TIME_OFF) {
@@ -930,6 +953,7 @@ void STM32RTC::setEpoch(uint32_t ts)
930953
_hours = tmp->tm_hour;
931954
_minutes = tmp->tm_min;
932955
_seconds = tmp->tm_sec;
956+
_subSeconds = subSeconds;
933957

934958
RTC_SetDate(_year, _month, _day, _wday);
935959
RTC_SetTime(_hours, _minutes, _seconds, _subSeconds, (_hoursPeriod == AM) ? HOUR_AM : HOUR_PM);

src/STM32RTC.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -152,11 +152,12 @@ class STM32RTC {
152152
void setDate(uint8_t day, uint8_t month, uint8_t year);
153153
void setDate(uint8_t weekDay, uint8_t day, uint8_t month, uint8_t year);
154154

155+
void setAlarmSubSeconds(uint32_t subSeconds);
155156
void setAlarmSeconds(uint8_t seconds);
156157
void setAlarmMinutes(uint8_t minutes);
157158
void setAlarmHours(uint8_t hours);
158159
void setAlarmHours(uint8_t hours, AM_PM period);
159-
void setAlarmTime(uint8_t hours, uint8_t minutes, uint8_t seconds);
160+
void setAlarmTime(uint8_t hours, uint8_t minutes, uint8_t seconds, uint32_t subSeconds = 0);
160161
void setAlarmTime(uint8_t hours, uint8_t minutes, uint8_t seconds, AM_PM period);
161162

162163
void setAlarmDay(uint8_t day);
@@ -168,11 +169,11 @@ class STM32RTC {
168169

169170
/* Epoch Functions */
170171

171-
uint32_t getEpoch(void);
172+
uint32_t getEpoch(uint32_t *subSeconds = nullptr);
172173
uint32_t getY2kEpoch(void);
173-
void setEpoch(uint32_t ts);
174+
void setEpoch(uint32_t ts, uint32_t subSeconds = 0);
174175
void setY2kEpoch(uint32_t ts);
175-
void setAlarmEpoch(uint32_t ts, Alarm_Match match = MATCH_DHHMMSS);
176+
void setAlarmEpoch(uint32_t ts, Alarm_Match match = MATCH_DHHMMSS, uint32_t subSeconds = 0);
176177

177178
void getPrediv(int8_t *predivA, int16_t *predivS);
178179
void setPrediv(int8_t predivA, int16_t predivS);

0 commit comments

Comments
 (0)