打印

用后备寄存器bkp当掉电储存

[复制链接]
318|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
一亚麻怡|  楼主 | 2018-7-15 14:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
今天写了个后备寄存器当掉电储存的程序,花了一个下午调试基本成功。留着以后如果用最小系统板,要保存的数据有不多时可以用。程序贴上需要的童鞋可以参考参考

[mw_shl_code=c,true] u16 Data[4];//外部变量,在此文件.H中定义(要保存的数据)
u8 p;                 //要保存的数据数(不要超过BKP后备寄存器位)

//外部中断16服务程序 (断电)
void PVD_IRQHandler(void)
{
BKP_Write(Data,p);        //写入BKP
}
//写入BKP
void BKP_Write(u16 *data,u8 b)

  {
   u8 e;
   vu16 *d;
              
   RCC->APB1ENR|=1<<27;//备份时钟开启
   PWR->CR|=1<<8;//允许写入后备寄存器
        d=&(BKP->DR1);
    for(e=0;e<b;e++)
     {
       *d=*data;
        data++;
        d++;
     }
   }
  


//外部中断初始化程序
//初始化PA0,PA13,PA15为中断输入.
void PVD_IR(void)
{
  RCC->APB1ENR|=1<<28;     //使能电源时钟
  PWR->CR|=1<<4;//开启电源监测
  PWR->CR|=3<<5;//PLS 011:2.5V
  PWR->CSR|=1<<2;//低与PLS PVD输出
  EXTI->IMR|=1<<16;//开放16线中断
   EXTI->EMR|=1<<16;
  EXTI->RTSR|=1<<16;//上升沿触发
  MY_NVIC_Init(2,2,PVD_IRQChannel,2);    //抢占2,子优先级2,组2
          
}
//程序开始读数据
void BKP_Read(u16 *data,u8 b)

{
   u8 c;
   vu16 *d;
   RCC->APB1ENR|=1<<27;//备份时钟开启
   d=&(BKP->DR1);
    for(c=0;c<b;c++)
     {
       *data=*d;
        data++;
        d++;
     }
   }
       
               
[mw_shl_code=c,true]int main(void)//主程序是自己调试用的!写的不好,反正寄存器配置还是可以参考参考的。
{       
    u16 a[4];
        Data[0]=0x2222;//自己要保存的数据 Data[1]=0X9999; //自己要保存的数据
        p=2;                //假设要保存2位
        Stm32_Clock_Init(9); //系统时钟设置
        delay_init(72);             //延时初始化
        uart_init(72,9600);  //串口初始化
        LED_Init();                           //初始化与LED连接的硬件接口
        PVD_IR();         //中断初始化
        BKP_Write(Data,p);       
        BKP_Read(a,4);
        while(1)
        {
         if(a[0]==0xffff)LED1=0;
         a[3]=BKP->DR1;          
        }         
}[/mw_shl_code]

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

404

主题

404

帖子

0

粉丝