STM32的BKP寄存器问题

紫川流风 2014-05-16 05:33:18
尝试着使用了下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();
}

}
...全文
1610 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
感谢楼主分享解决办法 帮我解决了问题 谢谢
紫川流风 2014-05-19
  • 打赏
  • 举报
回复
引用 7 楼 pathletboy 的回复:
vbat谁教你接5v的。。。stm32是3.3v系统
抱歉,我图省事了,直接接了VCC,后来我又试了3V的电源,复位后还是读不到备份寄存器的值。
pathletboy 2014-05-19
  • 打赏
  • 举报
回复
还有你见过5v的纽扣电池么。。。
pathletboy 2014-05-19
  • 打赏
  • 举报
回复
vbat谁教你接5v的。。。stm32是3.3v系统
紫川流风 2014-05-19
  • 打赏
  • 举报
回复
引用 1 楼 pathletboy 的回复:
请检查纽扣电池供电是否正常。
我BAT接了5V的电压,可复位后还是读不出备份寄存器的数据...这还有可能是什么问题啊。
紫川流风 2014-05-19
  • 打赏
  • 举报
回复
引用 5 楼 pathletboy 的回复:
小容量产品是指闪存存储器容量在16K至32K字节之间的STM32F101xx、STM32F102xx和 STM32F103xx微控制器。 中容量产品是指闪存存储器容量在64K至128K字节之间的STM32F101xx、STM32F102xx和 STM32F103xx微控制器。 大容量产品是指闪存存储器容量在256K至512K字节之间的STM32F101xx和STM32F103xx微控 制器。 互联型产品是指STM32F105xx和STM32F107xx微控制器。 BKP特性 ● 20字节数据后备寄存器(中容量和小容量产品),或84字节数据后备寄存器(大容量和互联型 产品)
后来搞定了,发现是代码有问题,
void RCC_RTC_Configuration()
{
    volatile uint16_t val = 0, val1 = 0;
 
    PWR_BackupAccessCmd(ENABLE);
    BKP_ClearFlag();
    //BKP_DeInit();    //这个函数注释掉,因为里面最后调了PWR_BackupAccessCmd(DISABLE);
....
}
我的片子是STM32 MD系列的,多谢提醒,之前还一直用的HD系列的startUp文件。 关于VBAT,最后发现核心板把VBAT接到了VDD。所以就不用备用电源了。
pathletboy 2014-05-16
  • 打赏
  • 举报
回复
小容量产品是指闪存存储器容量在16K至32K字节之间的STM32F101xx、STM32F102xx和 STM32F103xx微控制器。 中容量产品是指闪存存储器容量在64K至128K字节之间的STM32F101xx、STM32F102xx和 STM32F103xx微控制器。 大容量产品是指闪存存储器容量在256K至512K字节之间的STM32F101xx和STM32F103xx微控 制器。 互联型产品是指STM32F105xx和STM32F107xx微控制器。 BKP特性 ● 20字节数据后备寄存器(中容量和小容量产品),或84字节数据后备寄存器(大容量和互联型 产品)
紫川流风 2014-05-16
  • 打赏
  • 举报
回复
引用 3 楼 pathletboy 的回复:
[quote=引用 2 楼 wangwenye_wwy 的回复:] [quote=引用 1 楼 pathletboy 的回复:] 请检查纽扣电池供电是否正常。
楼主用的核心板,直接用5V供电的,貌似没接VBAT,好吧...我试试接一个。 另外BKP_DR34写不进去是为什么呢? [/quote] 你stm32具体什么型号,中小容量的好像只有DR20,具体记不清了,查下芯片手册就知道了。[/quote] STM32F103C8TB? 好像是这个,我再仔细看下手册。
pathletboy 2014-05-16
  • 打赏
  • 举报
回复
引用 2 楼 wangwenye_wwy 的回复:
[quote=引用 1 楼 pathletboy 的回复:] 请检查纽扣电池供电是否正常。
楼主用的核心板,直接用5V供电的,貌似没接VBAT,好吧...我试试接一个。 另外BKP_DR34写不进去是为什么呢? [/quote] 你stm32具体什么型号,中小容量的好像只有DR20,具体记不清了,查下芯片手册就知道了。
紫川流风 2014-05-16
  • 打赏
  • 举报
回复
引用 1 楼 pathletboy 的回复:
请检查纽扣电池供电是否正常。
楼主用的核心板,直接用5V供电的,貌似没接VBAT,好吧...我试试接一个。 另外BKP_DR34写不进去是为什么呢?
pathletboy 2014-05-16
  • 打赏
  • 举报
回复
请检查纽扣电池供电是否正常。

27,385

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧