STM32F103怎么实现掉电保存少量数据

2019-08-13 18:58发布

如题,现在有几个变量需要掉电保存,请问要如何在不添加外部EEPROM的情况下实现?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
龙之谷
1楼-- · 2019-08-13 21:55
 精彩回答 2  元偷偷看……
jlufuhua
2楼-- · 2019-08-13 23:19
数据保存到内部FLASH里面
super910906
3楼-- · 2019-08-14 04:56
内部flash可以存。
dong930623
4楼-- · 2019-08-14 05:50
谢谢大家,最后我使用了把数据存储在Flash中这个方法
程序:
#include "stm32f10x_flash.h"
#define PageSize 1024   
u32 data[10] = {1,2,3,4,5,6,7,8,9,10};
u32 data_temp[10] = {0};
u8 flash_write(u32 StartAddr,u32 *p_data,u32 size);
int flash_read(u32 StartAddr,u32 *p_data,u32 size);


  /******************************************************************************
* flash的写函数:输入:
u32 StartAddr flash起始地址
u32 *p_data 待写入数据指针u32 size写入数据的数量
输出:0:正确执行
非0:出错
注意:输入数据一定是u32 的指针,即数据一定是按照4字节对齐写入的。
所以:size也是u32的个数(字节数的4分之一)
*******************************************************************************/
u8 flash_write(u32 StartAddr,u32 *p_data,u32 size)
{
volatile FLASH_Status FLASHStatus;
u32 EndAddr=StartAddr+size*4;
vu32 NbrOfPage = 0;
u32 EraseCounter = 0x0, Address = 0x0;
int i;
int MemoryProgramStatus=1;
//为一是通过
FLASH_Unlock();          //解锁函数
NbrOfPage=((EndAddr-StartAddr)>>10)+1;//有多少个页被擦除//清除所有已有标志
FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);
//擦页
FLASHStatus=FLASH_COMPLETE;
for(EraseCounter=0;(EraseCounter<NbrOfPage)&&(FLASHStatus==FLASH_COMPLETE);EraseCounter++)
{
FLASHStatus=FLASH_ErasePage(StartAddr+(PageSize*EraseCounter));
}
//开始写数据
Address = StartAddr;
i=0;
while((Address<EndAddr)&&(FLASHStatus==FLASH_COMPLETE))
{ FLASHStatus=FLASH_ProgramWord(Address,p_data[i++]);
Address=Address+4;
}
//检验数据是否出错
Address = StartAddr;
i=0;
while((Address < EndAddr) && (MemoryProgramStatus != 0))
{
if((*(vu32*) Address) != p_data[i++])
{ MemoryProgramStatus = 0;
return 1;
}
Address += 4;
}
return 0;
}




int flash_read(u32 StartAddr,u32 *p_data,u32 size)
{
u32 EndAddr=StartAddr+size*4;
int MemoryProgramStatus=1;
u32 Address = 0x0;
int i=0;
Address = StartAddr;
while((Address < EndAddr) && (MemoryProgramStatus != 0))
{
p_data[i++]=(*(vu32*) Address);
Address += 4;  
}
return 0;  
}

调用例子:
      flash_write(0x0800C000,&data[0],10);
      flash_read(0x0800C000,&data_temp[0],10);

一周热门 更多>