stm32 之七 备份域(备份寄存器、备份sram)详解及数据丢失问题处理 -ag凯发k8国际
某些stm32芯片提供了备份sram,例如stm32f系列芯片有4k的备份sram。然而在使用过程中发现备份区域数据丢失!下面从stm32系列芯片提供的整个备份域来看看啥情况。
首先,这部分在参考手册的电源(pwr)章节有详细的介绍。器件的工作电压 (vdd) 要求介于 1.8 v 到 3.6 v 之间。嵌入式线性调压器用于提供内部 1.2 v数字电源。当主电源 vdd 断电时,可通过 vbat 电压为实时时钟 (rtc)、rtc备份寄存器 和 备份 sram(bkp sram) 供电。具体如下图:
手册中有许多对于使用芯片时对于电源部分设计的要求,例如引脚的使用、电流的要求等等,具体见手册!
复位后,备份域(rtc 寄存器、rtc 备份寄存器和备份 sram)将受到保护,以防止意外的写访问。要使能对备份域的访问,请按以下步骤进行操作:
访问 rtc 和 rtc 备份寄存器
访问备份 sram
想要访问备份域还是非常简单的,下面以访问备份sram为例,从代码角度说明一下(具体见注释即可):
/*** @brief (使用标准外设库)备份sram初始化* @param[in] void* @retval null*/ static void vbkpsraminit(void) {/* 电源接口时钟使能 (power interface clock enable) */rcc_apb1periphclockcmd(rcc_apb1periph_pwr, enable);/* dbp 位置 1,使能对备份域的访问 */pwr_backupaccesscmd(enable);/* 通过将 rcc ahb1 外设时钟使能寄存器 (rcc_ahb1enr) 中的 bkpsramen 位置 1, 使能备份 sram 时钟 */rcc_ahb1periphclockcmd(rcc_ahb1periph_bkpsram, enable);/* 应用程序必须等待备份调压器就绪标志 (brr) 置 1,指示在待机模式和 vbat 模式下会保持写入 ram 中的数据。 */while(pwr_getflagstatus(pwr_flag_brr) != set); }/** (使用hal库)备份sram初始化* * @param[in] null* @retval null **/ void bkp_sram_init(void) {/* 电源接口时钟使能 (power interface clock enable) */__hal_rcc_pwr_clk_enable();/* dbp 位置 1,使能对备份域的访问 */hal_pwr_enablebkupaccess();/* 通过将 rcc ahb1 外设时钟使能寄存器 (rcc_ahb1enr) 中的 bkpsramen 位置 1, 使能备份 sram 时钟 */__hal_rcc_bkpsram_clk_enable();/* 应用程序必须等待备份调压器就绪标志 (brr) 置 1,指示在待机模式和 vbat 模式下会保持写入 ram 中的数据。 */hal_pwrex_enablebkupreg(); }经过以上初始化之后,就可以使用备份域中的各部分功能了(rtc和备份sram的初始化有些区别)。
初始化后对于备份域中各功能(rtc、rtc备份寄存器、备份sram)的使用就比较灵活了。
- rtc: 使用相对来说比较复杂,后面独立介绍
- rtc备份寄存器: 读写非常简单,标准外设库和hal库都提供了函数直接进行读写。
- 备份sram: 这部分的使用就更加灵活了,可以直接当内存去访问。推荐一种使用分散加载文件进行访问的方式。具体为定义自己的结构体,使用结构体定义变量bkp_sram mycontent __attribute__((section("bkp_sram_section")));,最后使用分散加载文件,将以上定义的变量直接映射到备份sram即可。
在实际产品中使用时,发现备份sram中的数据丢失!检查在硬件上并没有出现任何问题,于是从软件一步步分析如下:
在iap跳转到app前,将备份域的各时钟失能,这样app中配置的备份sram才会有效。
后续可以测试一下其他外设是否有此问题。最好测试一下同样是挂在同一总线下的外设(gpio、dma、备份域时钟全部是在ahb总线下的)。
总结
以上是ag凯发k8国际为你收集整理的stm32 之七 备份域(备份寄存器、备份sram)详解及数据丢失问题处理的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 架构与设计 之一 c 嵌入式设计模式(d
- 下一篇: