после прочтения Справочное руководство по stm32f4 и stm32f405xx/stm32f407xx таблицы Я согласен, что это ISN» t ясно, как на самом деле использовать резервный sram (или где он находится). Вот что я нашел. Оба регистратора RTC и резервная SRAM содержат некоторое количество хранилища, которое поддерживается до тех пор, пока у вас есть питание от батареи.RTC содержит 20 регистров (80 байт), а резервный sram (который является его собственным периферийным устройством на AHB1 и расположенным в области адресов регистров) содержит 0x1000 (4096 байт). По умолчанию они не включены.
в DM00037051 (stm32f405xx/stm32f407xx техническое описание, P29):
The 4-Kbyte backup SRAM is an EEPROM-like memory area. It can be used to store
data which need to be retained in VBAT and standby mode. This memory area is
disabled by default to minimize power consumption (see Section 2.2.19:
Low-power modes). It can be enabled by software.
The backup registers are 32-bit registers used to store 80 bytes of user
application data when VDD power is not present. Backup registers are not reset
by a system, a power reset, or when the device wakes up from the Standby mode
(see Section 2.2.19: Low-power modes).
на стр 71 таблицы и р65 в справочном руководстве
AHB1 | 0x4002 4000 - 0x4002 4FFF | BKPSRAM
и странице 73 datatasheet и P67 из Справочное руководство
APB1 | 0x4000 2800 - 0x4000 2BFF | RTC & BKP Registers
В Справочном руководстве приведена информация по e привязка резервных SRAM и RTC регистров.
ПРИМЕЧАНИЕ. Если вы уже используете RTC в резервном домене и вам нужно хранить только < = 80 байт, тогда вам лучше использовать регистры резервного копирования RTC, поскольку включение резервного SRAM будет в основном удвоить текущее потребление (см. таблицу 25 в техническом описании stm32f405/7).
здесь мои записи и чтения функции как для резервного SRAM и резервного копирования RTC регистров
int8_t write_to_backup_sram(uint8_t *data, uint16_t bytes, uint16_t offset) {
const uint16_t backup_size = 0x1000;
uint8_t* base_addr = (uint8_t *) BKPSRAM_BASE;
uint16_t i;
if(bytes + offset >= backup_size) {
/* ERROR : the last byte is outside the backup SRAM region */
return -1;
}
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_BKPSRAM, ENABLE);
/* disable backup domain write protection */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); // set RCC->APB1ENR.pwren
PWR_BackupAccessCmd(ENABLE); // set PWR->CR.dbp = 1;
/** enable the backup regulator (used to maintain the backup SRAM content in
* standby and Vbat modes). NOTE : this bit is not reset when the device
* wakes up from standby, system reset or power reset. You can check that
* the backup regulator is ready on PWR->CSR.brr, see rm p144 */
PWR_BackupRegulatorCmd(ENABLE); // set PWR->CSR.bre = 1;
for(i = 0; i < bytes; i++) {
*(base_addr + offset + i) = *(data + i);
}
PWR_BackupAccessCmd(DISABLE); // reset PWR->CR.dbp = 0;
return 0;
}
int8_t read_from_backup_sram(uint8_t *data, uint16_t bytes, uint16_t offset) {
const uint16_t backup_size = 0x1000;
uint8_t* base_addr = (uint8_t *) BKPSRAM_BASE;
uint16_t i;
if(bytes + offset >= backup_size) {
/* ERROR : the last byte is outside the backup SRAM region */
return -1;
}
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_BKPSRAM, ENABLE);
for(i = 0; i < bytes; i++) {
*(data + i) = *(base_addr + offset + i);
}
return 0;
}
int8_t write_to_backup_rtc(uint32_t *data, uint16_t bytes, uint16_t offset) {
const uint16_t backup_size = 80;
volatile uint32_t* base_addr = &(RTC->BKP0R);
uint16_t i;
if(bytes + offset >= backup_size) {
/* ERROR : the last byte is outside the backup SRAM region */
return -1;
} else if(offset % 4 || bytes % 4) {
/* ERROR: data start or num bytes are not word aligned */
return -2;
} else {
bytes >>= 2; /* divide by 4 because writing words */
}
/* disable backup domain write protection */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); // set RCC->APB1ENR.pwren
PWR_BackupAccessCmd(ENABLE); // set PWR->CR.dbp = 1;
for(i = 0; i < bytes; i++) {
*(base_addr + offset + i) = *(data + i);
}
PWR_BackupAccessCmd(DISABLE); // reset PWR->CR.dbp = 0;
// consider also disabling the power peripherial?
return 0;
}
int8_t read_from_backup_rtc(uint32_t *data, uint16_t bytes, uint16_t offset) {
const uint16_t backup_size = 80;
volatile uint32_t* base_addr = &(RTC->BKP0R);
uint16_t i;
if(bytes + offset >= backup_size) {
/* ERROR : the last byte is outside the backup SRAM region */
return -1;
} else if(offset % 4 || bytes % 4) {
/* ERROR: data start or num bytes are not word aligned */
return -2;
} else {
bytes >>= 2; /* divide by 4 because writing words */
}
/* read should be 32 bit aligned */
for(i = 0; i < bytes; i++) {
*(data + i) = *(base_addr + offset + i);
}
return 0;
}
У вас есть библиотека stm32 f4 series или вам нужно самостоятельно изменить периферийные регистры? –