1. Backup Registers / SRAM 介绍
- Backup Registers 和实时时钟 RTC(Real-time Clock)单元一般属于备份域 (Backup Domain) 的一部分, RTC 时钟作为独立存在的计时器,可提供日历时钟、定时中断、自动唤醒等功能
- 不同型号的 STM32 芯片具有不同数量、不同字长的 Backup Registers, 甚至部分型号还有 Backup SRAM 用于任意数据的保存
- 无论芯片处于 run、reset 或任一 low-power 模式下, Backup Registers、Backup SRAM 数据均不会丢失(需要 VDD/VBAT 供电),但在检测到 Tamper 事件时自动清空该数据
应用场景
- 1) 在设备低功耗休眠、主电源离线的情况下,保存一些业务数据(或不宜 Flash 持久化存储的敏感数据)
- 2) 通过纽扣电池供电实现硬件 RTC 时间的连续,不丢失系统时间
- 3) 与 Tamper 中断功能配合实现设备破坏检测
2. 示例代码
以 RT-Thread + STM32F401CCU6 为例,测试 Backup Register 读写的代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
// 1. enable RTC for RT-Thread, at rtconfig.h: #define RT_USING_RTC // 2. enable RTC for BSP, at drivers/board.h: #define BSP_USING_ONCHIP_RTC and #define BSP_RTC_USING_LSI // 3. enable RTC for HAL, at drivers/stm32f4xx_hal_conf.h: #define HAL_RTC_MODULE_ENABLED // 4. export 'RTC_Handler' from drivers/drv_rtc.c, by removing the 'static' declaration for 'RTC_Handler' extern RTC_HandleTypeDef RTC_Handler; void write_backup_regs(int data){ HAL_RTCEx_BKUPWrite(&RTC_Handler, RTC_BKP_DR0, data); // 这里仅以 RTC_BKP_DR0 寄存器为例 return; } int read_backup_regs(void){ int data = HAL_RTCEx_BKUPRead(&RTC_Handler, RTC_BKP_DR0); // 这里仅以 RTC_BKP_DR0 寄存器为例 rt_kprintf("Backup Reg DR0: 0x%x\n", data); return data; } |
《STM32 Backup Registers/SRAM 读写》有1个想法