stm32 備份暫存器 讀寫資料
阿新 • • 發佈:2019-01-10
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程式會初始化備份暫存器中的資料),浪費了點時間才找到原因所在。