OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 11920|回复: 9

STM32 备份域 的问题

[复制链接]

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1616
金钱
1616
注册时间
2012-6-15
在线时间
39 小时
发表于 2012-12-20 13:54:17 | 显示全部楼层 |阅读模式
我用芯片 STM32F103VGT6 100pin 1Mflash

用到备份域 和 RTC 都断电之后保存不上, 

在程序测试的时候, 备份域 写入数据, 然后读出, 是对的, 包括时钟配置也都是对的,时钟也允许正常。  
而一断电就 数据丢失,时钟也不继续走了

我用示波器观察 电池端 Vbat引脚电压 没有任何异常, 电池也为3.3V左右, 且主电源上下电对其没有影响。

但是 LSE晶振, 在上电之后起振, 断电了 就不振荡了……

请问 这个是哪里的原因呢、?







回复

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1616
金钱
1616
注册时间
2012-6-15
在线时间
39 小时
 楼主| 发表于 2012-12-20 13:54:56 | 显示全部楼层
不用RTC, 单独试备份域 也是不可以的


以前 用 STM32F103RE  没遇见过这个情况呢
回复 支持 反对

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1616
金钱
1616
注册时间
2012-6-15
在线时间
39 小时
 楼主| 发表于 2012-12-20 14:01:55 | 显示全部楼层
测试程序段 如下:

//系统初始化

if( BKP->Read(1) == 0x5050) //如果已经初始化过  
{  //断电之后 始终进不到这里
Lcd.DispTxt(0,0,(u8*)"time has already been set.",16);
}
else
{
// RTC->Config();  
// Rtc->AutoSetTime();
BKP->Write(1,0x5050);                                //,...... 这个位置第一次开机写入
Lcd.DispTxt(0,0,(u8*)"reset time ok .",16)   ;     
}  

u32 x = BKP->Read(1) ;                                 //,...... 这个位置读取出来是正常的
String s;
s.HexFromInt(x);
Lcd.DispTxt(30,0,s.c_str(),16);                        //显示正常 0x5050,证明已经写入成功
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165602
金钱
165602
注册时间
2010-12-1
在线时间
2121 小时
发表于 2012-12-20 14:24:54 | 显示全部楼层
是不是你从来就没开启过备份区域。
我的代码:
u8 RTC_Init(void)
{
//检查是不是第一次配置时钟
u8 temp=0;
if(BKP->DR1!=0X5050)//第一次配置
{  
   RCC->APB1ENR|=1<<28;     //使能电源时钟     
RCC->APB1ENR|=1<<27;     //使能备份时钟     
PWR->CR|=1<<8;           //取消备份区写保护
RCC->BDCR|=1<<16;        //备份区域软复位    
RCC->BDCR&=~(1<<16);     //备份区域软复位结束     
    RCC->BDCR|=1<<0;         //开启外部低速振荡器 
    while((!(RCC->BDCR&0X02))&&temp<250)//等待外部时钟就绪  
{
temp++;
delay_ms(10);
};
if(temp>=250)return 1;//初始化时钟失败,晶振有问题     

RCC->BDCR|=1<<8; //LSI作为RTC时钟      
RCC->BDCR|=1<<15;//RTC时钟使能   
   while(!(RTC->CRL&(1<<5)));//等待RTC寄存器操作完成  
     while(!(RTC->CRL&(1<<3)));//等待RTC寄存器同步  
     RTC->CRH|=0X01;     //允许秒中断
     while(!(RTC->CRL&(1<<5)));//等待RTC寄存器操作完成  
RTC->CRL|=1<<4;              //允许配置  
 
RTC->RLH=0X0000;
RTC->RLL=32767;          //时钟周期设置(有待观察,看是否跑慢了?)理论值:32767  
    
RTC_Set(2012,9,7,13,16,55);  //设置时间   
RTC->CRL&=~(1<<4);           //配置更新
while(!(RTC->CRL&(1<<5)));   //等待RTC寄存器操作完成     
BKP->DR1=0X5050;  
  printf("FIRST TIME\n");
}else//系统继续计时
{
     while(!(RTC->CRL&(1<<3)));//等待RTC寄存器同步  
     RTC->CRH|=0X01;     //允许秒中断
     while(!(RTC->CRL&(1<<5)));//等待RTC寄存器操作完成
printf("OK\n");
}        
MY_NVIC_Init(0,0,RTC_IRQChannel,2);//优先级设置    
RTC_Get();//更新时间 
return 0; //ok
}  
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子产品购买店铺https://zhengdianyuanzi.tmall.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1616
金钱
1616
注册时间
2012-6-15
在线时间
39 小时
 楼主| 发表于 2012-12-20 15:21:26 | 显示全部楼层
试过了, 现象还是一样, 我直接将这个程序段放在程序里面调用, 
每次 都是进入 重新配置 ,备份域数据没保存住

断电后上电,显示 FIRST TIME
回复 支持 反对

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1616
金钱
1616
注册时间
2012-6-15
在线时间
39 小时
 楼主| 发表于 2012-12-20 16:26:09 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
原子哥 , 调用你的 程序段之后,  然后再读取 BKP->DR1 反而是0 ?
BKP部分怎么初始化的呢
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165602
金钱
165602
注册时间
2010-12-1
在线时间
2121 小时
发表于 2012-12-20 17:21:28 | 显示全部楼层
RCC->APB1ENR|=1<<28;     //使能电源时钟      
RCC->APB1ENR|=1<<27;     //使能备份时钟      
PWR->CR|=1<<8;           //取消备份区写保护 
RCC->BDCR|=1<<16;        //备份区域软复位     
RCC->BDCR&=~(1<<16);     //备份区域软复位结束      
    RCC->BDCR|=1<<0;         //开启外部低速振荡器  
    while((!(RCC->BDCR&0X02))&&temp<250)//等待外部时钟就绪   

temp++; 
delay_ms(10); 
}; 
if(temp>=250)return 1;//初始化时钟失败,晶振有问题      

RCC->BDCR|=1<<8; //LSI作为RTC时钟       
RCC->BDCR|=1<<15;//RTC时钟使能    
   while(!(RTC->CRL&(1<<5)));//等待RTC寄存器操作完成   
     while(!(RTC->CRL&(1<<3)));//等待RTC寄存器同步   
     RTC->CRH|=0X01;     //允许秒中断 
     while(!(RTC->CRL&(1<<5)));//等待RTC寄存器操作完成   
RTC->CRL|=1<<4;              //允许配置   
  
RTC->RLH=0X0000; 
RTC->RLL=32767;          //时钟周期设置(有待观察,看是否跑慢了?)理论值:32767   
     
RTC_Set(2012,9,7,13,16,55);  //设置时间    
RTC->CRL&=~(1<<4);           //配置更新 
while(!(RTC->CRL&(1<<5)));   //等待RTC寄存器操作完成      
BKP->DR1=0X5050;   
  printf("FIRST TIME\n"); 


以上就是。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子产品购买店铺https://zhengdianyuanzi.tmall.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1616
金钱
1616
注册时间
2012-6-15
在线时间
39 小时
 楼主| 发表于 2012-12-21 08:54:09 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
原子哥, 我换了个板子   立马好了

晕, 第一次遇见这种芯片问题 , 看来是中奖了……

【检查了 焊接都没有短路, 各点电压都正常, 其他如串口IO之类的 运行也都正常。】
回复 支持 反对

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1616
金钱
1616
注册时间
2012-6-15
在线时间
39 小时
 楼主| 发表于 2012-12-21 08:55:36 | 显示全部楼层
之前的程序 也没问题。 谢谢了!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165602
金钱
165602
注册时间
2010-12-1
在线时间
2121 小时
发表于 2012-12-21 10:54:13 | 显示全部楼层
 
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子产品购买店铺https://zhengdianyuanzi.tmall.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


关闭

原子哥极力推荐上一条 /1 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-11-18 18:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表