首页 > 其他分享 >STM32F103内部FLASH及地址表

STM32F103内部FLASH及地址表

时间:2023-07-21 09:03:06浏览次数:42  
标签:STM32F103 Flash FLASH 写入 地址 uint16 dataIndex uint32

在我们应用开发时,经常会有一些程序运行参数需要保存,如一些修正系数。这些数据的特点是:数量少而且不需要经常修改,但又不能定义为常量,因为每台设备可能不一样而且在以后还有修改的可能。将这类数据存在指定的位置,需要修改时直接修改存储位置的数值,需要使用时则直接读取,会是一种方便的做法。考虑到这些数据量比较少,使用专门的存储单元既不经济,也没有必要,而STM32F103内部的Flash容量较大,而且ST的库函数中还提供了基本的Flash操作函数,实现起来也比较方便。

以大容量产品STM32F103VE为例,其Flash容量达到512K,可以将其中一部分用作数据存储。如下是大容量的Flash组织模式:
在这里插入图片描述

根据上面的Flash组织模式,我们可以根据自己的使用方便来作相应的定义。因为大容量每个扇区定义为2K,而小容量和中容量都定义为1K,所以我们做如下宏定义:

#define FLASH_SIZE 512 //所选MCU的FLASH容量大小(单位为K)

#if FLASH_SIZE<256

#defineSECTOR_SIZE 1024 //字节

#else

#defineSECTOR_SIZE 2048 //字节

#endif

虽然ST的库函数比较全面,但都是基本操作,为了使用方面,根据我们自己的需要对其进行再次封装。

对于读操作相对比较简单,内置闪存模块可以在通用地址空间直接寻址,就像读取变量一样。

//从指定地址开始读取多个数据

void FLASH_ReadMoreData(uint32_tstartAddress,uint16_t *readData,uint16_t countToRead)

{

uint16_tdataIndex;

for(dataIndex=0;dataIndex<countToRead;dataIndex++)

{

readData[dataIndex]=FLASH_ReadHalfWord(startAddress+dataIndex*2);

}

}

//读取指定地址的半字(16位数据)

uint16_t FLASH_ReadHalfWord(uint32_t address)

{

return*(__IO uint16_t*)address;

}

//读取指定地址的全字(32位数据)

uint32_t FLASH_ReadWord(uint32_t address)

{

uint32_ttemp1,temp2;

temp1=(__IO uint16_t)address;

temp2=(__IO uint16_t)(address+2);

return(temp2<<16)+temp1;

}

对于写操作相对来说要复杂得多,写操作包括对用户数据的写入和擦除。为了防止误操作还有写保护锁。但这些基本的操作ST的库函数已经为我们写好了,我们只需要调用即可。

STM32复位后,FPEC模块是被保护的,只有在写保护被解除后,我们才能操作相关寄存器。STM32闪存的编程每次必须写入16位,任何不是半字的操作都会造成错误。如下图是Flash写的过程:

在这里插入图片描述

STM32的FLASH在编程的时候,也必须要求其写入地址的FLASH是被擦除了的(也就是其值必须是0XFFFF),否则无法写入。Flash的擦除要求必须整页擦除,所以也必须整页写入,否则可能会丢失数据。如下图是Flash页擦除过程:

如下为Flash全擦除过程,

在这里插入图片描述

根据以上图示我们便写数据写入函数如下:

//从指定地址开始写入多个数据

void FLASH_WriteMoreData(uint32_tstartAddress,uint16_t *writeData,uint16_t countToWrite)

{

if(startAddress<FLASH_BASE||((startAddress+countToWrite2)>=(FLASH_BASE+1024FLASH_SIZE)))

{

return;//非法地址

}

FLASH_Unlock(); //解锁写保护

uint32_toffsetAddress=startAddress-FLASH_BASE; //计算去掉0X08000000后的实际偏移地址

uint32_tsectorPosition=offsetAddress/SECTOR_SIZE; //计算扇区地址,对于STM32F103VET6为0~255

uint32_tsectorStartAddress=sectorPosition*SECTOR_SIZE+FLASH_BASE; //对应扇区的首地址

FLASH_ErasePage(sectorStartAddress);//擦除这个扇区

uint16_tdataIndex;

for(dataIndex=0;dataIndex<countToWrite;dataIndex++)

{

FLASH_ProgramHalfWord(startAddress+dataIndex*2,writeData[dataIndex]);

}

FLASH_Lock();//上锁写保护

}

在擦除之前应该将页面上的数据读取出来与要写入的数据合并,待擦除后再写入,但这样数据量很大(大容量是2K一个扇区),所以考虑到是少量数据存储,所以每次都将全部数据同时写入,简化操作,也减少数据处理量。经测试以上程序写入和读出数据均正确,可以实现内部Flash的读写操作。需要更深入了解可以参考《STM32F10xxx 闪存编程参考手册》。

原文:https://blog.csdn.net/foxclever/article/details/52241744

标签:STM32F103,Flash,FLASH,写入,地址,uint16,dataIndex,uint32
From: https://www.cnblogs.com/SymPny/p/17570270.html

相关文章

  • [GPT] 如何配置抓包工具以解密HTTPS流量才能看到明文的域名地址
     要配置抓包工具以解密HTTPS流量,您需要执行以下步骤: 1.安装抓包工具:首先,确保您已经安装了支持HTTPS解密的抓包工具,例如Wireshark。 2.获取SSL证书:抓包工具需要使用目标网站的SSL证书来解密HTTPS流量。您可以通过以下两种方式之一获取SSL证书:a.从目标网站获取......
  • 踩坑记录,axios post方法请求参数出现在地址栏的问题
    某天使用axios做post请求接口突然不好使了,总是调不通,并且参数都是出现在访问地址后,如图: 找了半天,原来是调用api的时候,参数使用错误:由于post 请求接收params参数和data参数,这里是cv上面get请求的方法,只修改method为post,下面的params忘记改成data了!,导致axios拿到params后直接......
  • 请问为什么cmd中输入python显示no python at (python所在地址)?
    可能是由于您的Python安装路径不在系统的PATH环境变量中导致的。您可以尝试将Python的安装路径添加到PATH环境变量中,然后再次尝试在cmd中输入python。如果您已经将Python的安装路径添加到了PATH环境变量中,但仍然无法在cmd中输入python,那么可能是因为您的系统中存在多个版本的Pyt......
  • 《剑指offer》 对应的 在线测试地址
    《剑指Offer》面试题集收录汇总面试题1赋值运算符函数不适合在线模式面试题2实现Singleton模式不适合在线模式面试题3二维数组中的查找已收录面试题4替换空格已收录面试题5从头到尾打印链表已收录面试题6重建二叉树已收录面试题7用两个栈实现队列已收录面试......
  • vue生成二维码以及获取当前的地址url
    <template> <divclass="hello">  <h2>二维码</h2>  <canvasref="qrCodeCanvas"></canvas><div>{{url}}</div> </div></template><script>importQRCodefrom'qrco......
  • plc网络通信方案地址转换通讯处理器
    捷米特JM-ETH-NAT可以实现近似于NAT的跨网段地址转换的功能:即可将LAN1口所连接PLC的IP地址和端口号,映射到LAN2口任意IP地址和端口号;方便解决了现场设备无法修改IP地址和端口号的问题; 捷米特JM-ETH-NAT具备两路物理性接口,LAN1和LAN2口分别具备独立的局域网功能。其中LAN1口为......
  • WebAPI请求获取请求中的真实地址
    publicstaticstringWebAPIGetRealIP(thisHttpRequestreq){stringipAddress=req.Headers["x-forwarded-for"].ToString()?.Trim();if(!string.IsNullOrEmpty(ipAddress)&&ipAddress.IndexOf(",")!=-......
  • 斯坦福博士一己之力让Attention提速9倍!FlashAttention燃爆显存,Transformer上下文长度
    前言 FlashAttention新升级!斯坦福博士一人重写算法,第二代实现了最高9倍速提升。本文转载自新智元仅用于学术分享,若侵权请联系删除欢迎关注公众号CV技术指南,专注于计算机视觉的技术总结、最新技术跟踪、经典论文解读、CV招聘信息。CV各大方向专栏与各个部署框架最全教程整理......
  • HJ33 整数与IP地址间的转换
    1.题目读题HJ33 整数与IP地址间的转换  考查点 2.解法思路 二进制与十进制的互转可参照  Java中十进制二进制相互转换的方法代码逻辑 具体实现 publicclassIP2Num{publicstaticvoidmain(String[]args){Scannersc=newScanner(S......
  • Download SQL Server Express或LocalDB下载地址
    Introducing http://downloadsqlserverexpress.com (thisshortlinkgoesdirectlytothispost)SQLServer2019ExpressEdition(English):Basic(239MB): https://download.microsoft.com/download/7/c/1/7c14e92e-bdcb-4f89-b7cf-93543e7112d1/SQLEXPR_x64_ENU.exe......