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

2019-07-20 11:16发布

     今天写了个后备寄存器当掉电储存的程序,花了一个下午调试基本成功。留着以后如果用最小系统板,要保存的数据有不多时可以用。程序贴上需要的童鞋可以参考参考 [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]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
lmc4791
1楼-- · 2019-07-20 12:25
 精彩回答 2  元偷偷看……
正点原子
2楼-- · 2019-07-20 12:53
 精彩回答 2  元偷偷看……
小崔
3楼-- · 2019-07-20 13:02
回复【3楼】正点原子:
---------------------------------
原子哥,弱弱的问一个问题:如果没有VBAT供电,BKP还能工作吗?
正点原子
4楼-- · 2019-07-20 14:22
回复【4楼】小崔:
---------------------------------
不能。
752151619
5楼-- · 2019-07-20 16:18
 精彩回答 2  元偷偷看……
纯情小炒蛋
6楼-- · 2019-07-20 22:17
 精彩回答 2  元偷偷看……

一周热门 更多>