珠寶品牌網(wǎng)站設(shè)計杭州網(wǎng)絡(luò)推廣網(wǎng)絡(luò)優(yōu)化
一、什么是BKP(備份寄存器)?
備份寄存器是42個16位的寄存器,可用來存儲84個字節(jié)的用戶應(yīng)用程序數(shù)據(jù)。他們處在備份域里,當(dāng)VDD電源被切斷,他們?nèi)匀挥蒝BAT維持供電。當(dāng)系統(tǒng)在待機模式下被喚醒,或系統(tǒng)復(fù)位或電源復(fù)位時,他們也不會被復(fù)位。
此外, BKP控制寄存器用來管理侵入檢測和RTC校準(zhǔn)功能。
復(fù)位后,對備份寄存器和RTC的訪問被禁止,并且備份域被保護(hù)以防止可能存在的意外的寫操作。執(zhí)行以下操作可以使能對備份寄存器和RTC的訪問:
通過設(shè)置寄存器RCC_APB1ENR的PWREN和BKPEN位來打開電源和后備接口的時鐘
電源控制寄存器(PWR_CR)的DBP位來使能對后備寄存器和RTC的訪問。
用戶數(shù)據(jù)存儲容量:
20字節(jié)(中容量和小容量)/ 84字節(jié)(大容量和互聯(lián)型)
二、BKP框圖
?三、讀寫B(tài)KP
復(fù)制項目文件19-串口打印功能
重命名為53-BKP讀寫
打開項目
加載文件
bkp與rtc的關(guān)系?
BKP是控制寄存器用來管理侵入檢測和RTC校準(zhǔn)功能。存儲RTC的校驗值或者記錄一些重要的數(shù)據(jù)。
main.c
#include "sys.h"
#include "delay.h"
#include "led.h"
#include "uart1.h"
#include "rtc.h"int main(void)
{HAL_Init(); /* 初始化HAL庫 */stm32_clock_init(RCC_PLL_MUL9); /* 設(shè)置時鐘, 72Mhz */led_init(); /* 初始化LED燈 */uart1_init(115200);rtc_init();printf("hello world!\r\n");rtc_write_bkr(1, 0xA5A5);//寫進(jìn)去一個內(nèi)容//讀出來一個內(nèi)容printf("讀出來的值為:%X\r\n", rtc_read_bkr(1));//以十六進(jìn)制的方式進(jìn)行打印while(1){ }
}
rtc.c
#include "rtc.h"RTC_HandleTypeDef rtc_handle = {0};
//初始化rtc,因為bkp依賴于rtc
void rtc_init(void)
{__HAL_RCC_PWR_CLK_ENABLE();//使能電源時鐘__HAL_RCC_BKP_CLK_ENABLE();//使能bkp時鐘HAL_PWR_EnableBkUpAccess();//允許訪問備份域rtc_handle.Instance = RTC;rtc_handle.Init.AsynchPrediv = 32767;rtc_handle.Init.OutPut = RTC_OUTPUTSOURCE_NONE;HAL_RTC_Init(&rtc_handle);
}
//讀rtc,讀出來是2個字符16個字節(jié),十六位寄存器,bkrx指定讀的是哪個寄存器
uint16_t rtc_read_bkr(uint8_t bkrx)
{uint32_t data = 0;//讀bkp寄存器data = HAL_RTCEx_BKUPRead(&rtc_handle, bkrx);return (uint16_t)data;
}
//寫rtc,寫進(jìn)哪個寄存器?bkrx,寫進(jìn)去什么?data
void rtc_write_bkr(uint8_t bkrx,uint16_t data)
{//寫bkp寄存器HAL_RTCEx_BKUPWrite(&rtc_handle, bkrx, data);
}
rtc.h
#ifndef __RTC_H__
#define __RTC_H__#include "sys.h"void rtc_init(void);
uint16_t rtc_read_bkr(uint8_t bkrx);
void rtc_write_bkr(uint8_t bkrx, uint16_t data);#endif
實現(xiàn)結(jié)果: