Я пишу (лучший) обработчик ошибок для моего STM32f207zg и хочу сделать следующее:
- Ужасная авария
- Перейти в мой (C) обработчик ошибок
- Сохранение различных регистров (CFSR, HFSR, LR, PC, ...) в резервную копию SRAM
- Сброс
- Вернувшись в main (), проверьте, сбрасывает ли сторожевой таймер систему
- Получить "отчет о сбое", сохраненный в SRAM
- Дамп на CAN
1,2,4,5,7 легко, но у меня проблемы с сохранением / восстановлением из SRAM.
Обработчик hardfault вызывает функцию fault_bksram_init () после заполнения структуры fault_crash_t данными. Затем он вызывает fault_write_crash () , чтобы записать «отчет» в SRAM. Используя мой отладчик, я вижу, что данные фактически записываются по адресу, определенному в BKPSRAM_BASE ; однако после выполнения сброса с использованием отладчика память в BKPSRAM_BASE стирается с 0xff .
Другими словами, данные теряются между перезагрузками.
У меня есть правильное напряжение, подключенное к VBat (RTC работает хорошо), но я никогда раньше не использовал резервную SRAM.
Я что-то упустил при инициализации SRAM? Я что-то упустил в обработчике с серьезными ошибками? Или это сброс отладчика, который портит SRAM?
void fault_bksram_init(void) {
/* Enable PWR clock */
RCC->APB1ENR |= RCC_APB1ENR_PWREN;
/* Enable backup SRAM Clock */
RCC->AHB1ENR |= RCC_AHB1ENR_BKPSRAMEN;
/* Disable write protection */
PWR->CR |= PWR_CR_DBP;
/* Enable backup regulator */
PWR->CSR |= PWR_CSR_BRE;
/* Wait for backup regulator to be ready */
while (!(PWR->CSR & (PWR_FLAG_BRR)));
}
void fault_write_crash(fault_crash_t* crash) {
/* Copy crash to BKSRAM */
memcpy((void*)BKPSRAM_BASE, (void*)crash, sizeof(fault_crash_t));
}