今天写了个后备寄存器当掉电储存的程序,花了一个下午调试基本成功。留着以后如果用最小系统板,要保存的数据有不多时可以用。程序贴上需要的童鞋可以参考参考
[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]
	 
[/mw_shl_code]
  |