stm32 BKP寄存器 读写程序hal库版本+寄存器版本 pcb原理

简介

备份寄存器是42个16位的寄存器,可用来存储84个字节的用户应用程序数据。他们处在备份域
里,当VDD电源被切断,他们仍然由VBAT维持供电。当系统在待机模式下被唤醒,或系统复位或
电源复位时,他们也不会被复位。
此外,BKP控制寄存器用来管理侵入检测和RTC校准功能。
复位后,对备份寄存器和RTC的访问被禁止,并且备份域被保护以防止可能存在的意外的写操
作。执行以下操作可以使能对备份寄存器和RTC的访问。
● 通过设置寄存器RCC_APB1ENR的PWREN和BKPEN位来打开电源和后备接口的时钟
● 电源控制寄存器(PWR_CR)的DBP位来使能对后备寄存器和RTC的访问。

注意

20字节数据后备寄存器(中容量和小容量产品),或84字节数据后备寄存器(大容量和互联型产品) 例如stm32f103c8t6 只有20个字节 ,也就是10个寄存器。

数据备份寄存器

数据备份寄存器x 中的x从1开始而不是从0来开始在这里插入图片描述
在 MCU 复位后,备份数据寄存器的写访问就被禁止,需要执行以下操作才可以对 RTC 及备份数据寄存器进行写访问:

  1. 通过设置寄存器 RCC_APB1ENR 的 PWREN 和 BKPEN 位来打开电源和后备接口时钟
  2. 电源控制寄存器(PWR_CR)的 DBP 位来使能对后备寄存器和 RTC 访问
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

硬件连接

在这里插入图片描述
VBAT连接要连接电源正极
在这里插入图片描述

VBAT电压范围为:1.8~3.6V
在这里插入图片描述

HAL库函数程序

驱动代码

#include "bkp.h"

RTC_HandleTypeDef rtc_handle = {0};
void bkp_init(void)
{
    __HAL_RCC_PWR_CLK_ENABLE();
    __HAL_RCC_BKP_CLK_ENABLE();
    HAL_PWR_EnableBkUpAccess();
    
    rtc_handle.Instance = RTC;
    HAL_RTC_Init(&rtc_handle);
}

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

void write_bkr(uint8_t bkrx, uint16_t data)
{
    HAL_RTCEx_BKUPWrite(&rtc_handle, bkrx, data);
}

main函数部分

int main(void)
{
    HAL_Init();                         /* 初始化HAL库 */
    stm32_clock_init(RCC_PLL_MUL9);     /* 设置时钟, 72Mhz */
    led_init();                         /* 初始化LED灯 */
    uart1_init(115200);
    bkp_init();
    
    printf("hello world!\r\n");
    
    write_bkr(2, 0xAAAA);
    printf("读出来的值为:%X\r\n", read_bkr(2));

    while(1)
    {
        
    }
}

在这里插入图片描述

寄存器版本

底层驱动

#include "bkp.h"

void bkp_init()
{
    RCC->APB1ENR |= 0x01<<27;   /* BKPEN */
    RCC->APB1ENR |= 0x01<<28;   /* PWREN */
    PWR->CR |= 0x01<<8;         /* DBP */
}
void bkp_rite(uint32_t DRx, uint32_t Data)
{
  uint32_t tmp = 0U;

  tmp = (uint32_t)BKP_BASE;
  tmp += (DRx * 4U);

  *(uint32_t *) tmp = (Data & 0xFFFF);
}

main

int main(void)
{
    sys_stm32_clock_init(9);    /* 设置时钟, 72Mhz */
    delay_init(72);             /* 延时初始化 */
    usart_init(72, 115200);     /* 串口初始化 */
    bkp_init();
    bkp_rite(1,0xBBAA);
    printf("BKP->DR1 = %X\r\n",BKP->DR1);
    while (1)
    {
        
    }
}

在这里插入图片描述

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值