简介
备份寄存器是42个16位的寄存器,可用来存储84个字节的用户应用程序数据。他们处在备份域
里,当VDD电源被切断,他们仍然由VBAT维持供电。当系统在待机模式下被唤醒,或系统复位或
电源复位时,他们也不会被复位。
此外,BKP控制寄存器用来管理侵入检测和RTC校准功能。
复位后,对备份寄存器和RTC的访问被禁止,并且备份域被保护以防止可能存在的意外的写操
作。执行以下操作可以使能对备份寄存器和RTC的访问。
● 通过设置寄存器RCC_APB1ENR的PWREN和BKPEN位来打开电源和后备接口的时钟
● 电源控制寄存器(PWR_CR)的DBP位来使能对后备寄存器和RTC的访问。
注意
20字节数据后备寄存器(中容量和小容量产品),或84字节数据后备寄存器(大容量和互联型产品) 例如stm32f103c8t6 只有20个字节 ,也就是10个寄存器。
数据备份寄存器
数据备份寄存器x 中的x从1开始而不是从0来开始
在 MCU 复位后,备份数据寄存器的写访问就被禁止,需要执行以下操作才可以对 RTC 及备份数据寄存器进行写访问:
- 通过设置寄存器 RCC_APB1ENR 的 PWREN 和 BKPEN 位来打开电源和后备接口时钟
- 电源控制寄存器(PWR_CR)的 DBP 位来使能对后备寄存器和 RTC 访问
硬件连接
VBAT连接要连接电源正极
VBAT电压范围为:1.8~3.6V
HAL库函数程序
驱动代码
#include "bkp.h"
RTC_HandleTypeDef rtc_handle = {0};
void bkp_init(void)
{
__HAL_RCC_PWR_CLK_ENABLE();
__HAL_RCC_BKP_CLK_ENABLE();
HAL_PWR_EnableBkUpAccess();
rtc_handle.Instance = RTC;
HAL_RTC_Init(&rtc_handle);
}
uint16_t read_bkr(uint8_t bkrx)
{
uint32_t data = 0;
data = HAL_RTCEx_BKUPRead(&rtc_handle, bkrx);
return (uint16_t)data;
}
void write_bkr(uint8_t bkrx, uint16_t data)
{
HAL_RTCEx_BKUPWrite(&rtc_handle, bkrx, data);
}
main函数部分
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
led_init(); /* 初始化LED灯 */
uart1_init(115200);
bkp_init();
printf("hello world!\r\n");
write_bkr(2, 0xAAAA);
printf("读出来的值为:%X\r\n", read_bkr(2));
while(1)
{
}
}
寄存器版本
底层驱动
#include "bkp.h"
void bkp_init()
{
RCC->APB1ENR |= 0x01<<27; /* BKPEN */
RCC->APB1ENR |= 0x01<<28; /* PWREN */
PWR->CR |= 0x01<<8; /* DBP */
}
void bkp_rite(uint32_t DRx, uint32_t Data)
{
uint32_t tmp = 0U;
tmp = (uint32_t)BKP_BASE;
tmp += (DRx * 4U);
*(uint32_t *) tmp = (Data & 0xFFFF);
}
main
int main(void)
{
sys_stm32_clock_init(9); /* 设置时钟, 72Mhz */
delay_init(72); /* 延时初始化 */
usart_init(72, 115200); /* 串口初始化 */
bkp_init();
bkp_rite(1,0xBBAA);
printf("BKP->DR1 = %X\r\n",BKP->DR1);
while (1)
{
}
}