Skip to content

Commit c890a47

Browse files
committed
[rtc] Add support for STM32 RTC
1 parent 372038a commit c890a47

File tree

4 files changed

+41
-18
lines changed

4 files changed

+41
-18
lines changed

library.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name=RT-Thread
2-
version=0.9.1
2+
version=0.9.2
33
author=onelife <[email protected]>, Bernard Xiong <[email protected]>
44
maintainer=onelife <[email protected]>
55
sentence=Real Time Operating System porting for Arduino SAM and SAMD boards

src/components/arduino/drv_rtc.cpp

Lines changed: 38 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,14 @@ extern "C" {
1313

1414
#include <time.h>
1515
#include <Arduino.h>
16-
#ifdef ARDUINO_ARCH_SAMD
16+
#if defined(ARDUINO_ARCH_SAMD)
1717
# include <RTCZero.h> /* Arduino library */
18+
# define RTCClass RTCZero
19+
#elif defined(ARDUINO_ARCH_STM32)
20+
# include <STM32RTC.h>
21+
# define RTCClass STM32RTC
22+
# else
23+
# error "No RTC library available"
1824
#endif
1925

2026
extern "C" {
@@ -50,17 +56,21 @@ extern "C" {
5056
#endif /* RT_USING_ULOG */
5157

5258
#define RTC_CTX() (&rtc_ctx)
53-
#ifdef ARDUINO_ARCH_SAMD
54-
# define RTC_DEV(ctx) ((RTCZero *)((ctx)->ldev))
59+
#if defined(ARDUINO_ARCH_SAMD) || defined(ARDUINO_ARCH_STM32)
60+
# define RTC_DEV(ctx) ((RTCClass *)((ctx)->ldev))
5561
#endif
5662

5763
/* Private variables ---------------------------------------------------------*/
5864
static struct bsp_rtc_contex rtc_ctx;
59-
#ifdef ARDUINO_ARCH_SAMD
65+
#if defined(ARDUINO_ARCH_SAMD) || defined(ARDUINO_ARCH_STM32)
6066
}
61-
static RTCZero _rtc;
67+
# if defined(ARDUINO_ARCH_SAMD)
68+
static RTCClass _rtc;
69+
# elif defined(ARDUINO_ARCH_STM32)
70+
static RTCClass& _rtc = RTCClass::getInstance();
71+
# endif
6272
extern "C" {
63-
#endif /* ARDUINO_ARCH_SAMD */
73+
#endif /* defined(ARDUINO_ARCH_SAMD) || defined(ARDUINO_ARCH_STM32) */
6474

6575
/* Private function prototypes -----------------------------------------------*/
6676
/* Private functions ---------------------------------------------------------*/
@@ -115,37 +125,46 @@ static rt_err_t bsp_rtc_control(rt_device_t dev, rt_int32_t cmd, void *args) {
115125
switch (cmd) {
116126
case RT_DEVICE_CTRL_RTC_GET_TIME:
117127
timep = (time_t *)args;
118-
#ifdef ARDUINO_ARCH_SAMD
128+
#if defined(ARDUINO_ARCH_SAMD) || defined(ARDUINO_ARCH_STM32)
119129
*timep = (time_t)RTC_DEV(RTC_CTX())->getEpoch();
120130
#endif
121131
ret = RT_EOK;
122132
break;
123133

124134
case RT_DEVICE_CTRL_RTC_SET_TIME:
125135
timep = (time_t *)args;
126-
#ifdef ARDUINO_ARCH_SAMD
136+
#if defined(ARDUINO_ARCH_SAMD) || defined(ARDUINO_ARCH_STM32)
127137
RTC_DEV(RTC_CTX())->setEpoch((rt_uint32_t)*timep);
128138
#endif
129139
ret = RT_EOK;
130140
break;
131141

132142
case RT_DEVICE_CTRL_RTC_GET_ALARM:
133143
alarm = (struct rt_rtc_wkalarm *)args;
134-
#ifdef ARDUINO_ARCH_SAMD
144+
#if defined(ARDUINO_ARCH_SAMD)
145+
alarm->enable = RT_FALSE;
146+
alarm->tm_hour = RTC_DEV(RTC_CTX())->RTCClass::getAlarmHours();
147+
alarm->tm_min = RTC_DEV(RTC_CTX())->RTCClass::getAlarmMinutes();
148+
alarm->tm_sec = RTC_DEV(RTC_CTX())->RTCClass::getAlarmSeconds();
149+
#elif defined(ARDUINO_ARCH_STM32)
135150
alarm->enable = RT_FALSE;
136-
alarm->tm_hour = RTC_DEV(RTC_CTX())->RTCZero::getAlarmHours();
137-
alarm->tm_min = RTC_DEV(RTC_CTX())->RTCZero::getAlarmMinutes();
138-
alarm->tm_sec = RTC_DEV(RTC_CTX())->RTCZero::getAlarmSeconds();
151+
alarm->tm_hour = RTC_DEV(RTC_CTX())->getAlarmHours();
152+
alarm->tm_min = RTC_DEV(RTC_CTX())->getAlarmMinutes();
153+
alarm->tm_sec = RTC_DEV(RTC_CTX())->getAlarmSeconds();
139154
#endif
140155
ret = RT_EOK;
141156
break;
142157

143158
case RT_DEVICE_CTRL_RTC_SET_ALARM:
144159
alarm = (struct rt_rtc_wkalarm *)args;
145-
#ifdef ARDUINO_ARCH_SAMD
160+
#if defined(ARDUINO_ARCH_SAMD) || defined(ARDUINO_ARCH_STM32)
146161
if (!alarm->enable) {
147162
RTC_DEV(RTC_CTX())->disableAlarm();
148163
} else {
164+
#if defined(ARDUINO_ARCH_STM32)
165+
RTC_DEV(RTC_CTX())->setAlarmDay(
166+
RTC_DEV(RTC_CTX())->getDay());
167+
#endif
149168
RTC_DEV(RTC_CTX())->setAlarmTime((rt_uint8_t)alarm->tm_hour,
150169
(rt_uint8_t)alarm->tm_min, (rt_uint8_t)alarm->tm_sec);
151170
RTC_DEV(RTC_CTX())->enableAlarm(
@@ -218,11 +237,14 @@ rt_err_t bsp_hw_rtc_init(void) {
218237
rt_err_t ret;
219238

220239
do {
221-
#ifdef ARDUINO_ARCH_SAMD
240+
#if defined(ARDUINO_ARCH_SAMD) || defined(ARDUINO_ARCH_STM32)
222241
ret = bsp_rtc_contex_init(RTC_CTX(), RTC_NAME, &_rtc);
223242
if (RT_EOK != ret) break;
224-
225-
RTC_DEV(RTC_CTX())->begin();
243+
#if defined(ARDUINO_ARCH_SAMD)
244+
RTC_DEV(RTC_CTX())->begin();
245+
#elif defined(ARDUINO_ARCH_STM32)
246+
RTC_DEV(RTC_CTX())->begin(false);
247+
#endif
226248
#endif
227249
LOG_D("[RTC] h/w init ok!");
228250
} while (0);

src/components/arduino/drv_rtc.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
/* Exported types ------------------------------------------------------------*/
1414
struct bsp_rtc_contex {
15-
#ifdef ARDUINO_ARCH_SAMD
15+
#if defined(ARDUINO_ARCH_SAMD) || defined(ARDUINO_ARCH_STM32)
1616
void *ldev; /* lower level device (Arduino RTC) */
1717
#endif
1818
struct rt_mutex lok; /* lock */

src/rtconfig.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@
125125
#ifdef ARDUINO_ARCH_STM32
126126
# define CONFIG_NO_ERRNO
127127
# define RT_TICK_PER_SECOND (1000)
128+
# define CONFIG_USING_DRIVER_RTC (1)
128129
#endif /* ARDUINO_ARCH_STM32 */
129130

130131

0 commit comments

Comments
 (0)