@@ -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
2026extern " 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 ---------------------------------------------------------*/
5864static 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
6272extern " 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 );
0 commit comments