精华内容
下载资源
问答
  • 在STM32F103最小系统上访问备份寄存器备份寄存器是42个16位的寄存器,可用来存储84个字节的用户应用程序数据。他们处在备份域里,当VDD 电源被切断,他们仍然由V BAT 维持供电。当系统在待机模式下被唤醒,或系统...
  • 这是一个基于STM32F1的备份寄存器BKP储存实验,已测试成功 使用的是HAL库
  • ST STM32F10x参考手册—备份寄存器pdf,ST STM32F10x参考手册—备份寄存器
  • STM32 备份寄存器操作

    千次阅读 2018-09-09 14:31:08
    STM32系列为处理器都有备份寄存器,他它们处于备份区域里,当VDD电源被切断,它们仍然由VBAT维持供电,当系统在待机模式下被唤醒,或者系统复位或电源复位是,它们都不会被复位。以实时时钟RTC为例,在上一篇文章中...

    STM32系列为处理器都有备份寄存器,他它们处于备份区域里,当VDD电源被切断,它们仍然由VBAT维持供电,当系统在待机模式下被唤醒,或者系统复位或电源复位是,它们都不会被复位。以实时时钟RTC为例,在上一篇文章中讲过,RTC处理依赖系统电源(VDD供电)外,还依赖者备份电源(VBAT供电),即使系统电源被切断,只要备份电源还在,RTC就能继续工作。备份寄存器也是依赖者备份电源的。STM32都有备份寄存器,但是备份寄存器的数量却不一定相同!对于大容量的微处理器系列来说,它有着42个16位的寄存器,而中小容量的微处理器却只有10个16为的寄存器。我使用的微处理器是STM32F103ZET6,属于大容量系列,所以它他有着42个备份寄存器。下面就是基于大容量的。

    下面就来讲讲备份寄存器(BKP)的操作,还是基于我自己的规范工程。

    1、工程的修改

    1)首先当然要添加stm32f10x_bkp.c文件到STM32F10x_StdPeriph_Driver工程组中。除此之外,要想访问备份寄存器,还要讲stm32f10x_pwr.c文件再添加进去。

    2)打开stm32f10x_conf.c文件,将其中原先屏蔽着的:#include "stm32f10x_bkp.h" 与 #include "stm32f10x_pwr.h"这两句话的屏蔽去掉。

    3)新建Backup.c与Backup.h两个文件,分别保存在BSP文件下的src与inc中,并将Backup.c文件添加到BSP工作组中。

     

    2、Backup.c与Backup.h两个文件的代码编写

    首先要初始化下备份寄存器,代码如下:

     

    /*************************************************************
    Function : Backup_Init
    Description: 备份寄存器初始化
    Input : none
    return :
    *************************************************************/
    void Backup_Init(void)
    {
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);//初始化电源控制时钟与备份寄存器时钟
    PWR_BackupAccessCmd(ENABLE); //允许访问备份寄存器
    BKP_ClearFlag();//清除入侵引脚事件标志位
    if(RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET)//上电复位
    {
    RCC_ClearFlag();//清除复位标志位
    if(Backup_CheckData(0x0001) != 0)//备份寄存器数据错误或,没有数据 {
    Backup_WriteData(0x0001);//写入数据
    }
    }
    }

     

    要初始化备份寄存器,当然要线初始化PWR与BKP的时钟了,接着设置允许访问,然后清除入侵事件标志位。什么是入侵事件?STM32对应有一个入侵引脚,STM32F103ZET6对应的入侵引脚是PC13,当它的电平从0变成1或者从1变成0时,就会产生一个入侵检测事件,然后会把所有的数据备份寄存器的内容清除张佑赫就是为什叫做"入侵"这个名字的原因了。所以这里初始化的时候,要将它的标志位清除。接下去再判断上电复位标志位,如果检测到上电复位,那么先清除下标志位,再调用自己写的Backup_CheckData()函数来读取备份寄存器的数据进而判断之前备份寄存器的数据是否有数据或者说正确的指定数据,如果没有,则想他写入数据,这里调用自己编写的Backup_WriteData()函数向备份急寄存器写入数据,下面马上讲到。

    下面先来讲讲Backup_WriteData()函数如何向备份寄存器写数据,代码如下:

     

    uint16_t BKPDataReg[42] ={//对大容量微处理器来说,它有42个备份寄存器,地址偏移为:0x04~0x48,0x40~0xBC
    BKP_DR1, BKP_DR2, BKP_DR3, BKP_DR4, BKP_DR5, BKP_DR6, BKP_DR7, BKP_DR8,
    BKP_DR9, BKP_DR10, BKP_DR11, BKP_DR12, BKP_DR13, BKP_DR14, BKP_DR15, BKP_DR16,
    BKP_DR17, BKP_DR18, BKP_DR19, BKP_DR20, BKP_DR21, BKP_DR22, BKP_DR23, BKP_DR24,
    BKP_DR25, BKP_DR26, BKP_DR27, BKP_DR28, BKP_DR29, BKP_DR30, BKP_DR31, BKP_DR32,
    BKP_DR33, BKP_DR34, BKP_DR35, BKP_DR36, BKP_DR37, BKP_DR38, BKP_DR39, BKP_DR40,
    BKP_DR41, BKP_DR42
    };

    /*************************************************************
    Function : Backup_WriteData
    Description: 向备份寄存器写的数据
    Input : firstBackupData - 数据的首数据
    return : none
    *************************************************************/
    static void Backup_WriteData(u32 firstBackupData)
    {
    u32 index;

    PRINTF("Begin to wite data to backup registers\r\n");
    for(index = 0; index < 42; index++)
    { /向备份寄存器写数据
    BKP_WriteBackupRegister(BKPDataReg[index], firstBackupData + index);/
    PRINTF("BKP_DR%d: %d\r\n", index + 1, firstBackupData + index);
    }
    }

    代码很简单,不过在这个函数之前要线定义一个数组BKPDataReg[],它的元素就是42个备份寄存器的地址。在Backup_WriteData()函数中,通过一个循环函数,使用库函数BKP_WriteBackupRegister()分别向备份寄存器中写入firstBackupData + index,也就是1~42了。

    再来讲讲Backup_CheckData()函数,代码如下:

     

    /*************************************************************
    Function : Backup_CheckData
    Description: 检查备份寄存器的数据是否正确
    Input : firstBackupData-第一个备份寄存器数据
    return : 0-正确 其他-错误
    *************************************************************/
    static u8 Backup_CheckData(u32 firstBackupData)
    {
    u32 index;

    PRINTF("Begin to check backup registers\r\n");
    for(index = 0; index < 42; index++)
    { //检查备份寄存器的数据是否正确
    if(BKP_ReadBackupRegister(BKPDataReg[index]) != (firstBackupData + index))
    {
    PRINTF("BKP_DR%d data check impare!\r\n", index + 1);
    return (index + 1);
    }
    else
    {
    PRINTF("BKP_DR%d data check OK!\r\n", index + 1);
    }
    }

    return 0;
    }

    这个函数其实也是很简单,循环42次读出42个备份寄存器的数据,在与之前写入的数据进行比较,如果相等则放回0,否者返回最先不同的备份寄存器索引。这里调用库函数BKP_ReadBackupRegister()来读取备份寄存器的值。

    这样Backup.c的代码就结束了,下面贴下Backup.h的代码,如下:

     

    #ifndef __BACKUP_H__
    #define __BACKUP_H__
    #include "stm32f10x.h"

    void Backup_Init(void);

    #endif

    3、main函数的编写

    main函数很简单,只是调用下备份寄存器的初始化函数就可以了,代码如下:

     

    /*************************************************************
    Function : main
    Description: main入口
    Input : none
    return : none
    *************************************************************/
    int main(void)
    {
    BSP_Init();
    PRINTF("\nmain() is running!\r\n");
    Backup_Init();
    while(1)
    {
    LED1_Toggle();
    Delay_ms(1000);
    }
    }

    4、测试

    下载好程序后,用串口线将开发板与电脑连接,打开串口调试软件,查看信息。给开发板上电,就会看到下图的现象:

     图中可以看到,第一次上电的时候,向备份寄存器写入1~42。接下去,再复位下开发板,就i可以看到下图现象:

     复位后,因为备份寄存器已经被设置了初值,所以先会读取备份寄存器的值,图中可以看到备份寄存器的值与设置的值相同,所以不会在一次对备份寄存器写数据了!

    展开全文
  • STM32F4提供4KB的备份SRAM,在开发程序时可以用于存储掉电不丢失的数据(需要RTC纽扣电池支持),特别是一些实时修改的,掉电不能丢失的数据,比如我用于存储雨量累计流量等实时变化的数据,定时存储到flash,实时...

    STM32F4提供4KB的备份SRAM,在开发程序时可以用于存储掉电不丢失的数据(需要RTC纽扣电池支持),特别是一些实时修改的,掉电不能丢失的数据,比如我用于存储雨量累计流量等实时变化的数据,定时存储到flash,实时存储到备份区(不能频繁的写flash),当备份区数据丢失了再从flash加载,否则每次都从备份区加载。

    然而在使用过程中发现备份区域数据丢失!下面从STM32系列芯片提供的整个备份域来看看啥情况。

     

    某些STM32芯片提供了备份SRAM,例如STM32F系列芯片有4K的备份SRAM。然而在使用过程中发现备份区域数据丢失!下面从STM32系列芯片提供的整个备份域来看看啥情况。

    电池备份域

      首先,这部分在参考手册的电源(PWR)章节有详细的介绍。器件的工作电压 (VDD) 要求介于 1.8 V 到 3.6 V 之间。嵌入式线性调压器用于提供内部 1.2 V数字电源。当主电源 VDD 断电时,可通过 VBAT 电压为实时时钟 (RTC)RTC备份寄存器 和 备份 SRAM(BKP SRAM) 供电。具体如下图:
    电源
    手册中有许多对于使用芯片时对于电源部分设计的要求,例如引脚的使用、电流的要求等等,具体见手册!

    备份域访问

      复位后,备份域(RTC 寄存器、RTC 备份寄存器和备份 SRAM)将受到保护,以防止意外的写访问。要使能对备份域的访问,请按以下步骤进行操作:

    访问 RTC 和 RTC 备份寄存器

    1. 将 RCC_APB1ENR 寄存器中的 PWREN 位置 1,使能电源接口时钟(分别参见手册第 6.3.15 节和第 6.3.16 节了解 STM32F405xx/07xx 和 STM32F415xx/17xx 和 STM32F42xxx 和 STM32F43xxx)
    2. 将用于 STM32F405xx/07xx 和 STM32F415xx/17xx 的 PWR 电源控制寄存器 (PWR_CR)和 用于STM32F42xxx 和 STM32F43xxx 的 PWR 电源控制寄存器 (PWR_CR) 中的 DBP 位置 1,使能对备份域的访问
    3. 选择 RTC 时钟源:参见手册第 6.2.8 节:RTC/AWU 时钟
    4. 通过对 RCC 备份域控制寄存器 (RCC_BDCR) 中的 RTCEN [15] 位进行编程,使能 RTC 时钟

    访问备份 SRAM

    1. 将 RCC_APB1ENR 寄存器中的 PWREN 位置 1,使能电源接口时钟(分别参见手册第 6.3.15 节和第 6.3.16 节了解 STM32F405xx/07xx 和 STM32F415xx/17xx 和 STM32F42xxx 和 STM32F43xxx)。
    2. 将用于 STM32F405xx/07xx 和 STM32F415xx/17xx 的 PWR 电源控制寄存器 (PWR_CR) 和用于STM32F42xxx 和 STM32F43xxx 的 PWR 电源控制寄存器 (PWR_CR) 中的 DBP 位置 1,使能对备份域的访问。
    3. 通过将 RCC AHB1 外设时钟使能寄存器 (RCC_AHB1ENR) 中的 BKPSRAMEN 位置 1,使能备份 SRAM 时钟。

    想要访问备份域还是非常简单的,下面以访问备份SRAM为例,从代码角度说明一下(具体见注释即可):

    /**
     * @brief (使用标准外设库)备份SRAM初始化
     * @param[in] void
     * @retval  NULL
     */
    static void vBkpSramInit(void)
    {
    	/* 电源接口时钟使能 (Power interface clock enable) */
    	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
    	
    	/* DBP 位置 1,使能对备份域的访问 */
    	PWR_BackupAccessCmd(ENABLE);
    	
    	/* 通过将 RCC AHB1 外设时钟使能寄存器 (RCC_AHB1ENR) 中的 BKPSRAMEN 位置 1, 使能备份 SRAM 时钟 */
    	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_BKPSRAM, ENABLE);
    	
    	/* 应用程序必须等待备份调压器就绪标志 (BRR) 置 1,指示在待机模式和 VBAT 模式下会保持写入 RAM 中的数据。 */
    	while(PWR_GetFlagStatus(PWR_FLAG_BRR) != SET);
    }
    
    /** (使用HAL库)备份SRAM初始化
     * 
     * @param[in]   NULL
     * @retval      Null
    **/
    void BKP_SRAM_Init(void)
    {
    	/* 电源接口时钟使能 (Power interface clock enable) */
    	__HAL_RCC_PWR_CLK_ENABLE();
    
    	/* DBP 位置 1,使能对备份域的访问 */
    	HAL_PWR_EnableBkUpAccess();
    
    	/* 通过将 RCC AHB1 外设时钟使能寄存器 (RCC_AHB1ENR) 中的 BKPSRAMEN 位置 1, 使能备份 SRAM 时钟 */
    	__HAL_RCC_BKPSRAM_CLK_ENABLE();
    
    	/* 应用程序必须等待备份调压器就绪标志 (BRR) 置 1,指示在待机模式和 VBAT 模式下会保持写入 RAM 中的数据。 */
    	HAL_PWREx_EnableBkUpReg();
    }
    

    经过以上初始化之后,就可以使用备份域中的各部分功能了(RTC和备份SRAM的初始化有些区别)。

    备份域的使用

    初始化后对于备份域中各功能(RTC、RTC备份寄存器、备份SRAM)的使用就比较灵活了。

    • RTC: 使用相对来说比较复杂,后面独立介绍
    • RTC备份寄存器: 读写非常简单,标准外设库和HAL库都提供了函数直接进行读写。
      /*----------------------------标准外设库----------------------------*/
      /**
        * @brief  Writes a data in a specified RTC Backup data register.
        * @param  RTC_BKP_DR: RTC Backup data Register number.
        *          This parameter can be: RTC_BKP_DRx where x can be from 0 to 19 to 
        *                                 specify the register.
        * @param  Data: Data to be written in the specified RTC Backup data register.                     
        * @retval None
        */
      void RTC_WriteBackupRegister(uint32_t RTC_BKP_DR, uint32_t Data)
      {
        __IO uint32_t tmp = 0;
        
        /* Check the parameters */
        assert_param(IS_RTC_BKP(RTC_BKP_DR));
      
        tmp = RTC_BASE + 0x50;
        tmp += (RTC_BKP_DR * 4);
      
        /* Write the specified register */
        *(__IO uint32_t *)tmp = (uint32_t)Data;
      }
      /**
        * @brief  Reads data from the specified RTC Backup data Register.
        * @param  RTC_BKP_DR: RTC Backup data Register number.
        *          This parameter can be: RTC_BKP_DRx where x can be from 0 to 19 to 
        *                          specify the register.                   
        * @retval None
        */
      uint32_t RTC_ReadBackupRegister(uint32_t RTC_BKP_DR)
      {
        __IO uint32_t tmp = 0;
        
        /* Check the parameters */
        assert_param(IS_RTC_BKP(RTC_BKP_DR));
      
        tmp = RTC_BASE + 0x50;
        tmp += (RTC_BKP_DR * 4);
        
        /* Read the specified register */
        return (*(__IO uint32_t *)tmp);
      }
      
      /*----------------------------HAL库----------------------------*/
      /**
        * @brief  Writes a data in a specified RTC Backup data register.
        * @param  hrtc: pointer to a RTC_HandleTypeDef structure that contains
        *                the configuration information for RTC. 
        * @param  BackupRegister: RTC Backup data Register number.
        *          This parameter can be: RTC_BKP_DRx where x can be from 0 to 19 to 
        *                                 specify the register.
        * @param  Data: Data to be written in the specified RTC Backup data register.                     
        * @retval None
        */
      void HAL_RTCEx_BKUPWrite(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister, uint32_t Data)
      {
        uint32_t tmp = 0U;
        
        /* Check the parameters */
        assert_param(IS_RTC_BKP(BackupRegister));
        
        tmp = (uint32_t)&(hrtc->Instance->BKP0R);
        tmp += (BackupRegister * 4U);
        
        /* Write the specified register */
        *(__IO uint32_t *)tmp = (uint32_t)Data;
      }
      /**
        * @brief  Reads data from the specified RTC Backup data Register.
        * @param  hrtc: pointer to a RTC_HandleTypeDef structure that contains
        *                the configuration information for RTC. 
        * @param  BackupRegister: RTC Backup data Register number.
        *          This parameter can be: RTC_BKP_DRx where x can be from 0 to 19 to 
        *                                 specify the register.                   
        * @retval Read value
        */
      uint32_t HAL_RTCEx_BKUPRead(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister)
      {
        uint32_t tmp = 0U;
        
        /* Check the parameters */
        assert_param(IS_RTC_BKP(BackupRegister));
      
        tmp = (uint32_t)&(hrtc->Instance->BKP0R);
        tmp += (BackupRegister * 4U);
        
        /* Read the specified register */
        return (*(__IO uint32_t *)tmp);
      }
      

       

    • 备份SRAM: 这部分的使用就更加灵活了,可以直接当内存去访问。推荐一种使用分散加载文件进行访问的方式。具体为定义自己的结构体,使用结构体定义变量BKP_SRAM myContent __attribute__((section("BKP_SRAM_SECTION")));,最后使用分散加载文件,将以上定义的变量直接映射到备份SRAM即可。
    ; *************************************************************
    ; *** Scatter-Loading Description File generated by uVision ***
    ; *************************************************************
    
    LR_IROM1 0x08000000 0x0000C000  {    ; load region size_region
      ER_IROM1 0x08000000 0x0000C000  {  ; load address = execution address
       *.o (RESET, +First)
       *(InRoot$$Sections)
       .ANY (+RO)
      }
      RW_IRAM1 0x20000000 0x00020000  {  ; RW data
       .ANY (+RW +ZI)
      }
      RW_BkSRAM 0x40024000 0x1000 {
        *.o (BKP_SRAM_SECTION, +First)          ; 备份SRAM
      }
    }
    

    备份SRAM问题

    在实际产品中使用时,发现备份SRAM中的数据丢失!检查在硬件上并没有出现任何问题,于是从软件一步步分析如下:

    1. 产品( 使用STM32F407VG )中实现了IAP、APP在线升级,备份域在这两部程序中均有使用(两部分程序中均对备份域进行了初始化)。
    2. 在由IAP跳转到APP后,发现在APP中初始化的备份SRAM中原有数据全部丢失( 准确的说应该是时钟不起作用,导致数据全是 0,看似数据丢失 )
    3. 分析原因,STM32芯片在上电后默认以内部低速时钟源(HSI运行),如果用户配置了使用外部时钟源,则再配置外部时钟源,然后将时钟切换为外部。程序在APP中配置时钟前是正常的,一旦时钟源出现切换则导致备份域再次初始化之后就无效了!感觉应该是 备份域的各种初始化必须在时钟初始化之后再进行配置才可以,颠倒顺序将导致备份域时钟初始化后不可用! 但是,其他外设(例如GPIO,同是挂在AHP总线上)却不受以上限制,比较奇怪!

    解决

      在IAP跳转到APP前,将备份域的各时钟失能,这样APP中配置的备份SRAM才会有效。

    后续

    后续可以测试一下其他外设是否有此问题。最好测试一下同样是挂在同一总线下的外设(GPIO、DMA、备份域时钟全部是在AHB总线下的)。

     

    转自链接:https://blog.csdn.net/ZCShouCSDN/article/details/82896924

    展开全文
  • 备份寄存器就是普通的RAM,需要配合外接电池使用,如果没有电池,就不能掉电保持数据。因为是普通RAM,所以不存在写入次数的问题,理论上是无限次的。其次在RCC_Configuration(); 中配置备份寄存器的如下:/* Enable...

    1. 首先 检查RTC电池是否装载,没电池的话,设备掉电也保存不了数据。

    备份寄存器就是普通的RAM,需要配合外接电池使用,如果没有电池,就不能掉电保持数据。

    因为是普通RAM,所以不存在写入次数的问题,理论上是无限次的。

    其次在RCC_Configuration(); 中配置备份寄存器的如下:

    /* Enable PWR(电源控制) and BKP clock */

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

    /* Enable write access to Backup domain */

    PWR_BackupAccessCmd(ENABLE);

    /* Clear Tamper pin Event(TE) pending flag */

    BKP_ClearFlag();

    2. 然后就可以开始读写功能了。

    void WriteBKP(u16 Data,u8 DRNumber)       // 还可加入一些加密算法;DRNumber (1-9)

    {

    switch(DRNumber)

    {

    case 0x01:

    BKP_WriteBackupRegister(BKP_DR1,Data);

    break;

    case 0x02:

    BKP_WriteBackupRegister(BKP_DR2,Data);

    break;

    case 0x03:

    BKP_WriteBackupRegister(BKP_DR3,Data);

    break;

    case 0x04:

    BKP_WriteBackupRegister(BKP_DR4,Data);

    break;

    case 0x05:

    BKP_WriteBackupRegister(BKP_DR5,Data);

    break;

    case 0x06:

    BKP_WriteBackupRegister(BKP_DR6,Data);

    break;

    case 0x07:

    BKP_WriteBackupRegister(BKP_DR7,Data);

    break;

    case 0x08:

    BKP_WriteBackupRegister(BKP_DR8,Data);

    break;

    case 0x09:

    BKP_WriteBackupRegister(BKP_DR9,Data);

    break;

    case 0x10:

    BKP_WriteBackupRegister(BKP_DR10,Data);

    break;

    default:

    BKP_WriteBackupRegister(BKP_DR1,Data);

    }

    BKP_WriteBackupRegister(BKP_DR10,CHECK_CODE);

    }

    u8 CheckBKP(void)

    {

    if( BKP_ReadBackupRegister(BKP_DR1) == 0x89)   // 如果此位数据丢失,则BPK数据丢失

    return 1;

    else

    return 0;

    }

    3.调试总结:

    可以在IAR或者keil的watch 中查看值是否写入,输入BKP_DR1,可以查看BKP_DR1中的数据是否写入正确,其他的备份寄存器类似操作。

    另外在程序中有RTC程序的话,要注意配置顺序,因为RTC也对备份寄存器操作。我就是程序中有RTC程序,所以写入的数据老是被清零(RTC程序会初始化备份寄存器中的数据),浪费了点时间才找到原因所在。

    展开全文
  • 本次是调试rtc 的备份寄存器和备份sram,这两个都是可以在rtc不断电情况下一直保存数据。 步骤 配置rtc参数,用cube mx 生成初始化代码 使能备份寄存器时钟和备份sram时钟 写入数据,不断电重启等 读取数据 使用的...

    rtc 是可以单独供电的,通常设计rtc是带有一个纽扣电池用来给rtc供电。本次是调试rtc 的备份寄存器和备份sram,这两个都是可以在rtc不断电情况下一直保存数据。
    步骤

    • 配置rtc参数,用cube mx 生成初始化代码
    • 使能备份寄存器时钟和备份sram时钟
    • 写入数据,不断电重启等
    • 读取数据
      使用的hal库函数
    *** Main and Backup Regulators configuration ***
    
    ================================================
    [..] 
      (+) The backup domain includes 4 Kbytes of backup SRAM accessible only from 
          the CPU, and address in 32-bit, 16-bit or 8-bit mode. Its content is 
          retained even in Standby or VBAT mode when the low power backup regulator
          is enabled. It can be considered as an internal EEPROM when VBAT is 
          always present. You can use the HAL_PWREx_EnableBkUpReg() function to 
          enable the low power backup regulator. 
    
      (+) When the backup domain is supplied by VDD (analog switch connected to VDD) 
          the backup SRAM is powered from VDD which replaces the VBAT power supply to 
          save battery life.
    
      (+) The backup SRAM is not mass erased by a tamper event. It is read 
          protected to prevent confidential data, such as cryptographic private 
          key, from being accessed. The backup SRAM can be erased only through 
          the Flash interface when a protection level change from level 1 to 
          level 0 is requested. 
      -@- Refer to the description of Read protection (RDP) in the Flash 
          programming manual.
    
        Refer to the product datasheets for more details.
    

    翻译

    主稳压器和备用稳压器配置 =======================================
    […](+)备份域包括只能从CPU访问的4 KB备份SRAM,其地址为32位,16位或8位模式。启用低功耗备用稳压器后,即使在待机或VBAT模式下,其内容也会保留。当始终存在VBAT时,可以将其视为内部EEPROM。您可以使用HAL_PWREx_EnableBkUpReg()函数来启用低功耗备用稳压器。
    (+)当备份域由VDD提供(模拟开关连接到VDD)时,备份SRAM由VDD供电,该VDD替代了VBAT电源以节省电池寿命。
    (+)篡改事件不会大量擦除备用SRAM。对其进行了读取保护,以防止访问机密数据(例如加密私钥)。当保护级别从1级更改为0级时,只能通过Flash接口擦除备份SRAM。
    -@-请参阅Flash编程手册中的读保护(RDP)说明。有关更多详细信息,请参考产品数据表。

      __HAL_RCC_PWR_CLK_ENABLE();/* 电源管理时钟使能 */
      HAL_PWR_EnableBkUpAccess();/* 使能允许访问备份域(备份寄存器和备份SRAM)*/
      HAL_PWREx_EnableBkUpReg();/* 使能备份寄存器 这里最新版是这个函数*/
      __HAL_RCC_BKP_CLK_ENABLE();/* 使能备份域时钟 ,虽然有保留在h文件中,但是没具体实现,不用这个*/
    

    备份寄存器

    备份寄存器一般都数量比较少,只能存一点点东西。
    数量需要查阅手册或者直接从生成的代码中找到数量,比如,本次生成的代码在函数中说明的0-19个寄存器,数据可以看见从下面实现是uint32_t大小的数据

    /**
      * @brief  Writes a data in a specified RTC Backup data register.
      * @param  hrtc pointer to a RTC_HandleTypeDef structure that contains
      *                the configuration information for RTC.
      * @param  BackupRegister RTC Backup data Register number.
      *          This parameter can be: RTC_BKP_DRx where x can be from 0 to 19 to
      *                                 specify the register.
      * @param  Data Data to be written in the specified RTC Backup data register.
      * @retval None
      */
    void HAL_RTCEx_BKUPWrite(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister, uint32_t Data)
    {
      uint32_t tmp = 0U;
    
      /* Check the parameters */
      assert_param(IS_RTC_BKP(BackupRegister));
    
      tmp = (uint32_t) & (hrtc->Instance->BKP0R);
      tmp += (BackupRegister * 4U);
    
      /* Write the specified register */
      *(__IO uint32_t *)tmp = (uint32_t)Data;
    }
    

    只需要在使能之后写入 再读取。

    备份SRAM

    上面提到了是4KB,这里查阅手册确实是4KB
    在这里插入图片描述
    这里直接使用就可以

    uint32_t addr  = 0x40024000;
    *(__IO uint32_t *)addr  = 0x01;//写入
    uint32_t data = *(__IO uint32_t *)addr;//读取
    

    当保护级别从1级更改为0级时,只能通过Flash接口擦除备份SRAM。

    HAL_FLASH_Unlock();
    HAL_StatusTypeDef HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit, uint32_t *SectorError)
    

    就需要使用flash接口擦除了(未验证)

    展开全文
  • STM32 BKP备份寄存器实验

    热门讨论 2011-05-15 09:19:33
    数据存储与侵入检测实验,两个完整项目文件
  • 第三种:利用片内的备份寄存器里的后备数据寄存器存储。对于一些中、小型容量产品来说,有10个16位的数据后备寄存器。与前两种不同,它需要将引脚接上电池,否则数据会丢失。下面对备份寄存器深入了解。 1.备份...
  • 某些STM32芯片提供了备份SRAM,例如STM32F系列芯片有4K的备份SRAM。然而在使用过程中发现备份区域数据丢失!下面从STM32系列芯片提供的整个备份域来看看啥情况。 电池备份域   首先,这部分在参考手册的电源(PWR...
  • STM32备份寄存器的配置与使用

    千次阅读 2020-05-30 13:44:25
    STM32备份寄存器的配置与使用 前言 嵌入式系统设计中,用来存储系统运行过程中的数据有很多种方式,而使用STM32的备份寄存器可以实现对少量数据的频繁存储。 因为这种方式时将数据存储在RAM中,掉电则数据丢失,所以...
  • stm32F103R6之BKP(备份寄存器)

    千次阅读 2020-09-17 18:20:31
    复位后,对备份寄存器和RTC的访问被禁止,并且备份域被保护以防止可能存在的意外的写操作。执行以下操作可以使能对备份寄存器和RTC的访问。 通过设置寄存器RCC_APB1ENR的PWREN和BKPEN位来打开电源和后备接口的时钟 ...
  •  RCC_BDCR:备份域控制寄存器。其LSEON、LSEBYP、RTCSEL和RTCEN位处于备份域,在复位后处于写保护状态,只有在电源控制寄存器(PWR_CR)中的DBP位置 1 后才能对这些位进行改动;这些位只能由备份域复位清除。  备份...
  • 2) BKP备份寄存器特征与原理; 3) RTC常用寄存器+库函数介绍; 4) 相关实验代码解读。 官方资料:《STM32中文参考手册V10》第16章——实时时钟(RTC)和第5章——备份寄存器 1. RTC实时时钟特征与原理 1.1 RTC ...
  • RTC(实时时钟)和BKP(备份寄存器)

    万次阅读 2016-08-17 18:50:06
     RCC_BDCR:备份域控制寄存器。其LSEON、LSEBYP、RTCSEL和RTCEN位处于备份域,在复位后处于写保护状态,只有在电源控制寄存器(PWR_CR)中的DBP位置 1 后才能对这些位进行改动;这些位只能由备份域复位清除。  备份...
  • 1. 研究STM3的备份寄存器,注意,如果要测试这个例程的话,VBAT不能和VDD接一起,必须分开。 2. 理解,备份寄存器可以有VBAT独立供电,也就是外接电池,备份寄存器在VBAT供电情况下,如果发生系统复位(按键复位)...
  • 本文介绍了STM32单片机的VDD、VDDA掉电是对备份寄存器的影响。
  • BKP中包括了42个16位的寄存器,共可保存84字节的内容,它们由VBAT的供电来维挂。 2. BKP内保存的数据可以被毁灭(如果有人希望恶意得到这些数据的话,令其丢失比保护数据更重要)。STM32提供了一种称之为TAMPER的...
  • 开发产品时,我们可能需要对程序做一些错误处理,比如在必要时进行软件复位,但是我们又不想复位某些重要的寄存器值,这时,我们就需要用到备份寄存器。 ESP32在深度睡眠下,RTC外设依然可以正常工作,那我们是否...
  • 按照参考的资料中,Bootloader里面跳转至APP和进入DFU模式是通过一个按键来切换,因为我们的产品上只有一个USB接口和一个4Pin的串口,没有设计按键,所以这里我换了一个方式来实现切换,就是利用BKP备份寄存器来实现...
  • 做为普通IO使用时 要禁用入侵中断功能,否则会导致备份寄存器数据在关机,在启动的时候数据丢失, 入侵功能介绍: 侵入检测功能分析:功能数据备份。 1 BKP_CR的TPAL位,设定决定TAMPER引脚的信号由0变1或是又1变0...
  • NUC970系列CPU和STM32一样自带RTC备份寄存器,供掉电前保存重要数据使用,容量是16x32bit=64byte 修改rtc驱动,增加nuc970_rtc_ioctl函数 struct nuc970_rtc_spr { unsigned int num; unsigned int ...
  • stm32的备份寄存器能否当EEPROM来用?

    千次阅读 2017-03-14 13:34:50
    突然想到stm32的备份寄存器能否当EEPROM来用这个问题。百度了一把,答案是不行的。 因为是EEPROM是不需要任何电的,而stm32的备份寄存器是靠TC电池. 首先 检查RTC电池是否装载,没电池的话,设备掉电也保存不了...
  • STM32CubeMX HAL F103 BKP备份寄存器使用 以下是本人自己的应用笔记,如果有错误的地方,欢迎评论区指出,我会及时更正-[2021.09.28] 1.需要开启RTC功能 2.API调用 初始化程序已经自动生成好了,直接使用下面的两个函数...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 21,817
精华内容 8,726
关键字:

备份寄存器