SP8EBC-ParaTNC/src/backup_registers.c

304 wiersze
4.4 KiB
C

/*
* backup_registers.cpp
*
* Created on: Oct 19, 2023
* Author: mateusz
*/
#include "backup_registers.h"
#ifdef STM32L471xx
#define REGISTER RTC->BKP0R
#define REGISTER_LAST_SLEEP RTC->BKP1R
#define REGISTER_LAST_WKUP RTC->BKP2R
#define REGISTER_COUNTERS RTC->BKP4R
#define REGISTER_LAST_SLTIM RTC->BKP6R
#endif
#define BACKUP_REG_INHIBIT_PWR_SWITCH_PERIODIC_H 1u
#define BACKUP_REG_ALL_PWRSAVE_STATES_BITMASK (0xFFu << 2)
static void backup_reg_unclock(void) {
// enable access to backup domain
PWR->CR1 |= PWR_CR1_DBP;
}
static void backup_reg_lock(void) {
PWR->CR1 &= (0xFFFFFFFFu ^ PWR_CR1_DBP);
}
/**
*
* @return
*/
uint32_t backup_reg_get_configuration(void) {
uint32_t out = 0;
#ifdef PARATNC
out = BKP->DR3;
#endif
#ifdef PARAMETEO
out = RTC->BKP3R;
#endif
return out;
}
void backup_reg_set_configuration(uint32_t value) {
#ifdef PARATNC
BKP->DR3 = value;
#endif
#ifdef PARAMETEO
backup_reg_unclock();
RTC->BKP3R = value;
backup_reg_lock();
#endif
}
void backup_reg_set_bits_configuration(uint32_t value) {
#ifdef PARATNC
BKP->DR3 |= value;
#endif
#ifdef PARAMETEO
// enable access to backup domain
backup_reg_unclock();
RTC->BKP3R |= value;
backup_reg_lock();
#endif
}
void backup_reg_clear_bits_configuration(uint32_t value) {
#ifdef PARATNC
BKP->DR3 &= (0xFFFF ^ value);
#endif
#ifdef PARAMETEO
// enable access to backup domain
backup_reg_unclock();
RTC->BKP3R &= (0xFFFFFFFFu ^ value);
backup_reg_lock();
#endif
}
/**
*
*/
void backup_reg_reset_all_powersave_states(void) {
backup_reg_unclock();
#ifdef PARAMETEO
REGISTER &= 0xFFFFFFFFu ^ BACKUP_REG_ALL_PWRSAVE_STATES_BITMASK;
#endif
backup_reg_lock();
}
int backup_reg_is_in_powersave_state(uint32_t state) {
int out = 0;
#ifdef PARAMETEO
if ((REGISTER & BACKUP_REG_ALL_PWRSAVE_STATES_BITMASK) == state) {
out = 1;
}
#endif
return out;
}
void backup_reg_set_powersave_state(uint32_t state) {
#ifdef PARAMETEO
backup_reg_unclock();
REGISTER |= state;
backup_reg_lock();
#endif
}
uint16_t backup_reg_get_powersave_state(void) {
int out = 0;
#ifdef PARAMETEO
out = (uint16_t)(REGISTER & BACKUP_REG_ALL_PWRSAVE_STATES_BITMASK);
#endif
return out;
}
/**
*
* @return
*/
uint32_t backup_reg_get_wakeup_counter(void) {
uint32_t out = 0;
#ifdef PARAMETEO
out = (uint32_t)((REGISTER_COUNTERS & 0xFFFF0000u) >> 16);
#endif
return out;
}
void backup_reg_set_wakeup_counter(uint32_t in) {
backup_reg_unclock();
#ifdef PARAMETEO
REGISTER_COUNTERS = (REGISTER_COUNTERS & 0x0000FFFFu) | ((in & 0xFFFFu) << 16);
#endif
backup_reg_lock();
}
/**
*
* @return
*/
uint32_t backup_reg_get_sleep_counter(void) {
uint32_t out = 0;
#ifdef PARAMETEO
out = (uint16_t)(REGISTER_COUNTERS & 0xFFFFu);
#endif
return out;
}
void backup_reg_set_sleep_counter(uint32_t in) {
backup_reg_unclock();
#ifdef PARAMETEO
REGISTER_COUNTERS = (REGISTER_COUNTERS & 0xFFFF0000u) | (uint16_t)(in & 0xFFFFu);
#endif
backup_reg_lock();
}
/**
*
*/
uint32_t backup_reg_get_last_sleep_timestamp(void) {
uint32_t out = 0;
#ifdef PARAMETEO
out = REGISTER_LAST_SLEEP;
#endif
return out;
}
void backup_reg_set_last_sleep_timestamp(void) {
#ifdef PARAMETEO
backup_reg_unclock();
REGISTER_LAST_SLEEP = RTC->TR;
backup_reg_lock();
#endif
}
/**
*
*/
void backup_reg_reset_inhibit_periodic_pwr_switch(void) {
backup_reg_unclock();
#ifdef PARAMETEO
REGISTER &= 0xFFFFFFFFu ^ BACKUP_REG_INHIBIT_PWR_SWITCH_PERIODIC_H;
#endif
backup_reg_lock();
}
void backup_reg_inhibit_periodic_pwr_switch(void) {
backup_reg_unclock();
#ifdef PARAMETEO
REGISTER |= BACKUP_REG_INHIBIT_PWR_SWITCH_PERIODIC_H;
#endif
backup_reg_lock();
}
uint32_t backup_reg_is_periodic_pwr_switch_inhibited(void) {
int out = 0;
#ifdef PARAMETEO
if ((REGISTER & BACKUP_REG_INHIBIT_PWR_SWITCH_PERIODIC_H) != 0) {
out = 1u;
}
#endif
return out;
}
/**
*
* @return
*/
uint32_t backup_reg_get_last_wakeup_timestamp(void) {
uint32_t out = 0;
#ifdef PARAMETEO
out = REGISTER_LAST_WKUP;
#endif
return out;
}
void backup_reg_set_last_wakeup_timestamp(void) {
#ifdef PARAMETEO
backup_reg_unclock();
REGISTER_LAST_WKUP = RTC->TR;
backup_reg_lock();
#endif
}
/**
*
* @return
*/
uint32_t backup_reg_get_last_sleep_duration(void) {
uint32_t out = 0;
#ifdef PARAMETEO
out = REGISTER_LAST_SLTIM;
#endif
return out;
}
void backup_reg_set_last_sleep_duration(uint32_t in) {
#ifdef PARAMETEO
backup_reg_unclock();
REGISTER_LAST_SLTIM = in;
backup_reg_lock();
#endif
}