学习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);
} |