OpenEdv-开源电子网

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

STM32 备份域 的问题

[复制链接]

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

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

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

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

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

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

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







正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

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


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

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1612
金钱
1612
注册时间
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

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 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站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

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

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

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 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站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

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

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

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

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-19 15:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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