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 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> cubemx STM32的FLASH内存读写 -> 正文阅读

[嵌入式]cubemx STM32的FLASH内存读写

cubemx STM32的FLASH内存读写

Flash是用于存储数据的存储器。
STM32系列的命名规则
请添加图片描述
Flash内部结构组织
请添加图片描述
将一个存储器划分为多个(扇区、块)区域,更方便的编程管理这些存储单元。不同类型存储器的划分方式不同,有的以页为最小单元,有的以扇区为最小单元,但大部分都以扇区为最小单元。
页(Page)< 扇区(Sector) < 块(Block)< 芯片(Chip)


Flash存储器中一种区域划分的单元,好比一本书中一页(其中包含N个字)。
扇区
扇区和页类似,也是一种存储结构单元,只是扇区更常见,大部分Flash主要还是以扇区为最小的单元。

比扇区更高一个等级,一般1块包含多个扇区。

小容量产品是指闪存存储器容量在16K至32K字节之间的STM32F101xx、STM32F102xx 和STM32F103xx微控制器。
中容量产品是指闪存存储器容量在64K至128K字节之间的STM32F101xx、STM32F102xx 和STM32F103xx微控制器。
大容量产品是指闪存存储器容量在256K 至 512K 字节之间的STM32F101xx 和 STM32F103xx微控制器。

按照不同容量,存储器组织成32个1K字节/页(小容量)、128个1K字节/页(中容量)、256个2K字 节/页(大容量)的主存储器块和一个信息块
请添加图片描述
请添加图片描述
请添加图片描述
无论用什么型号的STM32芯片对FLASH的操作只有4步
1.解锁FLASH
2.擦除FLASH
3.写入数据到FLASH
4.锁住FLASH

特别注意的是 FLASH读取数据直接读取相应的FLASH地址即可
要想选定安全的Flash地址进行读写,可以根据自己的STM32 MCU型号,查找数据手册,确定FLASH的地址区段,因为起始段会存储代码,所以一定要避开起始段,以避免数据错误。

对于CUBEMX的界面操作就是基本的创建就可以了,对于FLASH操作主要是在代码中进行操作。
请添加图片描述

请添加图片描述
打开串口以便观察数据是否正确,打开DMA请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
串口编写(串口不是重点,所以在这里只是简单的介绍)
请添加图片描述
请添加图片描述
我用的是STM32F103RB属于中容量,我将数据写入0x0801fc00是最末尾的扇区防止与代码冲突导致不必要的错误。

/* USER CODE BEGIN PTD */
uint32_t writeFlashData = 0x12345678;     //写入的数据内容
uint32_t addr = 0x0801fc00;          //写入的起始位置
/* USER CODE END PTD */

/* USER CODE BEGIN 0 */
//FLASH写入数据测试
void writeFlashTest(void)
{
 //1、解锁FLASH
  HAL_FLASH_Unlock();
 
 //2、擦除FLASH
 //初始化FLASH_EraseInitTypeDef
 FLASH_EraseInitTypeDef f;
 f.TypeErase = FLASH_TYPEERASE_PAGES;//页擦除
 f.PageAddress = addr;								//擦除地址
 f.NbPages = 1;										//擦除页数
 //设置PageError
 uint32_t PageError = 0;		//设置PageError,如果出现错误这个变量会被设置为出错的FLASH地址
 //调用擦除函数
 HAL_FLASHEx_Erase(&f, &PageError);

 //3、对FLASH烧写
 HAL_FLASH_Program(TYPEPROGRAM_WORD, addr, writeFlashData);
 
 //4、锁住FLASH
  HAL_FLASH_Lock();
}

//FLASH读取数据测试
void printFlashTest(void)
{
  uint32_t temp = *(__IO uint32_t*)(addr);   //寻址操作,读取addr为起始位置的值
 printf("addr:0x%x, data:0x%x\r\n", addr, temp);    //打印出该位置的值
}

/* USER CODE BEGIN WHILE */
  writeFlashTest();
  printFlashTest();
  HAL_Delay(5000);
/* USER CODE END WHILE */

/* USER CODE END 0 */

请添加图片描述
可以看到我内存的数据被改写成自己的数据
请添加图片描述
可以清晰的看到我代码储存起始位置和给代码分配的储存空间,只要不放在这个位置基本上是没问题的.
请添加图片描述

1、Flash解锁、锁定函数
void FLASH_Unlock(void);    //解锁函数:在对Flash操作之前必须解锁
void FLASH_Lock(void);      //锁定函数:同理,操作完Flash之后必须重新上锁

2、Flash写操作函数
FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data);             //32位字写入函数
FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data);         //16位半字写入函数
FLASH_Status FLASH_ProgramOptionByteData(uint32_t Address, uint8_t Data);    //用户选择字节写入函数

3、Flash擦除函数
FLASH_Status FLASH_ErasePage(uint32_t Page_Address);
FLASH_Status FLASH_EraseAllPages(void);
FLASH_Status FLASH_EraseOptionBytes(void);

4、获取Flash状态
FLASH_Status FLASH_GetStatus(void);

typedef enum {
    FLASH_BUSY = 1,       //忙
    FLASH_ERROR_PG,       //编程错误
    FLASH_ERROR_WRP,      //写保护错误
    FLASH_COMPLETE,       //操作完成
    FLASH_TIMEOUT         //操作超时
}FLASH_Status;

5、等待操作完成函数
FLASH_Status FLASH_WaitForLastOperation(uint32_t Timeout);

*(__IO uint32_t*)(addr)   --addr为内存的地址

主要使用的结构体
typedef struct
{
uint32_t TypeErase; //页擦除和块擦除
uint32_t Banks; //选择擦除的bank区域
uint32_t Page; //擦除的起始页
uint32_t NbPages; //要擦除的页数
} FLASH_EraseInitTypeDef;

擦除
FLASH_TYPEERASE_PAGES按页擦除
FLASH_TYPEERASE_MASSERASE MASSERASE
烧写
FLASH_TYPEPROGRAM_DOUBLEWORD 单次8个字节的方式
FLASH_TYPEPROGRAM_FAST 单次32行8个字节的方式
FLASH_TYPEPROGRAM_FAST_AND_LAST 单次32行8个字节的方式

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-11-23 12:31:43  更:2021-11-23 12:33:56 
 
开发: 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年11日历 -2024/11/26 10:24:50-

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