文档章节

stm32 读写Flash

kangxin1234
 kangxin1234
发布于 2015/09/09 23:16
字数 601
阅读 274
收藏 1

    在有些场合掉电保存是很有用的,但一般都是用EEPROM,要新增硬件电路,比较麻烦。stm32有一个Flash控制器,用户可以在线读写Flash,这样一定情况下可以用读写Flash做掉电保存,挺方便的。擦写不多于10万次。

    我用的是stm32F10x3ZET6的Flash(512K)结构如下:

    

存储区的地址:0x0800 0000--0x0807 FFFF

这一段存储区使用存储程序的,用户也可以读写这一块区域。当然你得保证你读写的区域不是你的程序存储的区域。为此你要对你的编程器进行设置,如何你是用的j-link,用keil直接下载的,你可以进行一下设置,进入 “魔术棒”---utilities--seting

程序编程区域设为0x0800 0000--0x0007 0000 。

这样这之后的区域就0x0007 0001--0x0807 FFFF你就可以任意读写了。

程序:

    1、一定要开启HSI时钟。

    2、先擦除后写入。擦除时只能按页擦除。

    3、读写必须是半字(16 bit)。

下面为读写配置函数。

flash.c

#include "flash.h"

void Flash_Init(void)
{
	RCC_HSICmd(ENABLE);//开启内部高速时钟	
}

uint8_t Flash_Write(uint32_t STARTADDR, uint16_t data[], uint16_t len)//擦除一页从这一页的开始写一组数据,成功返回0,不成功返回1
{
	FLASH_Status flashStatus = FLASH_COMPLETE;
	uint16_t i=0;
	FLASH_Unlock();    					//解锁
	FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGERR |  FLASH_FLAG_WRPRTERR);	//清除flag  
	flashStatus = FLASH_ErasePage(STARTADDR);	//擦除以STARTADDR开始的那一页	
	if(flashStatus != FLASH_COMPLETE)//是否擦除成功,不成功返回1
		return 1;
	for(i=0; i<len; i++)
		FLASH_ProgramHalfWord(STARTADDR+2*i, data[i]);     //写入数组   
	
	FLASH_Lock();//锁定flash
	
	return 0;
}

void Flash_Read(uint32_t startaddr, uint16_t data[], uint16_t len) 
{
	uint16_t i=0;
	for(i=0; i<len; i++)	
		data[i] = *(vu16*)(startaddr+i*2);//为什么这个指针是指向flash,而不是内存呢?因为
	//在arm中ram,sdram,flash都映射到同一套地址中,在startaddr所在的这一片地址就是对应着flash
}

测试程序,写进去再读出来,发到串口。

#include "stm32f10x.h"
#include "stm32f10x_it.h"
#include "led.h"
#include "usart.h"
#include "stdio.h"
#include "timer.h"
#include "dma.h"
#include "adc.h"
#include "flash.h"

void init()
{
	Usart1_Init(115200);
	Flash_Init();
}

#define STARTADDR 0x0807f800
int main()
{
	uint8_t flag = 0;
	uint8_t i=0;
	uint16_t data[5]={1, 2, 3, 4, 5};
	uint16_t num[5]={0};
	init();
		
	//printf("hello");
	
	
	
	Flash_Write(STARTADDR, data, 5);
	Flash_Read(STARTADDR, num, 5);
	
	for(i=0; i<5; i++)
	{
		printf("%d", num[i]);
	}
	
	while(1);
	
}

认为重要的就这些了,其他的问题可以百度到。



© 著作权归作者所有

kangxin1234

kangxin1234

粉丝 38
博文 51
码字总数 35417
作品 0
程序员
私信 提问
STM32----FLASH掉电保存动态平衡方案

stm32是支持对自身Flash(code区)进行读写的。所以,在某些需要掉电保存的场合,我们可以利用这一特性节省一个外部的Flash或者EEPROM,对数据进行保存。 但是,如果需要经常性的保存数据,就...

a3748622
2018/04/11
0
0
STM32 FLASH模拟EEPROM实验

STM32本身没有自带EEPROM,但是STM32具有IAP(在应用编程)功能,所以我们可以把它的FLASH当成EEPROM来使用。 1 STM32 FLASH简介 不 同型号的STM32,其FLASH容量也有所不同,最小的只有16K字...

卤煮小鱼
2016/04/18
2.4K
0
STM32 内部Flash带缓存读写 程序源码,已验证

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 https://blog.csdn.net/HowieXue/article/details/95043812 STM32 内部Flash带缓存读写 程序...

HowieXue
07/08
0
0
基于STM32(ARM Cortex M3)的Arduino——Spurce (支持Eclip...

很多电子专业的学生,或者刚刚入行的电子工程师都有一个困惑。电子行业范畴这么大,这么多细分行业,不知该如何抉择。诸如硬件、软件、Layout 、单片机、 ARM ……这么多名词让人眼花缭乱,职...

soliddigi
2011/09/18
2.9K
0
stm32硬件调试

STM32的基本系统主要涉及下面几个部分: 一、电源  1)、无论是否使用模拟部分和AD部分,MCU外围出去VCC和GND,VDDA、VSSA、Vref(如果封装有该引脚)都必需要连接,不可悬空;   2)、对...

peng_258
2017/10/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

领域驱动中的“贫血症和失忆症”

贫血症严重危害着人类健康,并且伴随有危险的副作用。当贫血领域对象被首次提出来时,它并不是一个博得赞美的词汇,它描述的是一个缺少内在行为领域对象。奇怪的是,人们对于贫血领域对象的态...

还仙
14分钟前
3
0
条码打印软件中标签预览正常打印无反应怎么解决

在使用条码打印软件制作标签时,有客户反馈,标签打印预览正常的,但是打印无反应,咨询是怎么回事?今天针对这个情况,可以参考以下方法进行解决。 一、预览正常情况下,打印没反应 (1)在条码...

中琅软件
23分钟前
3
0
判断字符串的时候

判断字符串的时候一定把常量房前边, //报警程度 String leve = vo.getDeviceAlertDeal().getWarnLevel(); if(("0").equals(leve)) { row.add("无报警"); }else if(("1").equals(leve)) { ro......

简小姐
24分钟前
5
0
Linux maven3.6.2 install

PS:安装 maven 之前请先安装 jdk 1.安装 wget 命令(安装过就不用了) yum -y install wget 2.寻找需要的 maven 版本 https://maven.apache.org/download.cgi 3.进入 /var/local 文件夹 cd...

东方神祇
26分钟前
4
0
Tomcat源码分析二:先看看Tomcat的整体架构

Tomcat源码分析二:先看看Tomcat的整体架构 Tomcat架构图 我们先来看一张比较经典的Tomcat架构图: 从这张图中,我们可以看出Tomcat中含有Server、Service、Connector、Container等组件,接下...

flygrk
29分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部