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