STM32读写flash保存用户数据

发布者:BlissfulHiker最新更新时间:2018-05-01 来源: eefocus关键字:STM32  读写flash  保存用户数据 手机看文章 扫描二维码
随时随地手机看文章

在实际的项目中,我们可能需要保存一些数据,希望下次启动的时候数据还可以使用。在这里介绍使用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的整数倍,否则 写入数据时会擦除相邻的扇区的数据


关键字:STM32  读写flash  保存用户数据 引用地址:STM32读写flash保存用户数据

上一篇:STM32 Flash读写;Flash地址对应的存储内容及方式
下一篇:STM32 读写内部Flash

推荐阅读最新更新时间:2024-03-16 16:01

STM32初识——通用定时器配置
通用定时器的益处时间 Tout= ((arr+1)*(psc+1))/Tclk; TIM3时钟使能 TIM3 是挂载在 APB1 之下,所以我们通过 APB1 总线下的时钟使能函数来使能 TIM3。调用的函数是: RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能 初始化定时器参数,设置自动重装值,分频系数,计数方式。 在库函数中,定时器的初始化参数是通过初始化函数 TIM_TimeBaseInit 实现的: voidTIM_TimeBaseInit(TIM_TypeDef*TIMx,TIM_TimeBaseInitTypeDef* TIM_Time
[单片机]
关于STM32外部中断EXTI10-15,EXTI5-9共用一个中断向量处理方法
利用ITStatus EXTI_GetITStatus(uint32_t EXTI_Line) 函数判断具体的中断源 再进一步处理 注意:因为调用了 delay_ms() 函数 因此主函数的开头 必须初始化 延时函数 delay_init() ps 因为这个原因调了一天了 多么痛的领悟!! 具体如下:
[单片机]
关于<font color='red'>STM32</font>外部中断EXTI10-15,EXTI5-9共用一个中断向量处理方法
stm32定时器外部时钟3使用外部时钟源模式2进行定时的步骤
stm32中的通用定时器的计数时钟有三种,内部时钟、外部时钟源、内部触发输入这三种,其中内部时钟是大家都比较常用的,也是在应用中比较多的,我们现在主要来讲一下外部时钟源的模式2外部时钟模式2:外部触发输入。 编程步骤: 配置TIM3_ETR引脚为输入引脚PD2,硬件上需要将脉冲连接到该引脚,我这里是使用6.78MHz的晶振 配置定时器3:包括使能定时器3对应的时钟引脚,配置定时器3的周期、预分频参数 因为我们使用了定时器3中断,所以需要给定时器设置优先级,在timerx_nvic_init()中的关于TIM3部分操作 将SMCR中的ETF、ETPS、ETP和ECE进行配置 执行完了以上步骤之后还需要操作triggle中断
[单片机]
stm32: 固件库文件说明
关于固件库文件说明 固件库文件夹STM32F10x_StdPeriph_Lib_V3.5.0下文件说明: 一、Libraries文件夹主要文件有: 1、core_cm3.c , core_cm3.h :CMSIS核心文件,通过进入Cortex_M3内核的接口 2、startup文件夹下是系统启动文件,根据不同的芯片选用启动文件,103系列芯片选用startup_stm32f10x_hd.s 3、system_stm32f10x.c , system_stm32f10x.h :设置系统及总线时钟,其中SystemInit函数在系统启动时,设置时钟系统。 4、stm32f10x.h :系统寄存器定义、声明、内存操作。 二、P
[单片机]
基于MLX90615和STM32的多点红外温度测量系统设计
  0 引言   目前在多点温度测量系统中应用较为广泛的是DALLAS公司的数字温度传感器DS18B20,其优点是只需一根总线,就能完成系统中数据的交换与控制。但DS18B20响应速度慢,精度低,且在实际应用中当总线挂接的DS18B20 的数目超过8 个时,就必须为每个DS18B20提供独立电源供电,导致系统维护变得十分困难。红外测温技术作为一种便捷、准确的非接触式测温技术而得到快速发展。红外测温可实现在其视场范围内对难以接触区域或危险区域进行连续、实时的温度监测,有效降低了测温作业的危险系数;且具有体积小、精度高、可组网及实时性能好等优点。本文采用数字式红外温度传感器MLX90615作为温度检测器件,以STM32微处理器为核
[单片机]
基于MLX90615和<font color='red'>STM32</font>的多点红外温度测量系统设计
STM32时钟与GPIO分析 基于STM32的LED灯开发
一、 STM32时钟分析 寄存器 :寄存器的功能是存储二进制代码,它是由具有存储功能的触发器组合起来构成的。一个触发器可以存储1位二进制代码,故存放n位二进制代码的寄存器,需用n个触发器来构成 在计算机领域,寄存器是CPU内部的元件,包括通用寄存器、专用寄存器和 控制寄存器 。寄存器拥有非常高的读写速度,所以在寄存器之间的数据传送非常快。 控制寄存器 :相当一排可通过0/1进行设置外设功能的开关,程序中通过地址查找到对应的寄存器,所以说控制寄存器的地址是唯一。 芯片时钟:芯片工作时,是需要脉冲,脉冲相当于给芯片起振,可保证芯片的正常工作,类似于人,心脏正常跳动,人体生命特征才能正常。 1HZ:一秒产生1个脉冲 频率换算单位:
[单片机]
<font color='red'>STM32</font>时钟与GPIO分析 基于<font color='red'>STM32</font>的LED灯开发
KEIL MDK 和 STM32数据类型 一篇就够了
windows和linux中的: 先放一张计算机上的: 单片机中的: KEIL C下的数据定义与windows和linux系统下的数据定义稍有不同 编程过程中,不同的 MCU 或编译器,其数据类型的意义各不相同,所以一定要注意相应变量数据类型的定义和转换,否则在程序 编译时候会出错。 ▲ 在 KELI MDK 数据类型中进了如下定义 char 占用 1 个字节 short int 占用 2 字节//注意这里! int 占用 4 字节 long 占用 4 字节 //注意这里! long int 占用 4 字节 //注意这里! float 占用 4 字节 double 占用 8 字节即有如下宏定义 typedef unsign
[单片机]
KEIL MDK 和 <font color='red'>STM32</font> 的<font color='red'>数据</font>类型 一篇就够了
基于STM32调用固件库实现点灯
相信学过单片机的同学,对于调库这个操作都不陌生,大多数人都是从调别人的库阶段过来的。 今天看到一个评论说,如果只会调库,到了公司后会发现自己啥都不是。其实这话说的一点也不假,如果只会调库的话,你的单片机水平还停留在C语言阶段,并不能称为真正的单片机开发。 但我们要有这么一个概念:调库是自己编写的开始,如果上来就给你讲寄存器这些,我相信很多初学者都接收不了、理解不了这写寄存器到底在干啥。可是,如果从调别人库开始学习单片机,我们就会对单片机有个初始概念,对于后面的学习非常有帮助。 所以,今天我们就来看一下如何从调库工程师成为真正的开发工程师。 1. 什么是调库? 如果你通过机构的培训视频,比如野火的STM32单片机开
[单片机]
基于<font color='red'>STM32</font>调用固件库实现点灯
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved