16 #define I2C_SLAVE_BUFFER_SIZE 4
17 #define WAIT_FOR_IDLE_RETRIES 10U
18 #define WAIT_FOR_IDLE_RETRY_INTERNAL_MS 10U
19 #define GPIO_BANK_COUNT 3U
151 return pin_state == GPIO_PIN_SET;
157 GPIO_PinState pin_state = enable ? GPIO_PIN_SET : GPIO_PIN_RESET;
166 GPIO_InitTypeDef GPIO_InitStruct;
169 GPIO_InitStruct.Pull = GPIO_NOPULL;
173 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
177 GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
186 GPIO_PinState pin_state = enable ? GPIO_PIN_SET : GPIO_PIN_RESET;
207 HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_SLEEPENTRY_WFI);
230 return periodic_wakeup;
275 gpio_config->
MODER = READ_REG(gpio_bank->MODER);
276 gpio_config->
OTYPER = READ_REG(gpio_bank->OTYPER);
277 gpio_config->
OSPEEDR = READ_REG(gpio_bank->OSPEEDR);
278 gpio_config->
PUPDR = READ_REG(gpio_bank->PUPDR);
279 gpio_config->
AFR[0] = READ_REG(gpio_bank->AFR[0]);
280 gpio_config->
AFR[1] = READ_REG(gpio_bank->AFR[1]);
284 GPIO_InitTypeDef GPIO_InitStructOff;
287 GPIO_InitStructOff.Mode = GPIO_MODE_ANALOG;
288 GPIO_InitStructOff.Pull = GPIO_NOPULL;
291 GPIO_InitStructOff.Pin = GPIO_PIN_All;
293 HAL_GPIO_Init(GPIOA, &GPIO_InitStructOff);
296 GPIO_InitStructOff.Pin = GPIO_PIN_All;
298 HAL_GPIO_Init(GPIOB, &GPIO_InitStructOff);
301 GPIO_InitStructOff.Pin = GPIO_PIN_All;
302 HAL_GPIO_Init(GPIOH, &GPIO_InitStructOff);
305 __HAL_RCC_GPIOA_CLK_DISABLE();
306 __HAL_RCC_GPIOB_CLK_DISABLE();
307 __HAL_RCC_GPIOH_CLK_DISABLE();
320 __HAL_RCC_GPIOA_CLK_ENABLE();
321 __HAL_RCC_GPIOB_CLK_ENABLE();
322 __HAL_RCC_GPIOH_CLK_ENABLE();
330 WRITE_REG(gpio_bank->MODER, gpio_config->
MODER);
331 WRITE_REG(gpio_bank->OTYPER, gpio_config->
OTYPER);
332 WRITE_REG(gpio_bank->OSPEEDR, gpio_config->
OSPEEDR);
333 WRITE_REG(gpio_bank->PUPDR, gpio_config->
PUPDR);
334 WRITE_REG(gpio_bank->AFR[0], gpio_config->
AFR[0]);
335 WRITE_REG(gpio_bank->AFR[1], gpio_config->
AFR[1]);
356 RTC_DateTypeDef rtc_date = { 0 };
357 RTC_TimeTypeDef rtc_time = { 0 };
375 uint32_t rtc_ticks_ms = 0;
379 rtc_ticks_ms += rtc_time.Hours * 60 * 60 * 1000;
382 if (rtc_time.Minutes)
384 rtc_ticks_ms += rtc_time.Minutes * 60 * 1000;
387 if (rtc_time.Seconds)
389 rtc_ticks_ms += rtc_time.Seconds * 1000;
392 rtc_ticks_ms += ((rtc_time.SecondFraction - rtc_time.SubSeconds) * 1000) / (rtc_time.SecondFraction + 1);
400 uint32_t rtc_ticks_ms = tick;
404 time->Hours = (rtc_ticks_ms / (60 * 60 * 1000)) % 24;
406 rtc_ticks_ms = rtc_ticks_ms % (60 * 60 * 1000);
408 time->Minutes = (rtc_ticks_ms / (60 * 1000)) % 60;
410 rtc_ticks_ms = rtc_ticks_ms % (60 * 1000);
412 time->Seconds = (rtc_ticks_ms / 1000) % 60;
414 rtc_ticks_ms = rtc_ticks_ms % 1000;
416 time->SubSeconds = time->SecondFraction - (rtc_ticks_ms * (time->SecondFraction + 1)) / 1000;
422 RTC_AlarmTypeDef alarm = { {0}, 0, 0, 0, 0, 0, 0};
428 alarm.Alarm = RTC_ALARM_B;
429 alarm.AlarmMask = RTC_ALARMMASK_DATEWEEKDAY;
430 alarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_SS14;
478 if (HAL_I2C_Slave_Seq_Transmit_IT(hi2c,
481 I2C_NEXT_FRAME) != HAL_OK)
504 if (TransferDirection == I2C_DIRECTION_TRANSMIT)
510 if (HAL_I2C_Slave_Seq_Receive_IT(hi2c,
513 I2C_NEXT_FRAME) != HAL_OK)
540 uint16_t input_length = (uint16_t)((uintptr_t)hi2c->pBuffPtr - (uintptr_t)
i2c_slave_buffer);
556 __HAL_I2C_GENERATE_NACK(hi2c);
560 if (HAL_I2C_Slave_Seq_Receive_IT(hi2c,
563 I2C_NEXT_FRAME) != HAL_OK)
579 if (HAL_I2C_EnableListen_IT(hi2c) != HAL_OK)
593 if (HAL_I2C_GetError(hi2c) != HAL_I2C_ERROR_AF)