STM32 FLASH 简单读写操作【有代码】
【举报再看养成习惯,噢 不对,点赞再看 养成习惯。感谢支持】
STM32的Flash操作分为读写:读写。
一、读操作
读取比较简单,直接指针解引用地址就可以读取。注意一下读取的单位即可
/*************************************************************
** Function name: STMFLASH_ReadWord
** Descriptions: 读操作
** Input parameters: 要读取的地址
** Output parameters: None
** Returned value: None
** Remarks: None
*************************************************************/
uint32_t STMFLASH_ReadWord(uint32_t faddr)
{return *(uint32_t*)faddr;
}/*************************************************************
** Function name: STMFLASH_Read
** Descriptions: 连续读取操作
** Input parameters: NumToRead 要读取的数据个数,单位为uint32
** Output parameters: None
** Returned value: None
** Remarks: None
*************************************************************/
void STMFLASH_Read(uint32_t ReadAddr, uint32_t *pBuffer, uint32_t NumToRead)
{uint32_t i;for(i = 0; i < NumToRead; i++){pBuffer[i]=STMFLASH_ReadWord(ReadAddr); //读取4个字节.ReadAddr+=4; //偏移4个字节. }
}
二、写操作
注意事项:写操作之前需要先对扇区进行擦除,以STM32G030F6举例,打开JFlash可以看到芯片的具体分区,2K为一个扇区,一共16个扇区。
所以之后我们擦除的时候每次就要擦除2K数据。接下来看代码
// G030F6P6 Flash共计32K 16个扇区 计划使用后后两个扇区,即4K存储数据 ,单次最小擦除2K数据?有待确定#define FLASH_SECTOR14_START 0x08007000
#define FLASH_SECTOR14_END 0x080077FF
#define FLASH_SECTOR15_START 0x08007800
#define FLASH_SECTOR15_END 0x08007FFF#define FLASH_DATA_ADDR_MIN FLASH_SECTOR14_START
#define FLASH_DATA_ADDR_MAX FLASH_SECTOR15_END#define FLASH_DATA_ADDR_BASE FLASH_DATA_ADDR_MIN
#define CALIBRATION_L_LR_VALUE_ADDR FLASH_DATA_ADDR_BASE+0
#define CALIBRATION_L_UD_VALUE_ADDR FLASH_DATA_ADDR_BASE+12
#define CALIBRATION_R_LR_VALUE_ADDR FLASH_DATA_ADDR_BASE+24
#define CALIBRATION_R_UD_VALUE_ADDR FLASH_DATA_ADDR_BASE+36
#define FLASH_WAITETIME 1000// bind addr长度为5字节 实际占用2个uint32
#define BIND_MSG_BASE FLASH_SECTOR15_START
#define BIND_ADDR BIND_MSG_BASE+0/*************************************************************
** Function name: STM32G0_GetFlashSector
** Descriptions: 获取G030芯片中addr所在的扇区
** Input parameters: None
** Output parameters: None
** Returned value: None
** Remarks: None
*************************************************************/
uint8_t STM32G0_GetFlashSector(uint32_t addr){if (addr >= FLASH_SECTOR14_START && addr <= FLASH_SECTOR14_END){return 14;}else if (addr >= FLASH_SECTOR15_START && addr <= FLASH_SECTOR15_END){return 15;}return 16;
}/*************************************************************
** Function name: STMFLASH_Write
** Descriptions: STM32写操作
** Input parameters: pBuffer 传入需要存储的指针、 NumToWrite 需要写入的字节数量/8(单次最少写入双字大小 8字节)
** Output parameters: None
** Returned value: None
** Remarks: None
*************************************************************/
void STMFLASH_Write(uint32_t WriteAddr, uint32_t *pBuffer, uint32_t NumToWrite)
{ FLASH_EraseInitTypeDef FlashEraseInit;HAL_StatusTypeDef FlashStatus = HAL_OK;uint32_t PageError = 0;uint32_t addrx = 0;uint32_t endaddr = 0; if(WriteAddr < FLASH_DATA_ADDR_MIN || WriteAddr % 4) return; //非法地址 禁止写入的范围HAL_FLASH_Unlock(); //解锁 addrx = WriteAddr; //写入的起始地址endaddr = WriteAddr + NumToWrite * 8; //写入的结束地址if(addrx < FLASH_DATA_ADDR_MAX){while(addrx < endaddr) //扫清一切障碍.(对非FFFFFFFF的地方,先擦除){ if(STMFLASH_ReadWord(addrx)!=0XFFFFFFFF) //有非0XFFFFFFFF的地方,要擦除这个扇区{ FlashEraseInit.TypeErase = FLASH_TYPEERASE_PAGES; //擦除类型,页擦除 FlashEraseInit.Page = STM32G0_GetFlashSector(addrx); //从哪页开始擦除FlashEraseInit.NbPages = 1; //一次只擦除一页SEGGER_RTT_printf(0,"Flash Erase page is %d\r\n",FlashEraseInit.Page);if(HAL_FLASHEx_Erase(&FlashEraseInit, &PageError) != HAL_OK) {SEGGER_RTT_printf(0,"Flash Erase err\r\n");break; //发生错误了 }FLASH_WaitForLastOperation(FLASH_WAITETIME); //等待上次操作完成}else {addrx += 4;}}}FlashStatus = FLASH_WaitForLastOperation(FLASH_WAITETIME); //等待上次操作完成if(FlashStatus == HAL_OK){while(WriteAddr < endaddr) //写数据{if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, WriteAddr, *(uint64_t*)pBuffer) != HAL_OK)//写入数据{break; //写入异常}WriteAddr += 8; //地址加8pBuffer += 2; //buff传进来的是32位的,所以这里+2 便是8个字节} SEGGER_RTT_printf(0,"Flash write ok\r\n");}FLASH_WaitForLastOperation(FLASH_WAITETIME); //等待上次操作完成HAL_FLASH_Lock(); //上锁
}
STM32G0_GetFlashSector函数可以获取输入地址在芯片的那个扇区,需要根据具体的芯片信息来更改。
STMFLASH_Write函数主要注意存储数据大小,函数注释中写了。要根据不同的芯片的Program函数来更改。
注意这里贴出的函数只能进行一些简单的存储操作,如果往同一个扇区的不同地方写入数据,第一次会写入成功,第二次会失败。函数中下图圈起来的地方应该检测要写入的扇区所有的地址才对,这里只检测了起始地址到结束地址的数据。如果写入数据在同一个扇区,但是不在同一个位置就会出现BUG。写入失败
STM32 FLASH 简单读写操作【有代码】相关推荐
- pythonjson中list操作_Python中json的简单读写操作
Python中json的简单读写操作 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的 ...
- NAND FLASH的读写操作(硬件原理图分析)
转载:NAND FLASH的读操作及原理 硬件原理 上面是我使用的NAND FLASH的硬件原理图,面对这些引脚,很难明白他们是什么含义,下面直接引用韦东山老师的课程中的提问: NAND FLASH是 ...
- 华大单片机HC32L136X单片机flash数据读写操作使用
此款单片机是由有64K的字节flash,一共有128页,一页有512字节,以下是容量划分: 这里使用的是字节位宽的数据读写操作进行演示,其他2种方式大同小异,需要用到自己去研究,首先需要添加对应的fl ...
- QCC300x笔记(5) -- 外部Flash的读写操作
哈喽大家好,这是该系列博文的第五篇~ 篇~ <<[系列博文索引]快速通道 > 1. QCC300X 外部Flash的读写 QCC300x是使用外部Flash片子 ...
- STM32 进阶教程 13 – FLASH的读写操作
前言 在嵌入式应用开发中,经常会遇到掉电后还要保存的信息,这些信息通常只能保存在外部的一些存储芯片中,如外部flash,外部EEPROM, 其实这些信息同样可以保存在STM32自带的内部flash中, ...
- 基于STM32实现W25Q16读写操作(spi)
文章目录 前言 一.W25Q16 1.介绍 2.SPI 2.1. 简介 2.2. 特性 2.3. 功能说明 2.4. 工作模式 2.5. 引脚说明 二.代码开发 1.SPI初始化 2.读取厂商ID 2 ...
- Excel简单读写操作
Excel的程序集来自与Excel,所以如果在C#中遇到自己不懂的东西,不妨打开Excel的VBA工具,录制宏然后查看其中的操作代码.虽然好多的功能都通过import特征引入到C#中,但是深层的属性和 ...
- SQLite数据库的简单读写操作
安卓系统自带SQLite数据库,SDK中对SQLite的操作由SQLiteDatabase完成,涉及到的类有如下几个: 1.SQLiteDatabase:代表数据库本身,支持对数据的标准SQL操作 2 ...
- EasyExcel java实现excel简单读写操作(快速上手,复制粘贴即可)
EasyExcel是一个基于Java的简单.省内存的读写Excel的开源项目. https://github.com/alibaba/easyexcel 一.导入maven坐标 Lombok可选,不导 ...
最新文章
- 计算机技术的演进过程
- linux expr命令
- Mac下制作Ubuntu的启动U盘
- C | 看看 C 能做什么
- 网络编程t-io介绍
- Posterino for Mac(图片拼贴编辑器)
- form表单上传文件
- Linux下如何禁止某个用户登录方法
- dataframe 根据条件查找_python – 在pandas DataFrame中查找(仅)满足给定条件的第一行...
- 基于SECS协议开发的简明教程(1)
- Debian/Ubuntu系统命令终端提示无法定位软件包解决方法
- JVM(4)-MAT: 支配树 Dominator Tree
- iOS 升级HTTPS配置ATS-----(1)------
- 云服务器aip,云服务器API接口-云服务器的使用
- 一阶线性微分方程计算公式推导
- ORACLE创建一个‘数据库’
- c语言习题---(if语句)
- Qt Creator 中使用VLD检测内存泄漏
- 电动车充电软件测试,电动车充电用哪个app好?6款充电app评测
- java 1m几个字节_1m等于多少kb - 巍巍的个人页面 - OSCHINA - 中文开源技术交流社区...