重置之间擦除了STM32的备用SRAM

时间:2019-01-14 14:32:59

标签: c embedded stm32

我正在为STM32f207zg编写一个(更好的)硬故障处理程序,并希望执行以下操作:

  1. 发生了可怕的崩溃
  2. 跳入我的(C)故障处理程序
  3. 将各种寄存器(CFSR,HFSR,LR,PC等)保存在备用SRAM中
  4. 重置
  5. 回到main()后,检查看门狗是否重置系统
  6. 获取保存在SRAM中的“崩溃报告”
  7. 将其转储到CAN上

1,2,4,5,7很简单,但是我在从SRAM中保存/还原时遇到了问题。

在使用数据填充 fault_crash_t 结构后,hardfault-handler调用函数 fault_bksram_init()。然后,它调用 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 :(得分:0)

在启用BKPSRAM时钟之前,无法读取备份SRAM。如果您需要像以前一样在异常处理程序中启用它,则以前未启用它,因此无法读取。