我正在为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才可读。如果您需要像以前一样在异常处理程序中启用它,则以前未启用它,因此无法读取。