18 #define RTC_MAX_TIME_MS (24 * 60 * 60 * 1000)
46 uint32_t RCC_GPIO_CLK_ENABLE;
77 extern __IO uint32_t
uwTick;
94 uint32_t rtc_ticks_ms = 0;
98 rtc_ticks_ms += time->Hours * 60 * 60 * 1000;
103 rtc_ticks_ms += time->Minutes * 60 * 1000;
108 rtc_ticks_ms += time->Seconds * 1000;
111 rtc_ticks_ms += ((time->SecondFraction - time->SubSeconds) * 1000) / (time->SecondFraction + 1);
124 uint32_t rtc_ticks_ms = tick;
128 time->Hours = (rtc_ticks_ms / (60 * 60 * 1000)) % 24;
130 rtc_ticks_ms = rtc_ticks_ms % (60 * 60 * 1000);
132 time->Minutes = (rtc_ticks_ms / (60 * 1000)) % 60;
134 rtc_ticks_ms = rtc_ticks_ms % (60 * 1000);
136 time->Seconds = (rtc_ticks_ms / 1000) % 60;
138 rtc_ticks_ms = rtc_ticks_ms % 1000;
140 time->SubSeconds = time->SecondFraction - (rtc_ticks_ms * (time->SecondFraction + 1)) / 1000;
150 RTC_DateTypeDef rtc_date = {0};
151 RTC_TimeTypeDef rtc_time = {0};
181 int32_t elapsed_ticks = (int32_t)rtc_ticks_post_sleep - rtc_ticks_pre_sleep;
183 if (elapsed_ticks < 0)
188 uwTick += (uint32_t)elapsed_ticks;
196 RTC_AlarmTypeDef alarm = {{0}, 0, 0, 0, 0, 0, 0};
202 alarm.Alarm = RTC_ALARM_A;
203 alarm.AlarmMask = RTC_ALARMMASK_DATEWEEKDAY;
204 alarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_SS14;
235 if (gpio_bank == GPIOA)
239 __HAL_RCC_GPIOA_CLK_ENABLE();
243 __HAL_RCC_GPIOA_CLK_DISABLE();
246 else if (gpio_bank == GPIOB)
250 __HAL_RCC_GPIOB_CLK_ENABLE();
254 __HAL_RCC_GPIOB_CLK_DISABLE();
257 else if (gpio_bank == GPIOH)
261 __HAL_RCC_GPIOH_CLK_ENABLE();
265 __HAL_RCC_GPIOH_CLK_DISABLE();
278 if (gpio_bank == GPIOA)
280 return __HAL_RCC_GPIOA_IS_CLK_ENABLED();
282 else if (gpio_bank == GPIOB)
284 return __HAL_RCC_GPIOB_IS_CLK_ENABLED();
286 else if (gpio_bank == GPIOH)
288 return __HAL_RCC_GPIOH_IS_CLK_ENABLED();
306 config->MODER = READ_REG(gpio_bank->MODER);
307 config->OTYPER = READ_REG(gpio_bank->OTYPER);
308 config->OSPEEDR = READ_REG(gpio_bank->OSPEEDR);
309 config->PUPDR = READ_REG(gpio_bank->PUPDR);
310 config->AFR[0] = READ_REG(gpio_bank->AFR[0]);
311 config->AFR[1] = READ_REG(gpio_bank->AFR[1]);
325 WRITE_REG(gpio_bank->MODER,
config->MODER);
326 WRITE_REG(gpio_bank->OTYPER,
config->OTYPER);
327 WRITE_REG(gpio_bank->OSPEEDR,
config->OSPEEDR);
328 WRITE_REG(gpio_bank->PUPDR,
config->PUPDR);
329 WRITE_REG(gpio_bank->AFR[0],
config->AFR[0]);
330 WRITE_REG(gpio_bank->AFR[1],
config->AFR[1]);
345 GPIO_InitTypeDef GPIO_InitStructOff;
353 __HAL_RCC_GPIOA_CLK_ENABLE();
354 __HAL_RCC_GPIOB_CLK_ENABLE();
355 __HAL_RCC_GPIOH_CLK_ENABLE();
363 GPIO_InitStructOff.Mode = GPIO_MODE_ANALOG;
364 GPIO_InitStructOff.Pull = GPIO_NOPULL;
366 GPIO_InitStructOff.Pin = GPIO_PIN_All;
371 HAL_GPIO_Init(GPIOA, &GPIO_InitStructOff);
373 GPIO_InitStructOff.Pin = GPIO_PIN_All;
378 HAL_GPIO_Init(GPIOB, &GPIO_InitStructOff);
380 GPIO_InitStructOff.Pin = GPIO_PIN_All;
385 HAL_GPIO_Init(GPIOH, &GPIO_InitStructOff);
388 __HAL_RCC_GPIOA_CLK_DISABLE();
389 __HAL_RCC_GPIOB_CLK_DISABLE();
390 __HAL_RCC_GPIOH_CLK_DISABLE();
427 uint32_t wakeup_clock;
428 uint32_t wakeup_counter;
438 if (time_usec > 30000000)
440 wakeup_clock = RTC_WAKEUPCLOCK_CK_SPRE_16BITS;
441 wakeup_counter = (time_usec / 1000000) - 1;
443 else if (time_usec > 100000)
445 wakeup_clock = RTC_WAKEUPCLOCK_RTCCLK_DIV16;
446 wakeup_counter = (time_usec * 2 / 1000) - 1;
450 wakeup_clock = RTC_WAKEUPCLOCK_RTCCLK_DIV2;
451 wakeup_counter = (time_usec * 16 / 1000) - 1;
454 if (HAL_RTCEx_SetWakeUpTimer_IT(&
MODULE_RTC_HANDLE, wakeup_counter, wakeup_clock) != HAL_OK)
568 HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_SLEEPENTRY_WFI);
583 printf(
"acc_integration_set_periodic_wakeup must be called prior to calling this function\n");
589 return HAL_GetTick();
599 return calloc(nmemb, size);