OpenEdv-开源电子网

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

如何向BKP备份域寄存器读写数据

[复制链接]

170

主题

917

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1824
金钱
1824
注册时间
2013-4-13
在线时间
63 小时
发表于 2015-1-19 18:41:35 | 显示全部楼层 |阅读模式
如题:直接上代码(可以在任何stm32f103系列最小系统实现):

RTC部分代码:

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "rtc.h"      
#include "led.h"


u16  BKPDataR[]={BKP_DR2,BKP_DR3,BKP_DR4,BKP_DR5,BKP_DR6,
BKP_DR7,BKP_DR8,BKP_DR9,BKP_DR10,BKP_DR11,BKP_DR12,BKP_DR13,BKP_DR14,
BKP_DR15,BKP_DR16,BKP_DR17,BKP_DR18,BKP_DR19,BKP_DR20,BKP_DR21,
 BKP_DR22,BKP_DR23,BKP_DR24/*,BKP_DR25,BKP_DR26,BKP_DR27,BKP_DR28,BKP_DR29,
BKP_DR30,BKP_DR31,BKP_DR32,BKP_DR33,BKP_DR34,BKP_DR35,BKP_DR36*/};

_calendar_obj calendar;//时钟结构体
/*
功能:将形参数据uint16_t Data写入某某号备份域数据寄存器uint16_t BKP_DR;
注意:在本函数中形参“uint16_t BKP_DR”是uint16_t类型,因为备份域只能读写该类型数据;
同时又代表备份域数据寄存器的寄存器号;
小容量的CM3只有20字节的存储空间,大容量84字节;对应地址偏移:0x04 到 0x28,0x40到0xBC
复位值:0x0000 0000
void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data)
{
 __IO uint32_t tmp = 0;//tmp是u32类型,不是指针!只是代表指针的u32类型编号;

 //  Check the parameters
  assert_param(IS_BKP_DR(BKP_DR));
//#define BKP_BASE  (APB1PERIPH_BASE + 0x6C00);#define APB1PERIPH_BASE  PERIPH_BASE
 //#define PERIPH_BASE  ((uint32_t)0x40000000)
  tmp = (uint32_t)BKP_BASE; //BKP_BASE =(uint32_t)0x40000000+0x6C00;
  tmp += BKP_DR;

  *(__IO uint32_t *) tmp = Data;//将tmp强制类型转换为“__IO uint32_t *”,再赋值;
}
*/


u8 WriteToBackupReg(u16 *FirstBackupData,u8 writetonum)
{
 u8 index=0;
 RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); //使能PWR和BKP外设时钟  
 WR_BackupAccessCmd(ENABLE); //使能后备寄存器访问

   RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
  RTC_WaitForSynchro();  //等待RTC寄存器同步
   RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成

  RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
  for(index=0;index<writetonum;index++)
   {
   // BKPDataR[0]就是BKP_DR2寄存器,即数据从BKP_DR2寄存器开始写入  
     BKP_WriteBackupRegister(BKPDataR[index],FirstBackupData[index]); 
     delay_ms(50);
   printf("写入的数据=:%c\n",FirstBackupData[index]); //将写入的数据打印出来
     LED1_TOGGLE;
   }
return 0;
}
void ReadToBackupReg(u16 *FirstBackupData,u8 readtonum)
{
 u16 index=0;
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); //使能PWR和BKP外设时钟  
 WR_BackupAccessCmd(ENABLE); //使能后备寄存器访问 
  RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
 for(index=0;index<readtonum;index++)
   {
   //  FirstBackupData[index]用以存放读到的数据 ,从BKP_DR2寄存器开始读
     FirstBackupData[index]=BKP_ReadBackupRegister(BKPDataR[index]); 
     delay_ms(50);
   printf("读到RTC备份域数据寄存器的值BKP_DRx=:%c\n",FirstBackupData[index]);
     LED2_TOGGLE;
   }

}


主程序:

int main(void)
{
 

 u16 rb[20];//用以存放读到的RTC备份域数据寄存器数据
//u16  buf[]={0x12a,0x13a,0x14a,0x15a,0x16a,0x17a,0x18a,0x19a,0x45,0x34,
//0xaaaa,0xbbbb,0xcccc,0x12a,0x13a,0x14a,0x15a,0x16a,0x17a,0x18a,0x19a};
 u16 n, m=0;
  u8  buf[]={"hello!i'm wangyan."};

   
 uart_init(9600);
 delay_init();
 //  RTC_Init();
 

  WriteToBackupReg((u16*)buf,sizeof(buf));// 写入缓冲字符串
    delay_ms(1000); 
    
//    printf("写入的数据数sizeof(buf)=:%d\n",sizeof(buf));
  
   delay_ms(1000);
   ReadToBackupReg(rb,sizeof(buf));//  从BKP_DR2寄存器开始读,一共读出20个数据
      delay_ms(1000);


 /* 单独读出某个寄存器的值用以验证是否写入成功;打印出12a */
 //  m=BKP_ReadBackupRegister(BKP_DR14);
//    printf("读到RTC备份域数据寄存器的值BKP_DR14=:%x\n",m);
  //   n=BKP_ReadBackupRegister(BKP_DR1);
//    printf("读到RTC备份域数据寄存器的值BKP_DR1=:%x\n",n);
 while (1)
 {   };

}

只有关键函数,有这些就应该可以实现BKP的E2PROM功能了。

手艺人要内外兼修。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

170

主题

917

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1824
金钱
1824
注册时间
2013-4-13
在线时间
63 小时
 楼主| 发表于 2015-1-20 00:12:08 | 显示全部楼层
哦,回头整理后再来。
手艺人要内外兼修。
回复 支持 反对

使用道具 举报

3

主题

14

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2015-4-26
在线时间
0 小时
发表于 2015-7-22 09:28:05 | 显示全部楼层
楼主这一块做好了么~~
回复 支持 反对

使用道具 举报

170

主题

917

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1824
金钱
1824
注册时间
2013-4-13
在线时间
63 小时
 楼主| 发表于 2015-7-22 18:28:49 | 显示全部楼层
回复【4楼】猪头肉哇咔咔:
---------------------------------
做好了
手艺人要内外兼修。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 16:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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