尝试着使用了下STM32的BKP数据寄存器,试着RESET后仍旧保持之前的RTC,但是遇到了问题,BKP_DR寄存器中的值RESET之后就不见了。(试过BKP_DR34这个貌似直接写不进去,BKP_DR3可以写进去,写完后读出来也对,但RESET之后就没有了)
请教下为什么?应该怎么做能让BKP_DR在RESET后依旧有值。
贴代码:
C/C++ code?
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();
}
}
后来搞定了,发现是代码有问题,
C/C++ code?
void RCC_RTC_Configuration()
{
volatile uint16_t val = 0, val1 = 0;
PWR_BackupAccessCmd(ENABLE);
BKP_ClearFlag();
//BKP_DeInit(); //这个函数注释掉,因为里面最后调了PWR_BackupAccessCmd(DISABLE);
....
}
上一篇:stm32中断向量控制器
下一篇:Stm32 IAP程序编写及用户程序编写
推荐阅读最新更新时间:2024-03-16 16:24