定义:


BKP(Backup Registers)备份寄存器 BKP可用于存储用户应用程序数据当VDD(2.0~3.6V)电源被切断,他们仍然由VBAT(1.8~3.6V)维持供电。当系统在待机模式下被唤醒,或系统复位或电源复位时,他们也不会被复位 TAMPER引脚产生的侵入事件将所有备份寄存器内容清除 RTC引脚输出RTC校准时钟、RTC闹钟脉冲或者秒脉冲 存储RTC时钟校准寄存器 用户数据存储容量: 20字节(中容量和小容量)/ 84字节(大容量和互联型)


1.0 BKP基本结构



2.0 RTC实时时钟


RTC(Real Time Clock)实时时钟 RTC是一个独立的定时器,可为系统提供时钟和日历的功能 RTC和时钟配置系统处于后备区域,系统复位时数据不清零,VDD(2.0~3.6V)断电后可借助VBAT(1.8~3.6V)供电继续走时 32位的可编程计数器,可对应Unix时间戳的秒计数器 20位的可编程预分频器,可适配不同频率的输入时钟 可选择三种RTC时钟源:     HSE时钟除以128(通常为8MHz/128)     LSE振荡器时钟(通常为32.768KHz)     LSI振荡器时钟(40KHz)

使用秒计数器,在读取和写入秒计数器时都需要进行时间戳的转换 


注:记住 H 字母开头的是高速, L 开头的是低速, E结尾的是外部, I 结尾的是内部。







3.0 RTC操作注意事项


执行以下操作将使能对BKP和RTC的访问:设置RCC_APB1ENR的PWREN和BKPEN,使能PWR和BKP时钟   

设置PWR_CR的DBP,使能对BKP和RTC的访问 若在读取RTC寄存器时,RTC的APB1接口曾经处于禁止状态,则软件首先必须等待RTC_CRL寄存器中的RSF位(寄存器同步标志)被硬件置1

必须设置RTC_CRL寄存器中的CNF位,使RTC进入配置模式后,才能写入RTC_PRL、RTC_CNT、RTC_ALR寄存器

对RTC任何寄存器的写操作,都必须在前一次写操作结束后进行。可以通过查询RTC_CR寄存器中的RTOFF状态位,判断RTC寄存器是否处于更新中。仅当RTOFF状态位是1时,才可以写入RTC寄存器。


4.0 手册解读


......


5.0 BKP对应的引脚库函数



以下解释就是这个库函数对应的作用:

设置PWR_CR的DBP,使能对BKP和RTC的访问 若在读取RTC寄存器时,RTC的APB1接口曾经处于禁止状态,则软件首先必须等待RTC_CRL寄存器中的RSF位(寄存器同步标志)被硬件置1


6.0 BKP对应读写


注:如果没有主电源,被动电源断电之后,BKP还是会正常的保存数据的,以下是一个测试功能函数。


#include "stm32f10x.h" // Device header
#include "OLED.h"

void BKP_Init(void)
{
    // 初始化APB1时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP, ENABLE);

    // 使能BKP对RTC的访问
    PWR_BackupAccessCmd(ENABLE);

    // 写BKP函数
    BKP_WriteBackupRegister(BKP_DR1, 0x1234);

    // OLED显示数据,将函数的返回值显示出来
    OLED_ShowHexNum(1, 1, BKP_ReadBackupRegister(BKP_DR1), 4);
}

 BKP 头文件函数

#ifndef __BKP_H_
#define __BKP_H_
#include <stdint.h>

void BKP_Init(void);

#endif

7.0 BKP读写显示



#include "stm32f10x.h" // Device header
#include "OLED.h"
#include "Key.h"

uint8_t KeyNum;

// 以下数组存储的是写入的内容
uint16_t ArrayWrite[] = {0x1234, 0x5678};
// 以下数组存储的是读取的内容
uint16_t ArrayRead[2];

void BKP_Init(void)
{
    OLED_Init();
    Key_Init();

    OLED_ShowString(1, 1, "W:");
    OLED_ShowString(2, 1, "R:");

    // 初始化APB1时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP, ENABLE);

    // 使能BKP对RTC的访问
    PWR_BackupAccessCmd(ENABLE);

    // 写BKP函数
    BKP_WriteBackupRegister(BKP_DR1, 0x1234);

    // OLED显示数据,将函数的返回值显示出来
    OLED_ShowHexNum(1, 1, BKP_ReadBackupRegister(BKP_DR1), 4);

    while (1)
    {
        KeyNum = Key_GetNum();

        if (KeyNum == 1)
        {
            ArrayWrite[0]++;
            ArrayWrite[1]++;

            BKP_WriteBackupRegister(BKP_DR1, ArrayWrite[0]);
            BKP_WriteBackupRegister(BKP_DR2, ArrayWrite[1]);

            OLED_ShowHexNum(1, 3, ArrayWrite[0], 4);
            OLED_ShowHexNum(1, 8, ArrayWrite[1], 4);
        }
        ArrayWrite[0] = BKP_ReadBackupRegister(BKP_DR1);
        ArrayWrite[1] = BKP_ReadBackupRegister(BKP_DR2);

        OLED_ShowHexNum(2, 3, ArrayRead[0], 4);
        OLED_ShowHexNum(2, 8, ArrayRead[1], 4);
    }

}

......

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐