gpt4 book ai didi

c - STM32 的备份 SRAM 在复位之间被删除

转载 作者:行者123 更新时间:2023-11-30 16:22:58 32 4
gpt4 key购买 nike

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

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

1,2,4,5,7 很简单,但我在从 SRAM 保存/恢复时遇到问题。

硬故障处理程序在用数据填充fault_crash_t结构后调用函数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 不可读。如果您需要在异常处理程序中启用它,那么它之前没有启用,因此无法读取。

关于c - STM32 的备份 SRAM 在复位之间被删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54183453/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com