kopia lustrzana https://github.com/SP8EBC/ParaTNC
304 wiersze
4.4 KiB
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
|
||
|
}
|
||
|
|