Возможен ли доступ к регистрам RTC-BACKUP через структуру битовых полей?
В МК STM32L0x1 есть несколько 32-битных backup регистров, доступ к которым возможен через MMIO:
// Доступ к регистру BKP0 через базовый адрес: RTC->BKP0R
uint32_t tmp = (uint32_t)&(RTC->BKP0R) + RTC_BKP_DR0;
// Запись в регистр BKP0 значения 42
*(volatile uint32_t *)tmp = 42;
// Чтение из регистра BKP0
uint32_t value = *(volatile uint32_t *)tmp;
Мне бы хотелось иметь доступ к данным регистрам через битовые поля структуры, которые отображаются непосредственно на область памяти, в которой эти регистры размещены:
// Объединение, которое будет отображаться в память
typedef union
{
uint32_t value;
struct
{
uint32_t flag_0 : 1;
uint32_t flag_1 : 1;
uint32_t err_cnt : 4;
uint32_t interval : 7;
} bits;
} bkp_data_t;
// Экземпляр отображения битового поля на регистр BKP0
bkp_data_t* bkp_data = (bkp_data_t*)((uint32_t)&RTC->BKP0R + RTC_BKP_DR0);
// Функция установки битового поля
void set_flag_0(bool value)
{
critical_enter();
bkp_data->bits.flag_0 = value;
critical_exit();
}
// Функция чтения битового поля
bool get_flag_0(void)
{
bool ret = false;
critical_enter();
ret = bkp_data->bits.flag_0;
critical_exit();
return ret;
}
Такой подход является работоспособным при отображении битовых полей на произвольную область памяти в RAM для неатомарного доступа к отдельным битам. Но насколько жизнеспособно такое отображение в случае BACKUP регистров?