前言

做项目时有时候需要对一些数据进行掉电可存储,一般来说可以把这些数据存储到到EEPROM或FLASH,这次项目中我使用到的芯片是STM32F051C8T6,只有64KB的FLASH,没有EEPROM。这个时候就需要考虑FLASH的读写操作。

STM32CubeMX

什么是STM32CubeMX?

STM32CubeMX是以HAL库为基础,进行上层的硬件和软件框架设计的图形化软件配置工具,使用图形化向导生成C初始化代码,可以根据设计生成硬件管脚定义及软件BSP工程包,支持IAR-ARM、MDK-ARM、Ac6等IDE开发环境。

下载地址点击这里。

这次项目使用的是STM32F051+STM32CubeMX+keil 5开发。

FLASH读写流程

首先简要写一下FLASH的读写流程

  • 对FLASH写入数据
  1. 解锁FLASH
  2. 擦除FLASH
  3. 写入数据到FLASH
  4. 锁住FLASH
  • FLASH读取数据
    直接读取相应的FLASH地址即可

这是我使用STM32CubeMX的HAL FLASH库的流程,其他STM32库可能有所差异,但是肯定有解锁擦除写入上锁这几个步骤的。

FLASH读写代码示例

下面放上代码清单和测试流程

uint32_t writeFlashData = 0x55555555;
uint32_t addr = 0x08007000;//FLASH写入数据测试
void writeFlashTest(void)
{//1、解锁FLASHHAL_FLASH_Unlock();//2、擦除FLASH//初始化FLASH_EraseInitTypeDefFLASH_EraseInitTypeDef f;f.TypeErase = FLASH_TYPEERASE_PAGES;f.PageAddress = addr;f.NbPages = 1;//设置PageErroruint32_t PageError = 0;//调用擦除函数HAL_FLASHEx_Erase(&f, &PageError);//3、对FLASH烧写HAL_FLASH_Program(TYPEPROGRAM_WORD, addr, writeFlashData);//4、锁住FLASHHAL_FLASH_Lock();
}//FLASH读取数据测试
void printFlashTest(void)
{uint32_t temp = *(__IO uint32_t*)(addr);printf("addr:0x%x, data:0x%x\r\n", addr, temp);
}

之后在主函数里添加下面测试流程:

void main(void)
{//flash TESTwriteFlashData = 0x55555555;writeFlashTest();printFlashTest();writeFlashData = 0xaaaaaaaa;writeFlashTest();printFlashTest();while(1);
}

设置好串口,打印

addr:0x8007000, data:0x55555555
addr:0x8007000, data:0xaaaaaaaa

成功!

其中比较特殊的是擦除步骤,需要定义个FLASH_EraseInitTypeDef的数据,FLASH_EraseInitTypeDef有三个成员:TypeErasePageAddressNbPages

其中,TypeErase有两个选项,页擦除和块擦除:

#define FLASH_TYPEERASE_PAGES     ((uint32_t)0x00)  /*!<Pages erase only*/
#define FLASH_TYPEERASE_MASSERASE ((uint32_t)0x01)  /*!<Flash mass erase activation*/

PageAddress是设置FLASH地址,这里为0x8007000;

NbPages为擦除页数(块数),这里为1;

另外还需要定义一个uint32_t变量——PageError,如果出现错误这个变量会被设置为出错的FLASH地址。

关于0x8007000

0x8007000是STM32的一个内存映射地址,其指向FLASH memory,如图:

这个地址也要考虑芯片的FLASH大小,比如我这次用的芯片FLASH大小是64KB,0x0801 0000-0x0800 0000=0x10000,正好等于64KB。

在《STM32F05x参考手册》中,我选的0x8007000是这么一个位置,是FLASH地址的最后一块扇区的起始位置。

如果使用上面的示例代码读写FLASH不成功,也请考虑一下FLASH的大小和地址设置。


【STM32】使用STM32cubeMX的库读写FLASH数据相关推荐

  1. STM32F103配合STM32CubeMX实现SPI读写flash

    本人采用的是正点原子的精英STM32F103开发板,其包含一块W25Q128型号的flash芯片.该flash与STM32F103的SPI2相连. 下面根据正点原子提供的开发指南文档,实现FreeRT ...

  2. STM32使用stm32cubemx LL库系列教程

    使用stn32cubemx配置LL库例程 STM32LL库系列教程--LL库工程配置流程 STM32LL库系列教程[一]--安装CubeMx软件 STM32LL库系列教程[二]--点亮LED小灯 ST ...

  3. arduino使用SPIFlash库 读写Flash芯片

    SPIFlash库 – SPI华邦电子闪存Flash芯片arduino库 GITHUB 工程地址:SPIFlash 该库是用于华邦串行闪存芯片的库.目前的形式支持识别闪存芯片和它的各种功能:自动地址分 ...

  4. STM32CubeMX HAL库串口+DMA数据发送不定长度数据接收

    参考资料:1.ST HAL库官网资料 2.https://blog.csdn.net/u014470361/article/details/79206352#comments 一.STM32CubeM ...

  5. 使用STM32CUBEMX HAL库读写SD卡

    SD 卡系统(包括主机和 SD 卡)定义了两种操作模式: 卡识别模式 数据传输模式 在系统复位后,主机处于卡识别模式,寻找总线上可用的 SD卡设备:同时,SD 卡也处于卡 识别模式,直到被主机识别到. ...

  6. STM32调试问题:无法读写 AT24C256 数据

    最近做的一个项目,不定时记录下调试过程中遇到的问题 1. 问题描述 硬件:使用STM32F407ZGT6的IIC1 PB8.PB9读写 EEPROM 24C256 软件:基于原子的标准例程 实验24 ...

  7. stm32中spi可以随便接吗_STM32的SPI模式读写FLASH芯片全面讲解

    例程完整代码: SPI协议简介 SPI协议,即串行外围设备接口,是一种告诉全双工的通信总线,它被广泛地使用在ADC,LCD等设备与MCU间通信的场合. SPI信号线 SPI包含4条总线,分别为SS,S ...

  8. 《STM32从零开始学习历程》——SPI读写FLASH

    <STM32从零开始学习历程>@EnzoReventon SPI读写FLASH 相关链接: SPI物理层及FLASH芯片介绍 SPI协议层 SPI特性及架构 参考资料: [野火EmbedF ...

  9. STM32笔记(十二)---SPI读写FLASH

    SPI读写FLASH 文章目录 SPI读写FLASH 一.SPI协议简介 1.1 SPI 物理层 1.2 协议层 1.2.1 SPI 基本通讯过程 1.2.2 通讯的起始和停止信号 1.2.3 数据有 ...

最新文章

  1. http://blog.csdn.net/lovejavaydj/article/details/6
  2. Windows 11 小技巧- winget安装和维护应用程序
  3. 为什么我切换到React Native来创建超级简单的底页
  4. Redmi Note 10 Pro发布 首发价1499元起
  5. 分库分表学习总结(4)——分布式事务常见应用场景总结
  6. Qualitative and Quantitative
  7. linux怎样自制库_苹果开源Swift System,增加Linux支持
  8. [转载] Python 内置函数 lambda、filter、map、reduce
  9. python飞机大战源码素材包_python实现飞机大战微信小游戏
  10. 【MacOS】必备的常用快捷键
  11. linux上网络配置不生效的怪异现象处理
  12. Linux系统时钟同步
  13. 伽罗华域(Galois Field,GF,有限域)乘法运算
  14. 【tensorflow 读取图片方式】本地文件名读取以及url方式读取
  15. 微擎支付返回商户单号_微信刷脸支付流程是怎么样的?
  16. 五子棋游戏程序设计制作(C语言)
  17. 螺旋传动设计系统lisp_螺旋传动设计
  18. oracle查询当前时间前10分钟到当前时间的数据
  19. R语言对大文件excel按行分解。
  20. 自已开发IM有那么难吗?手把手教你自撸一个Andriod版简易IM (有源码)

热门文章

  1. 机械手组装调试系列教程(一)——开题篇
  2. 公司内部邮箱服务器发送邮件 java版
  3. Android 多进程同时打开相机
  4. Unity DOTS系统概览
  5. Kafka对Java程序员有多重要?连阿里都再用它处理亿万级数据统计
  6. mysql2004报错_mysqlbinlog备份时候报错Sanity check failed
  7. 桌面一直出现计算机符号,电脑桌面图标有箭头怎么办 电脑桌面图片箭头去掉方法【图文】...
  8. [Python3] 超级码力在线编程大赛初赛 第2场 题解
  9. 0.前端简历编写和面试前准备
  10. 掩码认证消息(MAM)详细介绍