19 #define RTC_MAX_TIME_MS (24*60*60*1000)
51 uint32_t RCC_GPIO_CLK_ENABLE;
86 extern __IO uint32_t
uwTick;
104 uint32_t rtc_ticks_ms = 0;
108 rtc_ticks_ms += time->Hours * 60 * 60 * 1000;
113 rtc_ticks_ms += time->Minutes * 60 * 1000;
118 rtc_ticks_ms += time->Seconds * 1000;
121 rtc_ticks_ms += ((time->SecondFraction - time->SubSeconds) * 1000) / (time->SecondFraction + 1);
135 uint32_t rtc_ticks_ms = tick;
139 time->Hours = (rtc_ticks_ms / (60 * 60 * 1000)) % 24;
141 rtc_ticks_ms = rtc_ticks_ms % (60 * 60 * 1000);
143 time->Minutes = (rtc_ticks_ms / (60 * 1000)) % 60;
145 rtc_ticks_ms = rtc_ticks_ms % (60 * 1000);
147 time->Seconds = (rtc_ticks_ms / 1000) % 60;
149 rtc_ticks_ms = rtc_ticks_ms % 1000;
151 time->SubSeconds = time->SecondFraction - (rtc_ticks_ms * (time->SecondFraction + 1)) / 1000;
162 RTC_DateTypeDef rtc_date = { 0 };
163 RTC_TimeTypeDef rtc_time = { 0 };
194 int32_t elapsed_ticks = (int32_t)rtc_ticks_post_sleep - rtc_ticks_pre_sleep;
196 if (elapsed_ticks < 0)
201 uwTick += (uint32_t)elapsed_ticks;
210 RTC_AlarmTypeDef alarm = { {0}, 0, 0, 0, 0, 0, 0};
216 alarm.Alarm = RTC_ALARM_A;
217 alarm.AlarmMask = RTC_ALARMMASK_DATEWEEKDAY;
218 alarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_SS14;
250 if (gpio_bank == GPIOA)
254 __HAL_RCC_GPIOA_CLK_ENABLE();
258 __HAL_RCC_GPIOA_CLK_DISABLE();
261 else if (gpio_bank == GPIOB)
265 __HAL_RCC_GPIOB_CLK_ENABLE();
269 __HAL_RCC_GPIOB_CLK_DISABLE();
272 else if (gpio_bank == GPIOH)
276 __HAL_RCC_GPIOH_CLK_ENABLE();
280 __HAL_RCC_GPIOH_CLK_DISABLE();
294 if (gpio_bank == GPIOA)
296 return __HAL_RCC_GPIOA_IS_CLK_ENABLED();
298 else if (gpio_bank == GPIOB)
300 return __HAL_RCC_GPIOB_IS_CLK_ENABLED();
302 else if (gpio_bank == GPIOH)
304 return __HAL_RCC_GPIOH_IS_CLK_ENABLED();
323 config->
MODER = READ_REG(gpio_bank->MODER);
324 config->
OTYPER = READ_REG(gpio_bank->OTYPER);
325 config->
OSPEEDR = READ_REG(gpio_bank->OSPEEDR);
326 config->
PUPDR = READ_REG(gpio_bank->PUPDR);
327 config->
AFR[0] = READ_REG(gpio_bank->AFR[0]);
328 config->
AFR[1] = READ_REG(gpio_bank->AFR[1]);
343 WRITE_REG(gpio_bank->MODER, config->
MODER);
344 WRITE_REG(gpio_bank->OTYPER, config->
OTYPER);
345 WRITE_REG(gpio_bank->OSPEEDR, config->
OSPEEDR);
346 WRITE_REG(gpio_bank->PUPDR, config->
PUPDR);
347 WRITE_REG(gpio_bank->AFR[0], config->
AFR[0]);
348 WRITE_REG(gpio_bank->AFR[1], config->
AFR[1]);
364 GPIO_InitTypeDef GPIO_InitStructOff;
372 __HAL_RCC_GPIOA_CLK_ENABLE();
373 __HAL_RCC_GPIOB_CLK_ENABLE();
374 __HAL_RCC_GPIOH_CLK_ENABLE();
382 GPIO_InitStructOff.Mode = GPIO_MODE_ANALOG;
383 GPIO_InitStructOff.Pull = GPIO_NOPULL;
385 GPIO_InitStructOff.Pin = GPIO_PIN_All;
388 GPIO_InitStructOff.Pin &= (uint16_t) ~(
SPI_SCK_Pin |
392 HAL_GPIO_Init(GPIOA, &GPIO_InitStructOff);
394 GPIO_InitStructOff.Pin = GPIO_PIN_All;
402 HAL_GPIO_Init(GPIOB, &GPIO_InitStructOff);
404 GPIO_InitStructOff.Pin = GPIO_PIN_All;
410 HAL_GPIO_Init(GPIOH, &GPIO_InitStructOff);
413 __HAL_RCC_GPIOA_CLK_DISABLE();
414 __HAL_RCC_GPIOB_CLK_DISABLE();
415 __HAL_RCC_GPIOH_CLK_DISABLE();
458 uint32_t wakeup_clock;
459 uint32_t wakeup_counter;
469 if (time_usec > 30000000)
471 wakeup_clock = RTC_WAKEUPCLOCK_CK_SPRE_16BITS;
472 wakeup_counter = (time_usec / 1000000) - 1;
474 else if (time_usec > 100000)
476 wakeup_clock = RTC_WAKEUPCLOCK_RTCCLK_DIV16;
477 wakeup_counter = (time_usec * 2 / 1000) - 1;
481 wakeup_clock = RTC_WAKEUPCLOCK_RTCCLK_DIV2;
482 wakeup_counter = (time_usec * 16 / 1000) - 1;
485 if (HAL_RTCEx_SetWakeUpTimer_IT(&
MODULE_RTC_HANDLE, wakeup_counter, wakeup_clock) != HAL_OK)
606 HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_SLEEPENTRY_WFI);
621 printf(
"acc_integration_set_periodic_wakeup must be called prior to calling this function\n");
628 return HAL_GetTick();
640 return calloc(nmemb, size);