flash���������������,Flash读写

FLASH简单的读、写操作

主存储器是以页为单位划分的。stm32根据FLASH主存储块容量、页面的不同,系统存储器的不同,分为小容量、中容量、大容量、互联型,共四类产品。

在这里插入图片描述

主存储块用于保存具体的程序代码和用户数据。起始地址0x08000000,b0和b1接GND从这里开始执行程序。信息块用于负责由stm32出厂时放置2KB的启动程序(BootLoader)和512B的用户配置信息区。启动程序代码,是用来存储 ST 自带的启动程序,b0接3.3v,b1接GND运行的就是这部分代码 ,用作串口下载代码。闪存存储器接口寄存器,该部分用于控制闪存读写等,是整个闪存模块的控制机构 。在执行闪存写操作时,任何对闪存的读操作都会锁住总线,在写操作完成后读操作才能正确地进行;既在进行写或擦除操作时,不能进行代码或数据的读取操作。对主存储器和信息块的写入由内嵌的闪存编程/擦除控制器(FPEC)管理 。 ​ 操作流程(详见STM32F1 开发指南(精英板-库函数版) ) 检查 FLASH_CR 的 LOCK 是否解锁,如果没有则先解锁检查 FLASH_SR 寄存器的 BSY 位,以确认没有其他正在进行的闪存操作设置 FLASH_CR 寄存器的 PER 位为’ 1’用 FLASH_AR 寄存器选择要擦除的页设置 FLASH_CR 寄存器的 STRT 位为’ 1’等待 BSY 位变为’ 0’读出被擦除的页并做验证 库函数级的操作流程 确定要写入Flash的首地址(稍后介绍确定地址的方法)解锁Flash对Flash进行操作(写入数据)对Flash重新上锁

要想选定安全的Flash地址进行读写,可以根据自己的STM32 MCU型号,查找数据手册,确定FLASH的地址区段,因为起始段会存储代码,所以一定要避开起始段,以避免数据错误。(我一般是根据Flash大小计算Flash的最末尾地址,往前推一段地址空间,在这里一般不会对代码中的数据产生覆盖等影响)这里采用的是STM32F103(大容量产品)写入的首地址为0x0807F800;

添加STM32 flash底层固件库文件stm32f10x_flash.c

编写自己的Flash驱动库文件,如下

Flash.h #ifndef __FLASH_H#define __FLASH_H #include "sys.h" void FLASH_W(u32 add,u16 dat);u16 FLASH_R(u32 add);#endif Flash.c #include "flash.h"//FLASH写入数据void FLASH_W(u32 add,u16 dat){ //参数1:32位FLASH地址。参数2:16位数据// RCC_HSICmd(ENABLE); //打开HSI时钟 FLASH_Unlock();//解锁FLASH编程擦除控制器 FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);//清除标志位 FLASH_ErasePage(add); //擦除指定地址页 FLASH_ProgramHalfWord(add,dat); //从指定页的addr地址开始写 FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);//清除标志位 FLASH_Lock();//锁定FLASH编程擦除控制器}//FLASH读出数据u16 FLASH_R(u32 add){ //参数1:32位读出FLASH地址。返回值:16位数据u16 a;a = *(u16*)(add);//从指定页的addr地址开始读return a;} main.c #include "stm32f10x.h" //STM32头文件#include "sys.h"#include "delay.h"#include "led.h"#include "key.h" #include "flash.h" #define FLASH_START_ADDR0x0807F800//写入的起始地址int main (void){//主程序u8 key;u16 a; //定义变量//初始化程序RCC_Configuration(); //时钟设置LED_Init();//LED初始化KEY_Init();//按键初始化a = FLASH_R(FLASH_START_ADDR);//从指定页的地址读FLASH//GPIO_Write(LEDPORT,a); //直接数值操作将变量值写入LED(LED在GPIOB组的PB0和PB1上)//主循环while(1){key = KEY_Scan(0);if(key == WK_UP_PRES){a++;if(a>1)a=0;FLASH_W(FLASH_START_ADDR,a);}else{delay_ms(10);}LED0=a;}} Flash操作注意事项: 操作一定要先擦后写每页是1024个地址,起始地址0x08000000擦除操作以页为单位,写操作必须以16位宽度为单位,允许跨页写入。STM32内置Flash擦或写时,必须打开外部/内部高速振荡器。Flash可最多擦写10万次,不可死循环擦写。擦写时要避开用户程序存储的区域,否则会擦掉用户程序导致错误。擦除一页要10ms(对于1k大小的一页),比较慢,而且不能单个字节的擦写。
Adobe Flash Player End of LifeFlash Player 2022 - Microsoft Edge Addonsflash播放器免费下载_Flash播放器最新版 - 系统之家adobe flash player所有版本-flash插件下载-flash player播放 …Flash游戏中心_网页游戏_热门端游_flash小游戏_手机游戏[下載] Flash Player v32.0.0.465 繁體中文最終 …安装国外版Adobe Flash Player - 腾讯云开发者社区-腾讯云Flash读写_小Caicai的博客-CSDN博客_flash读写Flash 保存计划RISC-V单片机快速入门05-串口助手发送AT指令启动TCP ServerArch Linux/其他 Linux 下给 Link2/LPC-Link2 调试器刷 CMSIS-DAP 和 J-Link 固件flash+php多文件上传 (内含源文件)FPGA芯片APA150及其应用HTML5期末大作业:在线电影网站设计——我不是药神电影介绍(4页) HTML+CSS+JavaScript 大二实训大作业HTML...jz2440 linux内核编译,从零开始构建bootloader(基于韦东山JZ2440V3开发板)Flash课件在网球教学中的运用研究基于Flash的土木工程测量多媒体软件研制基于Flash的网络课程与教学平台的交互设计S3C6410 烧写u-boot 内核 根文件系统 遇到的问题 及总结ESP32 基础篇:ESP-IDF 编程指南【浅谈初中物理实验教学资源的利用】 学好初中物理的小技巧STM32使用CMSIS-DAP下载zephyr生成文件FLASH+JAVA开发实时网络游戏论文研究-基于Eclipse插件平台体系的flash创作集成开发环境 .pdfphp深入浅出图片上传On Comparisons of Expected Performance Between Two Worst-case Optimal Floating Codes in Flash ...Python中Template使用的一个小技巧ESP-IDF 编程指南C++(BCB)解析XML文件的一个例子基于ARM9E的启动程序设计与实现网站实时行情S9S08DZ60AC,S9S08DZ60AC pdf中文资料,S9S08DZ60AC引脚图,S9S08DZ60AC电路-Datasheet-电子工程世界android 手电筒 代码nodeMCU固件云编译没有esp32的版本从零开始构建bootloader(基于韦东山JZ2440V3开发板)STM32F7x6培训_系统架构,,FLASH,RCC,PWR.pdflinux环境下BDI3000固件程序更新论文研究-U盘数据恢复的研究与实现 .pdf论文研究-关于冷备份RC串联电路设计的研究 .pdf
活动图片排版王源超清壁纸情绪在学前儿童心理发展中的作用国宴三兄弟完整视频正能量应用下载怎么把文档转换成视频永不言弃作文600字爱奇艺免费看电视剧使命背景音乐朗诵水胶体敷料在哪能买到地球有多少岁