【举报再看养成习惯,噢 不对,点赞再看 养成习惯。感谢支持】

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 简单读写操作【有代码】相关推荐

  1. pythonjson中list操作_Python中json的简单读写操作

    Python中json的简单读写操作 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的 ...

  2. NAND FLASH的读写操作(硬件原理图分析)

    转载:NAND FLASH的读操作及原理 硬件原理 上面是我使用的NAND FLASH的硬件原理图,面对这些引脚,很难明白他们是什么含义,下面直接引用韦东山老师的课程中的提问: NAND FLASH是 ...

  3. 华大单片机HC32L136X单片机flash数据读写操作使用

    此款单片机是由有64K的字节flash,一共有128页,一页有512字节,以下是容量划分: 这里使用的是字节位宽的数据读写操作进行演示,其他2种方式大同小异,需要用到自己去研究,首先需要添加对应的fl ...

  4. QCC300x笔记(5) -- 外部Flash的读写操作

    哈喽大家好,这是该系列博文的第五篇~ 篇~ <<[系列博文索引]快速通道 > 1.    QCC300X 外部Flash的读写         QCC300x是使用外部Flash片子 ...

  5. STM32 进阶教程 13 – FLASH的读写操作

    前言 在嵌入式应用开发中,经常会遇到掉电后还要保存的信息,这些信息通常只能保存在外部的一些存储芯片中,如外部flash,外部EEPROM, 其实这些信息同样可以保存在STM32自带的内部flash中, ...

  6. 基于STM32实现W25Q16读写操作(spi)

    文章目录 前言 一.W25Q16 1.介绍 2.SPI 2.1. 简介 2.2. 特性 2.3. 功能说明 2.4. 工作模式 2.5. 引脚说明 二.代码开发 1.SPI初始化 2.读取厂商ID 2 ...

  7. Excel简单读写操作

    Excel的程序集来自与Excel,所以如果在C#中遇到自己不懂的东西,不妨打开Excel的VBA工具,录制宏然后查看其中的操作代码.虽然好多的功能都通过import特征引入到C#中,但是深层的属性和 ...

  8. SQLite数据库的简单读写操作

    安卓系统自带SQLite数据库,SDK中对SQLite的操作由SQLiteDatabase完成,涉及到的类有如下几个: 1.SQLiteDatabase:代表数据库本身,支持对数据的标准SQL操作 2 ...

  9. EasyExcel java实现excel简单读写操作(快速上手,复制粘贴即可)

    EasyExcel是一个基于Java的简单.省内存的读写Excel的开源项目. https://github.com/alibaba/easyexcel 一.导入maven坐标 Lombok可选,不导 ...

最新文章

  1. 计算机技术的演进过程
  2. linux expr命令
  3. Mac下制作Ubuntu的启动U盘
  4. C | 看看 C 能做什么
  5. 网络编程t-io介绍
  6. Posterino for Mac(图片拼贴编辑器)
  7. form表单上传文件
  8. Linux下如何禁止某个用户登录方法
  9. dataframe 根据条件查找_python – 在pandas DataFrame中查找(仅)满足给定条件的第一行...
  10. 基于SECS协议开发的简明教程(1)
  11. Debian/Ubuntu系统命令终端提示无法定位软件包解决方法
  12. JVM(4)-MAT: 支配树 Dominator Tree
  13. iOS 升级HTTPS配置ATS-----(1)------
  14. 云服务器aip,云服务器API接口-云服务器的使用
  15. 一阶线性微分方程计算公式推导
  16. ORACLE创建一个‘数据库’
  17. c语言习题---(if语句)
  18. Qt Creator 中使用VLD检测内存泄漏
  19. 电动车充电软件测试,电动车充电用哪个app好?6款充电app评测
  20. java 1m几个字节_1m等于多少kb - 巍巍的个人页面 - OSCHINA - 中文开源技术交流社区...

热门文章

  1. 【计算机网络】链路层
  2. CH9121网线超100米无法连接
  3. linux下tcp滑动窗口大小设置,转:TCP滑动窗口协议与socket缓冲区之间的关系
  4. @Autowired,@Resource和@Referrence的区别
  5. 查看MySQL数据库字符
  6. 网页的一个页面中显示另一个页面
  7. Xilinx ISE 14.7 设置编辑器字体大小
  8. 关于Redis监控及缓存相关问题
  9. 视频剪辑软件Vegas音频编辑的使用教程
  10. MT9V034摄像头的调试经验