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