硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3667|回复: 2
收起左侧

[有问必答] 备份数据寄存器的值为什么复位了还有?

[复制链接]

32

主题

103

回帖

199

积分

高级会员

积分
199
发表于 2018-11-23 10:20:20 | 显示全部楼层 |阅读模式
在备份寄存器中写入内容,发生复位后检测备份寄存器的内容和之前是否相同,如果不相同就写入值,结果在实验时,我给板子断电,再连电,发现还是能检测到备份寄存器的值。我都断电了,备份寄存器中的内容应该是消失了,但是没有,请问这是为什么呢? 微信截图_20181123101921.png

  1. RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

  2.         /* 允许写bkp寄存器 */
  3.         PWR_BackupAccessCmd(ENABLE);

  4.         /* 清除侵入检测事件标志位 */
  5.         BKP_ClearFlag();
  6.         /* 如果发生上电/掉电复位, 则标志位为1 */
  7.         if(RCC_GetFlagStatus(RCC_FLAG_PORRST ) != RESET || RCC_GetFlagStatus(RCC_FLAG_PINRST)!=RESET)
  8.         {
  9.                 /* 清除标志位 */
  10.                 RCC_ClearFlag();
  11.                 printf("发生上电/掉电复位\r\n");

  12.                 /* 判断备份数据寄存器是否写过内容 */
  13.                 if(CheckBackupReg(TESTDATA) == 0x00)
  14.                 {
  15.                         /* Backup data registers values are correct */
  16.                         printf("备份区数据正确\r\n");
  17.                         printf("数据为%d\r\n",BKP_ReadBackupRegister(BKP_DR1));
  18.                 }
  19.                 else
  20.                 {        
  21.                         /* 备份数据寄存器的值不对,或者还没有写入寄存器(程序第一次执行) */
  22.                         /* 写入备份数据寄存器 */
  23.                         printf("备份区数据不正确,重新写入\r\n");
  24.                         WriteToBackupReg(TESTDATA);
  25.                         printf("数据为%d\r\n",BKP_ReadBackupRegister(BKP_DR1));
  26.                 }
  27.         }
复制代码
写入寄存器和读取寄存器的函数,抄的标准库
  1. void WriteToBackupReg(uint16_t FirstBackupData)
  2. {
  3.         uint32_t index = 0;

  4.         for (index = 0; index < BKP_DR_NUMBER; index++)
  5.         {
  6.                 BKP_WriteBackupRegister(BKPDataReg[index], FirstBackupData + index * 0xA5 );
  7.         }  

  8. }
复制代码
  1. /* 循环检测所有备份数据寄存器的值,如果都相等,则返回0,否则返回1*/
  2. uint8_t CheckBackupReg(uint16_t FirstBackupData)
  3. {
  4.         uint32_t index = 0;

  5.         for (index = 0; index < BKP_DR_NUMBER; index++)
  6.         {
  7.                 if (BKP_ReadBackupRegister(BKPDataReg[index]) != (FirstBackupData +index * 0xA5 ))
  8.                 {
  9.                         return (index + 1);
  10.                 }
  11.         }

  12.         return 0;
  13. }
复制代码




回复

使用道具 举报

28

主题

178

回帖

262

积分

高级会员

积分
262
发表于 2018-11-23 22:40:37 | 显示全部楼层
应该是电池吧   你看看你的设备上装了外部的bat不。。vBat引脚供电,
如果有大电容 估计也可以保存一段时间
回复

使用道具 举报

32

主题

103

回帖

199

积分

高级会员

积分
199
 楼主| 发表于 2018-11-26 09:50:23 | 显示全部楼层
mioc_hust 发表于 2018-11-23 22:40
应该是电池吧   你看看你的设备上装了外部的bat不。。vBat引脚供电,
如果有大电容 估计也可以保存一段时 ...

没有电池的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-13 19:49 , Processed in 0.173969 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表