IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32基于HAL库的读写FLASH -> 正文阅读

[嵌入式]STM32基于HAL库的读写FLASH

目录

FLASH简介

?读写基本步骤


FLASH简介

FLASH,也就是闪存,在stm32里通常被用来放程序代码,而剩余的空间就可以被用户手动去读和写。

基于STM32F103ZET6 正点原子的大容量产品,512K的FLASH,共256页,每页2K,比起以前用过的51不知道高了多少倍。

以下摘抄自正点原子团队的文档

?STM32 的闪存模块由:主存储器、信息块和闪存存储器接口寄存器等 3 部分组成。
主存储器,该部分用来存放代码和数据常数(如 const 类型的数据)。对于大容量产品,其
被划分为 256 页,每页 2K 字节。注意,小容量和中容量产品则每页只有 1K 字节。从上图可以
看出主存储器的起始地址就是 0X08000000, B0、 B1 都接 GND 的时候,就是从 0X08000000
开始运行代码的。
信息块,该部分分为 2 个小部分,其中启动程序代码,是用来存储 ST 自带的启动程序,
用于串口下载代码,当 B0 接 V3.3, B1 接 GND 的时候,运行的就是这部分代码。用户选择字
节,则一般用于配置写保护、读保护等功能,本章不作介绍。
闪存存储器接口寄存器,该部分用于控制闪存读写等,是整个闪存模块的控制机构。
对主存储器和信息块的写入由内嵌的闪存编程/擦除控制器(FPEC)管理;编程与擦除的高电
压由内部产生。
在执行闪存写操作时,任何对闪存的读操作都会锁住总线,在写操作完成后读操作才能正
确地进行;

既在进行写或擦除操作时,不能进行代码或数据的读取操作。

?读写基本步骤

?需要搞清楚两件事

  • 关于读:闪存的512M都支持直接寻址,读可以直接通过地址引用返回数据。
  • 关于写:写之前必须要判断所在页是否擦除,未擦除则擦除所在页,然后才能写入数据;若以擦除则直接写入数据。?

分开来看

?擦除页

?步骤:

?检查 FLASH_CR 的 LOCK 是否解锁,如果没有则先解锁
? 检查 FLASH_SR 寄存器的 BSY 位,以确认没有其他正在进行的闪存操作
? 设置 FLASH_CR 寄存器的 PER 位为’ 1’
? 用 FLASH_AR 寄存器选择要擦除的页
? 设置 FLASH_CR 寄存器的 STRT 位为’ 1’
? 等待 BSY 位变为’ 0’
? 读出被擦除的页并做验证

写FLASH

?步骤

? 检查 FLASH_CR 的 LOCK 是否解锁,如果没有则先解锁
? 检查 FLASH_SR 寄存器的 BSY 位,以确认没有其他正在进行的编程操作
? 设置 FLASH_CR 寄存器的 PG 位为’ 1’
? 在指定的地址写入要编程的半字
? 等待 BSY 位变为’ 0’
? 读出写入的地址并验证数据
?

如常见的写一个16位的数据的例子:

        HAL_FLASH_Unlock(); //FLASH解锁
            FLASH_PageErase(FLASH_READ_FLAG); //擦除页
			FLASH_WaitForLastOperation(FLASH_WAITETIME);            	//等待上次操作完成
			CLEAR_BIT(FLASH->CR, FLASH_CR_PER);		//清除标记
            HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD,FLASH_READ_FLAG,temp);//temp为写的一个数据,写一个字(32位)数据,若是一个半字则写半字16位     
            HAL_FLASH_Lock();//上锁

常见的使用场景:要求系统的某个变量初始化值是xxx,接受发送给它的命令让它修改某值,修改后把值写入Flash,系统再次开机则能保留上次命令修改的值,里面关于判断系统是否是第一次启动。

例如以下代码:(其中的几个函数是原子哥封装的函数)

void StartReadFlashInit(void){
    
    
    u16 temp=STMFLASH_ReadHalfWord(FLASH_READ_FLAG); //读取一个16位数
    printf("ReadNum:%d\r\n",temp);
    //默认初始化 概率是1/65535
    if(temp!=858){
        temp=858;
    
            
       
       //STMFLASH_Write,这个函数写一个数据就等价于以下    
            HAL_FLASH_Unlock(); //FLASH解锁
            FLASH_PageErase(FLASH_READ_FLAG); //擦除页
			FLASH_WaitForLastOperation(FLASH_WAITETIME);            	//等待上次操作完成
			CLEAR_BIT(FLASH->CR, FLASH_CR_PER);		//清除标记
            HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD,FLASH_READ_FLAG,temp);//写一个字(32位)数据,若是一个半字则写半字16位     
            HAL_FLASH_Lock();//上锁
            //   STMFLASH_Write(FLASH_READ_FLAG,&temp,1);//写入一个字   
 
        
        
            delay_ms(2);
         STMFLASH_Write(FLASH_SAVE_ADDR,FlashArr,FLASHLENGTH);  //第一次启动为初始化,把FlashArr写进Flash
            printf("Read Flash init\r\n");
    }
            STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)FlashArr,FLASHLENGTH);//从Flash中读出数据并赋值到FlashArr
            delay_ms(2);
     
}

基本思路是:

在设定的的非代码区读出一个数(16位 半字),若这个数不等于你设定的一个数(自己随意设,不要设0XFFFF,因为默认擦除后的数据是0XFFFF? ?),则写你设定的数到非代码区,这样就保证这是系统的第一次,以后读取则每次都会对到这个数。这样也就保证了系统仅仅初始化了一次,

关于一次性从某一个FLASH地址写一个数组和一次性读一个数组可以参考原子哥的代码。

stm32f103精英开发板 — 正点原子资料下载中心 1.0.0 文档 (openedv.com)

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-09-30 01:07:48  更:2022-09-30 01:09:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 17:44:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码