当前位置:首页 > 单片机 > 单片机
[导读] 在实际的项目中,我们可能需要保存一些数据,希望下次启动的时候数据还可以使用。在这里介绍使用STM32内部flash来保存数据的方法。在这里我使用STM32F103C8T6这款芯片做介绍。flash大小64K。本例子0x08

在实际的项目中,我们可能需要保存一些数据,希望下次启动的时候数据还可以使用。在这里介绍使用STM32内部flash来保存数据的方法。

在这里我使用STM32F103C8T6这款芯片做介绍。flash大小64K。本例子0x0800 0000~0x800 3000作为bootloader使用,0x0800 3000~0x0800 C000作为程序存放地址,0x0800 C000~0x0800 FFFF作为本例子的数据存放区域。





程序:

#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{
FLASHStatus=FLASH_ErasePage(StartAddr+(PageSize*EraseCounter));
}
//开始写数据
Address = StartAddr;
i=0;
while((Address{ 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);


注意:#define PageSize 1024 根据不同型号有1K与2K的不同


STM32根据FLASH主存储块容量、页面的不同,系统存储器的不同,分为小容量、中容量、大容量、互联型,共四类产品。

小容量产品主存储块1-32KB,每页1KB。系统存储器2KB。

中容量产品主存储块64-128KB,每页1KB。系统存储器2KB。

大容量产品主存储块256KB以上,每页2KB。系统存储器2KB。

互联型产品主存储块256KB以上,每页2KB。系统存储器18KB。


还有Flash当EEPROM用还是很蛋疼很不好用的,尤其是数据较多的时候,因为Flash是要先整页擦除,再写入数据的,改变页中的一个数据就要备份该页的全部数据,然后再整页重新写一遍!



页面大小

按1.2的方法下得该MCU的参考手册,STM32F103RBT6对应的参考手册为RM0008 Reference manual,定位到Embedded Flash memory章节(也可以通过搜索0x0800 0000来定位)。STM32有4种Flash module organization,分别是:low-density devices(32KB,1KB/page)、medium-density devices(128KB,1KB/page)、high-density devices(512KB,2KB/page)、connectivity line devices(256KB,2KB/page)、XL-density(devices(1M,2KB/page)。从上面分析可知,STM32F103RBT6的Flash是128KB,可见是medium-density devices,如下图所示:

图4 Flash module organization (medium-density devices)


注意数据写入的地址必须是偶数,否则flash读到的数据全为0,最好为1K的整数倍,否则 写入数据时会擦除相邻的扇区的数据


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

在嵌入式系统中,Flash存储器因其非易失性、高密度和低成本特性,成为代码存储和关键数据保存的核心组件。然而,MCU驱动Flash读写时,开发者常因对硬件特性理解不足或操作流程疏忽,陷入性能下降、数据损坏甚至硬件损坏的陷...

关键字: MCU驱动 Flash

在人工智能的发展历程中,我们往往认为更多的训练、更复杂的数据能让 AI 变得更加智能。然而,近期一些研究却揭示了令人意外的现象:对小型 AI 语言模型进行数学训练时,过度训练可能会导致其表现急剧下降,甚至出现 “变笨”...

关键字: 人工智能 数据 模型

I2C 总线的起始条件和终止条件通常由主机产生。起始条件是在 SCL 高电平时,SDA 从高电平转为低电平;而终止条件则是当 SCL 高电平时,SDA 从低电平转化为高电平。这两个条件的准确识别对于 I2C 通信的正确启...

关键字: I2C 总线 数据 协议

在AI数据产业中,数据精准度=验收合格数量/全部数量,这意味极高的精准度不仅要满足一些客观标准,还需要与AI项目方的需求深度契合,通过基于需求的验收过程。

关键字: AI 数据

当下,身份认证已成为网络安全的核心基石。从移动支付到远程办公,从政务服务到工业控制,每一次网络交互都依赖于对用户身份真实性的确认。然而,密码泄露、AI换脸攻击、生物特征伪造等新型威胁,正不断挑战传统认证体系的可靠性。身份...

关键字: 计算机网络 用户

基于使用困难报告系统(SDRS)对钻石DA20飞机的故障数据进行分析 。基于SDRS系统收集到的数据 , 结合故障分类方法 ,对钻石DA20飞机的不同故障进行研究 ,并提出相应的解决措施 ,有利于提高钻石DA20飞机机队...

关键字: SDRS DA20飞机 故障 数据

在当今数字化时代,数据如同流淌在信息高速公路上的血液,驱动着各个领域的创新与发展。而在嵌入式视觉领域,高速数据传输正扮演着越来越关键的角色,它不仅是实现实时、精准视觉感知的基础,更是开启未来智能应用无限可能的钥匙。

关键字: 数据 视觉 传输
关闭