52.BKP实验

引用自良许嵌入式:https://www.lxlinux.net/e/stm32/main.html 。自学用

1. 什么是BKP? 备份寄存器是42个16位的寄存器,可用来存储84个字节的用户应用程序数据。他们处在备份域里,当VDD电 源被切断,他们仍然由VBAT维持供电。当系统在待机模式下被唤醒,或系统复位或电源复位时,他们也不会 被复位。

此外, BKP控制寄存器用来管理侵入检测和RTC校准功能。 复位后,对备份寄存器和RTC的访问被禁止,并且备份域被保护以防止可能存在的意外的写操作。执行以下 操作可以使能对备份寄存器和RTC的访问:

1.通过设置寄存器RCC_APB1ENR的PWREN和BKPEN位来打开电源和后备接口的时钟。

2.电源控制寄存器(PWR_CR)的DBP位来使能对后备寄存器和RTC的访问。

   用户数据存储容量:

20字节(中容量和小容量)/ 84字节(大容量和互联型)

1.1初始化BKP
void rtc_init(void)
{
    __HAL_RCC_PWR_CLK_ENABLE();      // 启用电源控制(PWR)时钟
    __HAL_RCC_BKP_CLK_ENABLE();      // 启用后备域时钟(BKP)
    HAL_PWR_EnableBkUpAccess();      // 允许访问后备域

    rtc_handle.Instance = RTC;       // 将 RTC 外设实例与句柄绑定
    rtc_handle.Init.AsynchPrediv = 32767;  // 异步预分频器设置
    rtc_handle.Init.OutPut = RTC_OUTPUTSOURCE_NONE;  // 不输出信号到 RTC 外部
    HAL_RTC_Init(&rtc_handle);       // 初始化 RTC
}
1.2读取bkp的值
uint16_t rtc_read_bkr(uint8_t bkrx)
{
    uint32_t data = 0;
    data = HAL_RTCEx_BKUPRead(&rtc_handle, bkrx);
    return (uint16_t)data;
}
1.3 写入bkp的值
void rtc_write_bkr(uint8_t bkrx, uint16_t data)
{
    HAL_RTCEx_BKUPWrite(&rtc_handle, bkrx, data);
}

下面分别是.c和.h文件

#include "rtc.h"

RTC_HandleTypeDef rtc_handle = {0};
void rtc_init(void)
{
    __HAL_RCC_PWR_CLK_ENABLE();
    __HAL_RCC_BKP_CLK_ENABLE();
    HAL_PWR_EnableBkUpAccess();
    
    rtc_handle.Instance = RTC;
    rtc_handle.Init.AsynchPrediv = 32767;
    rtc_handle.Init.OutPut = RTC_OUTPUTSOURCE_NONE;
    HAL_RTC_Init(&rtc_handle);
}

uint16_t rtc_read_bkr(uint8_t bkrx)
{
    uint32_t data = 0;
    data = HAL_RTCEx_BKUPRead(&rtc_handle, bkrx);
    return (uint16_t)data;
}

void rtc_write_bkr(uint8_t bkrx, uint16_t data)
{
    HAL_RTCEx_BKUPWrite(&rtc_handle, bkrx, data);
}
#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

main文件

#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);     /* 设置时钟, 72Mhz */
    led_init();                         /* 初始化LED灯 */
    uart1_init(115200);
    rtc_init();
    printf("hello world!\r\n");
    
    rtc_write_bkr(1, 0xA5A5);
    printf("读出来的值为:%X\r\n", rtc_read_bkr(1));

    while(1)
    { 

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值