STM32学习笔记--闪存Flash

        STM32F1系列的FLASH包含程序存储器、系统存储器和选项字节三个部分,通过闪存存储器接口(外设)可以对程序存储器和选项字节进行擦除和编程。

        读写FLASH的用途:利用程序存储器的剩余空间来保存掉电不丢失的用户数据 ,通过在程序中编程(IAP),实现程序的自我更新,在线编程(In-Circuit Programming – ICP)用于更新程序存储器的全部内容,它通过JTAGSWD协议或系统加载程序(Bootloader)下载程序,在程序中编程(In-Application Programming – IAP)可以使用微控制器支持的任一种通信接口下载程序。

 FPEC模块处理闪存的编程和擦除操作,它包括7个32位的寄存器:

FPEC键寄存器(FLASH_KEYR)
选择字节键寄存器(FLASH_OPTKEYR)
闪存控制寄存器(FLASH_CR)
闪存状态寄存器(FLASH_SR)
闪存地址寄存器(FLASH_AR)
选择字节寄存器(FLASH_OBR)
写保护寄存器(FLASH_WRPR)

 使用指针读指定地址下的存储器:

          uint16_t Data = *((__IO uint16_t *)(0x08000000));

使用指针写指定地址下的存储器:

          *((__IO uint16_t *)(0x08000000)) = 0x1234;

其中:

          #define    __IO    volatile

/*** 函    数:FLASH读取一个32位的字* 参    数:Address 要读取数据的字地址* 返 回 值:指定地址下的数据*/
uint32_t MyFLASH_ReadWord(uint32_t Address)
{return *((__IO uint32_t *)(Address));	//使用指针访问指定地址下的数据并返回
}

 STM32—Flash读写详解_stm32写入flash-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/zhuxinmingde/article/details/131972752?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-1-131972752-blog-123402701.235^v39^pc_relevant_3m_sort_dl_base1&spm=1001.2101.3001.4242.2&utm_relevant_index=4
        下文代码中STMFLASH_Read(FLASH_ADDR,Temporary_storage,size);这里FLASH_ADDR是我们要读取的起始地址,Temporary_storage是16位的指针变量,存放我们读取到的内容,size是我们要读取的大小,值得注意的是,size是半字大小,也就是有多少个两个字节。比如我们要读取100个字节,size就可以填50。

FLASH的读取
直接读取某一地址的内容
因为读取FLASH并不需要解锁,我们可以直接用指针指向所读的地址,之后读取此地址的内容即可。p = (uint32_t *)(0x08008000);
printf("\r\n读取内部FLASH该地址存储的内容为:0x%x",*p);
此程序就是先将0x08008000赋给指针变量P,之后将P指向地址的内容以16进制的格式输出出来。读取选定位置的选定大小的内容
1. 首先我们编写一个函数,用以读取指定地址的半字(16位数据)。u16 STMFLASH_ReadHalfWord(u32 faddr)
{return *(vu16*)faddr; 
}
2. 从指定地址开始读出指定长度的数据LReadAddr:起始地址pBuffer:数据指针NumToWrite:半字(16位)数void STMFLASH_Read(u32 ReadAddr,u16 *pBuffer,u16 NumToRead)   	
{u16 i;for(i=0;i<NumToRead;i++){pBuffer[i]=STMFLASH_ReadHalfWord(ReadAddr);//读取2个字节.ReadAddr+=2;//偏移2个字节.	}
}
当我们想读取FLASH内容时,只需要直接调用上面的函数即可。

共有三个键值:
RDPRT键 = 0x000000A5

        RDP:读出保护选择字节
        读出保护功能帮助用户保护存在闪存中的代码。该功能由设置信息块中的一个选择字节启用。
        写入正确的数值(RDPRT键=0x00A5)到这个选择字节后,闪存被开放允许读出访问。

KEY1 = 0x45670123
KEY2 = 0xCDEF89AB

解除闪存锁
        复位后,FPEC模块是被保护的,不能写入FLASH_CR寄存器;通过写入特定的序列到FLASH_KEYR寄存器可以打开FPEC模块,这个特定的序列是在FLASH_KEYR写入两个键值(KEY1和KEY2);错误的操作序列都会在下次复位前锁死FPEC模块和FLASH_CR寄存器。
        写入错误的键序列还会产生总线错误;总线错误发生在第一次写入的不是KEY1,或第一次写入的是KEY1但第二次写入的不是KEY2时;FPEC模块和FLASH_CR寄存器可以由程序设置FLASH_CR寄存器中的LOCK位锁住,这时可以通过在FLASH_KEYR中写入正确的键值对FPEC解锁。

主闪存编程

        对主闪存编程每次可以写入16位。当FLASH_CR寄存器的PG位为’1’时,在一个闪存地址写入一个半字将启动一次编程;写入任何非半字的数据,FPEC都会产生总线错误。在编程过程中(BSY位为’1’),任何读写闪存的操作都会使CPU暂停,直到此次闪存编程结束。

 标准的闪存编程顺序如下:(即上图详细过程文字描述)
        检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的编程操作;
        设置FLASH_CR寄存器的PG位为’1’;
        在指定的地址写入要编程的半字;
        等待BSY位变为’0’;
        读出写入的地址并验证数据。
注意: 当FLASH_SR寄存器的BSY位为’1’时,不能对任何寄存器执行写操作。

        这种模式下CPU以标准的写半字的方式烧写闪存,FLASH_CR寄存器的PG位必须置’1’。FPEC先读出指定地址的内容并检查它是否被擦除,如未被擦除则不执行编程并在FLASH_SR寄存器的PGERR位提出警告(唯一的例外是当要烧写的数值是0x0000时,0x0000可被正确烧入且PGERR位不被置位);如果指定的地址在FLASH_WRPR中设定为写保护,则不执行编程并在FLASH_SR寄存器的WRPRTERR位置’1’提出警告。FLASH_SR寄存器的EOP为’1’时表示编程结束。

闪存擦除

 页擦除
闪存的任何一页都可以通过FPEC的页擦除功能擦除;擦除一页应遵守下述过程:
        检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的闪存操作;
        设置FLASH_CR寄存器的PER位为’1’;
        用FLASH_AR寄存器选择要擦除的页;
        设置FLASH_CR寄存器的STRT位为’1’;
        等待BSY位变为’0’;
        读出被擦除的页并做验证。

 整片擦除
可以用整片擦除功能擦除所有用户区的闪存,信息块不受此操作影响。建议使用下述过程:
        检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的闪存操作;
        设置FLASH_CR寄存器的MER位为’1’;
        设置FLASH_CR寄存器的STRT位为’1’;
        等待BSY位变为’0’;
        读出所有页并做验证。

选择字节说明:
        选择字节共有8个字节,由用户根据应用的需要配置;例如:可以选择使用硬件模式的看门狗或软件的看门狗。
        在选择字节中每个32位的字被划分为下述格式:

        每次系统复位后,选择字节装载器读出信息块的数据并保存在寄存器中;每个选择位都在信息块中有它的反码位,在装载选择位时反码位用于验证选择位是否正确,如果有任何的差别,将产生一个选择字节错误标志(OPTERR)。当发生选择字节错误时,对应的选择字节被强置为0xFF。当选择字节和它的反码均为0xFF时(擦除后的状态),则关闭上述验证功能。 

•RDP:写入RDPRT键(0x000000A5)后解除读保护
•USER:配置硬件看门狗和进入停机/待机模式是否产生复位
•Data0/1:用户可自定义使用
•WRP0/1/2/3:配置写保护,每一个位对应保护4个存储页(中容量)

 STM32单片机bootloader扫盲_stm32 bootloader-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_42378319/article/details/120896348

BootLoader和APP之间的关系
        APP就是平时写的单片机上的应用程序,而BootLoader本质上和APP一样,也是平时写的应用程序。BootLoader只不过是拥有从外部接收数据,更新Flash(也就是APP),跳转至APP功能的特殊APP罢了。

        以STM32F103为例,如果没有BootLoader,flash分布就如下图左半部分。如果有BootLoader,就如下图右半部分,将flash分为两部分(这里举例用0x800 4000做分界线),存储了两个应用程序(BootLoader和APP)

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/202868.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c++--类型行为控制

1.c的类 1.1.c的类关键点 c类型的关键点在于类存在继承。在此基础上&#xff0c;类存在构造&#xff0c;赋值&#xff0c;析构三类通用的关键行为。 类型提供了构造函数&#xff0c;赋值运算符&#xff0c;析构函数来让我们控制三类通用行为的具体表现。 为了清楚的说明类的构…

现代雷达车载应用——第2章 汽车雷达系统原理 2.1节

经典著作&#xff0c;值得一读&#xff0c;英文原版下载链接【免费】ModernRadarforAutomotiveApplications资源-CSDN文库。 2.1 基本雷达功能 雷达系统通过天线或天线阵列向空间辐射电磁能量。辐射的电磁能量“照亮”周围的目标。“被照亮”的目标拦截一些辐射能量&#xff0…

图片帧数超过300帧,调整后重新上传

发表公众号的时候&#xff0c;传了一些 GIF 格式的动图&#xff0c;但是提示&#xff1a;图片帧数超过300帧&#xff0c;调整后重新上传。怎么解决这个问题呢&#xff1f;GIF 格式的图片&#xff0c;是将多个图片保存在一起&#xff0c;并逐帧显示的&#xff0c;帧数越多&#…

[NAND Flash 2.2] NAND闪存及控制器的市场趋势 [2023]

依公知及经验整理&#xff0c;原创保护&#xff0c;禁止转载。 专栏 《深入理解NAND Flash》 <<<< 返回总目录 <<<< 一、NAND闪存市场分析 据欧洲知名半导体分析机构Yole发布的报告显示&#xff0c;2020年起&#xff0c;NAND闪存市场发展趋势保持稳定…

Redis中HyperLogLog的使用

目录 前言 HyperLogLog 前言 在学习HyperLogLog之前&#xff0c;我们需要先学习两个概念 UV&#xff1a;全称Unique Visitor&#xff0c;也叫独立访客量&#xff0c;是指通过互联网访问、浏览这个网页的自然人。1天内同一个用户多次访问该网站&#xff0c;只记录1次。PV&am…

二值图像分割统一项目

1. 项目文件介绍 本章为二值图像的分割任务做统一实现&#xff0c;下面是项目的实现目录 项目和文章绑定了&#xff0c;之前没用过&#xff0c;不知道行不行 data 文件夹下负责摆放数据的训练集测试集inference 负责放待推理的图片(支持多张图片预测分割)run_results 是网络训…

centos7 yum安装nginx

1.安装源 rpm -ivh http://nginx.org/packages/centos/5/noarch/RPMS/nginx-release-centos-5-0.el5.ngx.noarch.rpm 2.安装 (-y 的意思是自动yes) yum install nginx -y 3.查找安装到哪里了 whereis nginx 一般都是在 /etc/nginx下面 4.常用命令 检查配置文件是否正确 …

InnoDB的数据存储结构

一 数据库的存储结构&#xff1a;页 索引结构提供了高效的检索方式&#xff0c;不过索引信息和数据记录都是保存在文件上的&#xff0c;确切的说是存储在页结构中。另一方面&#xff0c;索引是在引擎中实现的&#xff0c;MySQL服务器上的存储引擎负责对表中数据的读取和写入。…

R语言学习

Part1阶段1&#xff1a;入门基础 1安装R和RStudio&#xff1a; 下载并安装R&#xff1a;https://cran.r-project.org/ 下载并安装RStudio&#xff1a;https://www.rstudio.com/products/rstudio/download/ 2Hello World&#xff1a; 学习如何在R中输出"Hello, World!"…

软考高项第四版五组十域表+ITTO背诵笔记及助记

基于第四版做的笔记&#xff0c;助记是自己编的 还是得靠理解记忆&#xff0c;下面是文档&#xff0c;也用anki制作了记忆卡片&#xff0c;需要的可以自行导入卡包

高德地图加载三维模型vue(.obj转.gltf)

官方glTF模型案例 obj2gltf 的开发文档 第一步&#xff1a;这里首先要将我们的.obj文件转换为.gltf文件 全局安装 npm install -g obj2gltf终端打开.obj文件所在的文件夹执行 obj2gltf -i model.obj -o model.gltf -t &#xff08;-i model.obj对应你的obj文件的名字&#x…

企业部署Windows活动目录有什么好处?

在一个现代化的企业中&#xff0c;高效、安全地管理公司的IT资源是至关重要的。Windows Active Directory&#xff08;活动目录&#xff09;是一个强大的功能&#xff0c;可以帮助企业实现集中管理用户、计算机、组策略和其他资源的目的。本文将探讨部署Windows AD域即活动目录…

【往届见刊检索速度hin OK】 第五届计算机工程与应用国际学术会议 (ICCEA 2024)

第五届计算机工程与应用国际学术会议 (ICCEA 2024) 2024 5th International Conference on Computer Engineering and Application 2024年4月12-14日 中国-杭州 计算机工程与应用在人工智能、大数据、云计算、物联网、网络安全等领域发挥着重要作用&#xff0c;随着科技日…

[NAND Flash 2.3] 闪存芯片国产进程

依公知及经验整理&#xff0c;原创保护&#xff0c;禁止转载。 专栏 《深入理解NAND Flash》 <<<< 返回总目录 <<<< 目录 前言1 闪存介质1.1 NOR 闪存国产技术发展1.2 NAND 闪存国产技术 2 闪存国产厂商与产品2.1 NOR FLASH 国产厂商与产品2.2 NAND FA…

深入Os--动态链接

1.动态链接库的使用 动态库支持以两种模式使用&#xff0c;一种模式下&#xff0c;在程序加载运行时&#xff0c;完成动态链接。一种模式下&#xff0c;在程序运行中&#xff0c;完成动态链接。 1.1.程序加载运行时完成动态链接 我们通过一个实例介绍程序加载运行时&#xff0c…

4G基站BBU、RRU、核心网设备

目录 前言 基站 核心网 信号传输 前言 移动运营商在建设4G基站的时候&#xff0c;除了建设一座铁塔之外&#xff0c;更重要的是建设搭载铁塔之上的移动通信设备&#xff0c;这篇博客主要介绍BBU&#xff0c;RRU以及机房的核心网等设备。 基站 一个基站有BBU&#xff0c;…

Liunx系统使用超详细(四)~文件/文本相关命令1

目录 一、mkdir命令 1.1基本语法 1.2常用示例 1.2.1创建目录 1.2.2创建多级目录 1.2.3设置权限 1.2.4递归修改权限 1.2.5显示帮助信息 二、touch命令 2.1基本语法 2.2常用示例 2.2.1创建新的空文件 2.2.2更新现有文件的访问和修改时间戳 2.2.3创建多个文件 2.2.…

【Midjourney实战】| 新年红包、元宝、灯笼、福袋生成

文章目录 1 红包生成2 灯笼生成3 福袋生成4 元宝生成 1 红包生成 之前我们生成了新年礼盒&#xff0c;这一期我们来生成一些过年时特有的元宝和红包 首先&#xff0c;最重要的是画面主体 red envelope&#xff08;红包&#xff09;颜色红色 黄色的 red and yellow 为了后期方…

跳水比赛(C++)

系列文章目录 进阶的卡莎C++_睡觉觉觉得的博客-CSDN博客数1的个数_睡觉觉觉得的博客-CSDN博客双精度浮点数的输入输出_睡觉觉觉得的博客-CSDN博客足球联赛积分_睡觉觉觉得的博客-CSDN博客大减价(一级)_睡觉觉觉得的博客-CSDN博客小写字母的判断_睡觉觉觉得的博客-CSDN博客纸币(…

Web漏洞分析-SQL注入XXE注入(下)

随着互联网的不断普及和Web应用的广泛应用&#xff0c;网络安全问题愈发引起广泛关注。在网络安全领域中&#xff0c;SQL注入和XXE注入是两个备受关注的话题&#xff0c;也是导致许多安全漏洞的主要原因之一。本博客将深入研究这两种常见的Web漏洞&#xff0c;带您探寻背后的原…