STM32-Flash闪存

简介

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

读写Flash的用途

1.利用程序存储器的剩余空间来保存掉电不丢失的用户数据。

2.通过在程序中变成(IPA),实现程序的自我更新。

在线编程(ICP)用于更新程序存储器的全部内容,通过JTAG、SWD协议或系统加载程序(Bootloader)下载程序,例如ST-LINK使用SWD协议进行下载程序,每次下载都是将整个程序都覆盖掉。

在程序中编程(IAP)可以使用微控制器支持的任意一种通信接口下载程序。自己写一个Bootloader,放在程序更新时不会覆盖的地方,需要更新程序时,控制程序跳转到自己写的Bootloader中,再进行接收任意一种通信接口传过来的数据,就是待更新的程序,再控制Flash读写把收到的程序写到程序正常运行的地方,写完后控制程序跳转回去或者直接复位。

  • 闪存只能1写0不能0写1
  • 写入前必须擦除
  • 必须以最小单位进行擦除
  • 擦除后数据全为1
  • 擦除后需要等待忙

存储器映像

 闪存模块组织

每页大小为1k

 Flash基本结构

Flash解锁

FPEC共有三个键值

         RDPRT键=0x000000A5

        KEY1=0x45670123

        KEY2=0xCDEF89AB

解锁:

        复位后,FPEC被保护,不能写入FLASH_CR

        在FLASH_KEYR先写入KEY1,再写入KEY2,解锁

        错误的操作序列会在下次复位前锁死FPEC和FLASH_CR

加锁:

        设置FLASH_CR中的LOCK位锁住FPEC和FLASH_CR

使用指针访问存储器

先指定地址,地址可进行加减。然后进行强制类型转换,再解引用。

__IO  对应C语言关键字 volatile,防止编译器优化。或者防止缓存数据不同步问题。

读取不需要解锁。

写数据需要提前解锁。

程序存储器页编程流程图

写入

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

STM32的闪存在写入之前会检查指定地址有没有擦除,如果没有擦除就写入STM32不执行写入操作,除非写入的数据全是0。

 页擦除

 闪存全擦除

解锁过程:在KEYR寄存器,先写入KEY1,在写入KEY2。

选项字节

RDP:写入RDPRT键(0x000000A5)后解除读保护。

USER:选择看门狗事件和进入停机/待机模式是否产生复位。

Data0/1:用户可自定义。

WRP0/1/2/3: 配置写保护,每一个位对应保护4个存储页(中容量)。

n字母开头为对应数据的反码。

选项字节擦除
  • 检查FLASH_SR的BSY位,以确认没有其他正在进行的编程操作
  • 解锁FLASH_CR的OPTWRE位
  • 设置FLASH_CR的OPTPG位为1
  • 写入要编程的半字到指定的地址
  • 等待BSY位变为0
  • 读出写入的地址并验证数据
选项字节编程
  • 检查FLASH_SR的BSY位,以确认没有其他正在进行的编程操作
  • 解锁FLASH_CR的OPTWRE位
  • 设置FLASH_CR的OPTPG位为1
  • 写入要编程的半字到指定的地址
  • 等待BSY位变为0
  • 读出写入的地址并验证数据

器件电子签名

  flash代码

//FLASH读取一个32位的字
uint32_t MyFLASH_ReadWord(uint32_t Address)
{return *((__IO uint32_t *)(Address));	//使用指针访问指定地址下的数据并返回
}//函    数:FLASH读取一个16位的半字
uint16_t MyFLASH_ReadHalfWord(uint32_t Address)
{return *((__IO uint16_t *)(Address));	//使用指针访问指定地址下的数据并返回
}// 函    数:FLASH读取一个8位的字节
uint8_t MyFLASH_ReadByte(uint32_t Address)
{return *((__IO uint8_t *)(Address));	//使用指针访问指定地址下的数据并返回
}//FLASH全擦除
void MyFLASH_EraseAllPages(void)
{FLASH_Unlock();					//解锁FLASH_EraseAllPages();			//全擦除FLASH_Lock();					//加锁
}//FLASH页擦除
void MyFLASH_ErasePage(uint32_t PageAddress)
{FLASH_Unlock();					//解锁FLASH_ErasePage(PageAddress);	//页擦除FLASH_Lock();					//加锁
}//FLASH编程字
void MyFLASH_ProgramWord(uint32_t Address, uint32_t Data)
{FLASH_Unlock();							//解锁FLASH_ProgramWord(Address, Data);		//编程字FLASH_Lock();							//加锁
}//FLASH编程半字
void MyFLASH_ProgramHalfWord(uint32_t Address, uint16_t Data)
{FLASH_Unlock();							//解锁FLASH_ProgramHalfWord(Address, Data);	//编程半字FLASH_Lock();							//加锁
}

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

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

相关文章

2024 年 AI 辅助研发趋势将更加强调智能化、自动化和个性化

目录 前言 AI辅助研发的技术进展 行业应用案例 医药行业 汽车行业 电子行业 面临的挑战与机遇 技术挑战 伦理问题 数据安全 机遇和解决方案 未来趋势预测 1. 深度融合AI与研发流程 2. 智能研发平台的崛起 3. 强化AI与人类智慧的融合 前言 当谈到人工智能&#xff…

Oracle 写丢失保护/影子表空间(Lost Write Protection with Shadow Tablespace)

写丢失是Oracle数据库与独立I/O子系统交互时一种错误场景。假如Oracle发出的写磁盘命令,I/O子系统也返回成功写磁盘的消息(但数据此时可能依然在I/O系统缓存中),如果在I/O系统实际写盘之前Oracle再次读取该数据,则I/O系…

JavaScript 权威指南第七版(GPT 重译)(五)

第十二章:迭代器和生成器 可迭代对象及其相关的迭代器是 ES6 的一个特性,在本书中我们已经多次见到。数组(包括 TypedArrays)、字符串以及 Set 和 Map 对象都是可迭代的。这意味着这些数据结构的内容可以被迭代——使用for/of循环…

ARM中断实验

key_inc.c #include"key_inc.h"void key1_it_config(){//使能GPIOF外设时钟RCC->MP_AHB4ENSETR | (0x1<<5);//将PF9设置为输入模式GPIOF->MODER & (~(0x3<<18));//设置由PF9管脚产生EXTI9事件EXTI->EXTICR3 & (~(0XFF<<8));EXTI-…

jQuery 事件

文章目录 1. jQuery 事件注册单个事件注册 2. jQuery 事件处理2.1 on() 绑定事件(1) on() 方法优势1(2) on() 方法优势2(3) on() 方法优势3*案例--发布微博 2.2 off() 解绑事件2.3 one() 只触发事件一次2.4 自动触发事件 3. jQuery 事件对象 1. jQuery 事件注册 单个事件注册 …

【MySQL】MySQL用户管理

文章目录 一、用户1.用户信息2.创建用户3.删除用户4.修改用户密码 二、数据库的权限1.给用户授权2.回收权限 一、用户 如果我们只能使用root用户&#xff0c;这样存在安全隐患。这时&#xff0c;就需要使用MySQL的用户管理。 1.用户信息 我们安装mysql之后&#xff0c;会自动…

MySQL的进阶使用方法

【前言】 view 直接对某张表的操作&#xff0c;就是在对数据库系统的逻辑模型层的操作。但让所有用户都看到整个逻辑模型是不合适的。出于安全的考虑&#xff0c;如会隐藏某个属性。这时就需要这种‘虚表’&#xff0c;它向用户透露一部分的数据&#xff0c;它不属于逻辑模…

Cookie和Session登录注册案例

文章目录 一、需求说明![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/f29467ed6b7f4de7a568004ad50de591.png)二、用户登录1、Dao层代码2、Service层代码3、Web层代码 三、记住用户四、用户注册五、展示验证码 一、需求说明 二、用户登录 1、Dao层代码 UserMapp…

__builtin_choose_expr内置函数使用

__builtin_choose_expr 是 GCC 编译器的内置函数&#xff0c;它允许在编译时根据条件表达式的值选择两个表达式其中之一。其语法结构如下&#xff1a; __builtin_choose_expr(constant_expression, expression1, expression2) 这个内置函数根据第一个参数 constant_expressio…

鸿蒙Harmony应用开发—ArkTS-全局UI方法(时间滑动选择器弹窗)

以24小时的时间区间创建时间滑动选择器&#xff0c;展示在弹窗上。 说明&#xff1a; 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 本模块功能依赖UI的执行上下文&#xff0c;不可在UI上下文不明确的地方使用&…

苹果计划与谷歌合作使用Gemini AI技术,提升iPhone功能,同时探索与OpenAI合作可能性

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

机器学习_正则化

文章目录 代价函数 如果我们有非常多的特征&#xff0c;我们通过学习得到的假设可能能够非常好地适应训练集&#xff08;代价函数可能几乎为 0&#xff09;&#xff0c;但是可能会不能推广到新的数据。 下图是一个回归问题的例子&#xff1a; 第一个模型是一个线性模型&#xf…

Windows下使用openssh连接服务器的错误

前言 我在windows中使用openssh连接服务器时候发生了错误&#xff0c;无法连接上 C:\Users\Administrator>ssh roots4.v100.vip -p 11004WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be …

关于RestController发送请求用List<T> 接收数据

1、发送get请求时&#xff0c;后端可用List<T>来接收参数&#xff0c;前端或者其他请求可通过逗号分割参数即可&#xff1b;同时注意特殊字符转换&#xff0c;如日期格式 接收方&#xff08;后端&#xff09;&#xff1a; ApiOperation(value "手动计算扩缩容&quo…

JDBC.

0. 相关知识 在一个接口或类中获取下一个接口或类的对象 0.0 jar包是什么&#xff1f; 别人写好的一些类&#xff0c;然后对这些类进行了打包就形成了&#xff1a;jar包。你可以将这些jar包导入你的项目中&#xff0c;然后就可以直接使用这些jar包中的类和属性以及方法。 0…

js复制内容到剪贴板实现复制粘贴功能

js复制内容到剪贴板实现复制粘贴功能第一种方法&#xff0c;用到 clipboard.js 插件 clipboard 版本是1.5.12&#xff0c;cdn地址如下&#xff1a; <script srchttps://cdn.jsdelivr.net/clipboard.js/1.5.12/clipboard.min.js></script> 情况一&#xff1a;复制…

[python]bar_chart_race设置日期格式

1、设置日期标签的时间格式 # 设置日期格式&#xff0c;默认为%Y-%m-%dbcr.bar_chart_race(df, covid19_horiz.gif, period_fmt%b %-d, %Y) 2、更改日期标签为数值 # 设置日期标签为数值bcr.bar_chart_race(df.reset_index(dropTrue), covid19_horiz.gif, interpolate_period…

#Linux(VMwareTOOL安装)

&#xff08;一&#xff09;发行版&#xff1a;Ubuntu16.04.7 &#xff08;二&#xff09;记录&#xff1a; &#xff08;1&#xff09; &#xff08;2&#xff09;打开虚拟机然后安装&#xff0c;出现灰色可能是已经安装过但是自己没有找到 &#xff08;3&#xff09;删除VM…

三份天注定,七分靠XX?

文 | 螳螂观察 作者 | 陈小江 1988年&#xff0c;中国宝岛台湾&#xff0c;蒋经国过世后&#xff0c;社会运动风起云涌。在所谓“解严”的时代氛围里&#xff0c;人们对前途虽然迷茫&#xff0c;但却充满打拼的热情。 那时节&#xff0c;40岁的台湾歌手叶启田&#xff0c;开…

用 Delphi 做 FTP 服务器以及如何配置防火墙

使用 Delphi 的 TIdFTPServer 这个控件&#xff0c;做一个 FTP 服务器很简单。可以直接拿官方提供的 FTP Server 的那个 Demo 程序来修改。 本文主要描述如何配置服务器端防火墙 网络环境&#xff1a; 1. 客户端在路由器后面&#xff0c;局域网&#xff1b; 2. 服务器端在路…