当前位置: 代码迷 >> 单片机 >> STM32的BKP寄存器有关问题
  详细解决方案

STM32的BKP寄存器有关问题

热度:103   发布时间:2016-04-28 14:57:42.0
STM32的BKP寄存器问题
本帖最后由 wangwenye_wwy 于 2014-05-16 17:34:55 编辑
尝试着使用了下STM32的BKP数据寄存器,试着RESET后仍旧保持之前的RTC,但是遇到了问题,BKP_DR寄存器中的值RESET之后就不见了。(试过BKP_DR34这个貌似直接写不进去,BKP_DR3可以写进去,写完后读出来也对,但RESET之后就没有了)
请教下为什么?应该怎么做能让BKP_DR在RESET后依旧有值。

贴代码:

int main()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP, ENABLE);

       RCC_RTC_Configuration();
...
}
void RCC_RTC_Configuration()
{
volatile uint16_t val = 0, val1 = 0;

PWR_BackupAccessCmd(ENABLE);
BKP_ClearFlag();
BKP_DeInit();

RCC_LSEConfig(RCC_LSE_ON);
while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
RCC_RTCCLKCmd(ENABLE);

val = BKP_ReadBackupRegister(BKP_DR3);    //这里复位后每次读的值都为0x0000
if(val == 0x3434) { //BackUp register Set
// PWR_BackupAccessCmd(DISABLE);
RCC_ClearFlag();
}
else { //BackUp register Unset
// BKP_DeInit();
RTC_WaitForLastTask();
RTC_EnterConfigMode();
RTC_SetPrescaler(0x7FFF);
RTC_WaitForLastTask();
RTC_ITConfig(RTC_IT_ALR | RTC_IT_SEC, ENABLE);
RTC_ExitConfigMode();
RTC_WaitForLastTask();

BKP_WriteBackupRegister(BKP_DR3, (uint16_t)0x3434);   //这里改为BKP_DR34后下面读出来的val1为0x0000
val1 = BKP_ReadBackupRegister(BKP_DR3);
val1 = BKP_ReadBackupRegister(BKP_DR3);
// PWR_BackupAccessCmd(DISABLE);
RCC_ClearFlag();
}

}

------解决方案--------------------
请检查纽扣电池供电是否正常。