Резервная копия SRAM для STM32 стирается между перезагрузками - PullRequest
0 голосов
/ 14 января 2019

Я пишу (лучший) обработчик ошибок для моего STM32f207zg и хочу сделать следующее:

  1. Ужасная авария
  2. Перейти в мой (C) обработчик ошибок
  3. Сохранение различных регистров (CFSR, HFSR, LR, PC, ...) в резервную копию SRAM
  4. Сброс
  5. Вернувшись в main (), проверьте, сбрасывает ли сторожевой таймер систему
  6. Получить "отчет о сбое", сохраненный в SRAM
  7. Дамп на 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));
}

1 Ответ

0 голосов
/ 16 января 2019

Резервная SRAM не может быть прочитана до тех пор, пока не будут включены часы BKPSRAM. Если вам нужно включить его в обработчике исключений, как это было раньше, то он не был ранее включен и, следовательно, не мог быть прочитан.

...