STM32-BKP-外部寄存器
BKP(Backup Registers)备份寄存器 BKP可用于存储用户应用程序数据。当VDD(2.0~3.6V)电源被切断,他们仍然由VBAT(1.8~3.6V)维持供电。当系统在待机模式下被唤醒,或系统复位或电源复位时,他们也不会被复位 TAMPER引脚产生的侵入事件将所有备份寄存器内容清除 RTC引脚输出RTC校准时钟、RTC闹钟脉冲或者秒脉冲 存储RTC时钟校准寄存器 用户数据存储容量:
定义:
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);
}
}
......
更多推荐



所有评论(0)