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


发生严重的崩溃
跳入我的(C)故障处理程序
将各种寄存器(CFSR,HFSR,LR,PC等)保存在备份SRAM中
重启
返回main()后,检查看门狗是否重置系统
提取保存在SRAM中的“崩溃报告”
将其转储到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));
}

最佳答案

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

10-08 18:08