打印

stm32 bkp 掉电后数据丢失问题

[复制链接]
11279|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
shj106|  楼主 | 2012-4-20 15:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
学习STM32中,实验BackupRegister时遇到一个问题待解,主流程是上电后核查BackupRegister中BKP_DR1的数据,如果不是用户保存的0XA8A8则写入0XA8A8到BKP_DR1中保存,并通过串口发0XDD表示新写入的用户数据保存在BKP_DR1中,如是用户保存的数据0XA8A8,则通过串口发送0X55表示用户保存的数据未丢失。
     现在遇到的问题是初次上电后执行代码,串口窗口收到0XDD表示BKP_DR1中不是用户写入的数据(这部分正确),然后反复按RESET键复位重新执行程序,串口窗口收到0X55表示 BKP_DR1中已保存用户写入的数据0XA8A8(这部分也正确),继续实验,开发板断电后再上电,问题来了串口窗口显示0XDD,写入的0XA8A8丢失了!我用的是ALIENTEK开发板,硬件已测过开发板断电后STM32的1脚VBAT上有纽扣电池供的电压,为谨慎起见,重新烧录代码,并反复执行RESET键复位后执行,串口窗口显示0X55后,去掉
(( WriteToBackupReg(0xa8a8);      //写入数据到BKP_DR1中))这段写入函数重新烧录并执行,只要开发板一断电后再执行代码(扳子不断电时正常),串口窗口就只显示0XDD表示保存在BKP_DR1中的数据丢失,实验中去掉了Tamper这部分的函数。请同学解,谢谢!
     实验的代码如下,我用的V3.5库

     /*********实验BackupRegister**************/
if(CheckBackupReg(0xa8a8)==0xff)     //读出并验证BKP_DR1中的数据
   {
       USART_SendData(USART1,0x55);           //BKP_DR1中的数据正确发送正确符号
     while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET); //等待单字节发送完成

   }
else            //BKP_DR1中的数据不等于写入数据
   {
     BKP_ClearFlag();                          //清除入侵引脚挂起标记
  WriteToBackupReg(0xa8a8);      //写入数据到BKP_DR1中
  USART_SendData(USART1,0xdd);           //发送验证数据丢失符号
     while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET); //等待单字节发送完成
   }

配置部分:
  /************设置BackupRegister**********/
void BKP_Configuration(void)
{   
   PWR_BackupAccessCmd(ENABLE);                        //允许访问BKP域
   BKP_ClearFlag();                                                 //清楚入侵检测引脚挂起标记
   //BKP_TamperPinLevelConfig(BKP_TamperPinLevel_Low);   //入侵引脚设为低电平有效
   //BKP_ITConfig(ENABLE);                                   //开入侵中断
   //BKP_TamperPinCmd(ENABLE);                        //使能入侵检测引脚
}
/*******读出备份寄存器进行比较函数*****/
u8 CheckBackupReg(u16 FirstBackupData)
{
  if(BKP_ReadBackupRegister(BKP_DR1) !=FirstBackupData)  return 0x0a;
  //if(BKP_ReadBackupRegister(BKP_DR2) !=1)                return 0x0b;
  //if(BKP_ReadBackupRegister(BKP_DR3) !=2)                return 0x0c;
  //if(BKP_ReadBackupRegister(BKP_DR4) !=3)                return 0x0d;
  //if(BKP_ReadBackupRegister(BKP_DR5) !=4)                return 0x0e;
  //if(BKP_ReadBackupRegister(BKP_DR6) !=5)                return 0x0f;
  //if(BKP_ReadBackupRegister(BKP_DR7) !=6)                return 0x1f;
  //if(BKP_ReadBackupRegister(BKP_DR8) !=7)                return 0x2f;
  //if(BKP_ReadBackupRegister(BKP_DR9) !=8)                return 0x3f;
  //if(BKP_ReadBackupRegister(BKP_DR10)!=9)                return 0x4f;
  else
  return 0xff;
}
/********写数据到备份寄存器函数*********/
void WriteToBackupReg(u16 FirstBackupData)
{
   BKP_WriteBackupRegister(BKP_DR1, FirstBackupData);  
   //BKP_WriteBackupRegister(BKP_DR2, 1);
   //BKP_WriteBackupRegister(BKP_DR3, 2);
   //BKP_WriteBackupRegister(BKP_DR4, 3);
   //BKP_WriteBackupRegister(BKP_DR5, 4);
   //BKP_WriteBackupRegister(BKP_DR6, 5);
   //BKP_WriteBackupRegister(BKP_DR7, 6);
   //BKP_WriteBackupRegister(BKP_DR8, 7);
   //BKP_WriteBackupRegister(BKP_DR9, 8);
   //BKP_WriteBackupRegister(BKP_DR10,9);
}

相关帖子

沙发
chen282220981| | 2013-6-9 12:16 | 只看该作者
同问,我也遇到断电数据丢失的问题,不知道楼主有没有解决了

使用特权

评论回复
板凳
chemistrymilan| | 2015-1-23 15:12 | 只看该作者
没开时钟吧
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP ,ENABLE);
PWR_BackupAccessCmd(ENABLE);

使用特权

评论回复
地板
拿来主义| | 2015-8-4 14:23 | 只看该作者
怎么解决的分享一下呗!我也遇到这个怪问题了!12年的贴!

使用特权

评论回复
5
拿来主义| | 2015-8-5 15:54 | 只看该作者
这个问题解决了,是因为复位的原因,掉电后电容供电前产生复位,所以PVD产生了两次中断。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

23

帖子

1

粉丝