(超详细)STM32芯片Flash读写操作讲解和代码(寄存器版本)

这篇具有很好参考价值的文章主要介绍了(超详细)STM32芯片Flash读写操作讲解和代码(寄存器版本)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

关于Flash,官方的解释为:Flash为32位宽的存储单元,可用于存储代码和数据常量。Flash模块位于微控制器内存映射中的特定基址……。而对于我们来说,只要知道Flash闪存区是一个掉电后也不会清除的数据存储地。(相信大家对于Flash闪存也有着一定 的了解了,我也不多说废话,直接开整)

STM32芯片大致可分为小容量、中容量和大容量三种类型,在小容量和中容量系列芯片中一个扇区为1KB,在大容量系列芯片中一个扇区为2KB,为什么要说这个呢?因为Flash的擦除只能以一个扇区为最小单位擦除。因为代码也是存储在Flash区,所以各位在做项目时,最先就应该将内存分配好,我的建议是将Flash最后一个扇区用来做用户数据存储,我们甚至可以在keil配置好代码地址,这样就每次下载程序时也不会改变最后一个扇区的数据。

例:以STM32F103C6Tx的一款芯片为例(代码部分同),这个芯片拥有32KFlash存储器容量,算是小容量芯片。

(超详细)STM32芯片Flash读写操作讲解和代码(寄存器版本)

如果不设置,IROM1的地址应该为:0x8000000—0x8000,0x8000转换为十进制为32768,除以1024(1KB为1024bit),刚好为32K,减去最后一个扇区1KB,31KB转换为十六进制为0x7C00,设置后就如图所示,IROM1的地址为0x8000000—0x7C00,表示keil写入代码时将不会擦除0x7C00以后的空间,数据也会得以保存。

Flash读操作

因为嵌入式Flash模块可以直接寻址,因此读取操作十分简单,只需要找到读取的地址即可。

uint16_t Flash_Data;                          //存储数据
__IO uint16_t * flashPtr;                     //该指针用来存储Flash读写地址

首先需要定义一个指针,该指针主要用来存储Flash读写的地址,__IO uint16_t数据类型表示flashPtr是一个易变的无符号的大小为16位的指针。

flashPtr = (__IO uint16_t *) 0x08007C00;                  //指向数据地址
Flash_Data = *flashPtr;                                   //读取数据

两行代码就可以完成对Flash的读取,只是指针的简单运用,当然在实际项目中最好加上对提取数据的校验。

Flash写操作

写入Flash是一个相对复杂的过程,已经是在对STM芯片底层数据直接编程,废话不多说。Flash写入数据,大致可分为两个步骤,一是擦除数据、二是写入数据。在上代码前,我们先来了解几个会用到的Flash寄存器:

(超详细)STM32芯片Flash读写操作讲解和代码(寄存器版本)

首先是Flash控制寄存器(FLASH_CR),主要了解第0位PG写入控制位、第1位PER擦除控制位、第6位STRT擦除触发控制位和第7位LOCK解锁控制位,再此我不过多介绍,在文章末尾我会提供STM32F103Flash编辑手册,各位自行去阅读(配合手册去理解代码事半功倍)。

(超详细)STM32芯片Flash读写操作讲解和代码(寄存器版本)

其次是Flash状态寄存器(FLASH_SR),主要了解第5位EOP擦除/写入完成标志位,第0位BSYFlash擦除/写入状态位。

FPEC密钥寄存器(FLASH_KEYR),这个寄存器用来写入钥匙,Flash地址寄存器(FLASH_AR)用来写入扇区擦除的首地址。

这个是官方提供写入Flash的具体流程,每次写入前需要先判断FLASH_CR_LOCK位,当为1时可直接进行写入配置,当为0时需要先解锁才能写入配置(为什么要解锁呢?因为每次复位后FPEC(闪存编程和擦除控制器)都是被锁定的,只有解锁后才有权限),写入配置很简单只需要置位FLASH_CR_PG写入位,再把数据(16位)写入指定的地址,再检测是否写好,最后重新上锁。当然写入前需要先擦除,擦除也是同样的操作,接下来请看代码:

/*Flash解锁函数*/
void Flash_unlock(void) {
    if ((FLASH->CR & FLASH_CR_LOCK) != RESET) {            //判断LOCK位
        FLASH->KEYR = 0x45670123;
        FLASH->KEYR = 0xCDEF89AB; 
    /*若LOCK位不为1,则执行解锁程序,向Flash_KEYR寄存器写入解锁密钥,密钥是唯一的,
       一旦写错,就会锁死,只能复位后才能操作Flash*/        
     }
}
/*Flash写入函数*/
void putFlash(void) 

    Flash_unlock();                             //解锁                        
    SET_BIT(FLASH->CR, FLASH_CR_PER);           //置位扇区擦除控制位
    WRITE_REG(FLASH->AR, 0x08007C00);           //对应扇区起始地址
    SET_BIT(FLASH->CR, FLASH_CR_STRT);          //开始扇区清除
    while ((FLASH->SR & (FLASH_SR_BSY | FLASH_SR_EOP)) != 0x20)    //等待擦除完毕
         ;
     FLASH->SR |= FLASH_SR_EOP;                 //清除标志位
     FLASH->CR = 0x80;                          //重新上锁,擦除完成
                               
    Flash_unlock();                             //解锁
    flashPtr = (__IO uint16_t *) 0x08007C00;    //选择写入地址,只能是擦除的扇区内
    SET_BIT(FLASH->CR, FLASH_CR_PG);            //置位Flash写入控制位
     *flashPtr = Flash_Data;                    //写入数据到flashPrt地址对应空间中
     while ((FLASH->SR & (FLASH_SR_BSY | FLASH_SR_EOP)) != 0x20)  //等待写入完成
        ;
     FLASH->SR |= FLASH_SR_EOP;                 //清除标志位
     FLASH->CR = 0x80;                          //重新上锁
}

通过上面两个函数便可以完成对Flash的写入,当然为了方便大家理解,我代码写的很简单,到了真实项目中,我的代码只能作为你们的思路。

注意事项:

  1. Flash擦除/写入千万、千万、千万不要放到主程序while循环中,因为每一块芯片由于硬件的限制对于Flash的擦除/写入都是次数限制的,一旦用完这些擦除/写入次数,芯片就报废了,当然也不用太小心,一般这个限制次数都是10万次。

  1. Flash擦除/写入是一个比较严谨的过程,一旦出错将会导致整个程序的崩溃,所以希望大家多看看手册。

手册资料:

STM32F103XXFlash编辑手册:链接:https://pan.baidu.com/s/1IdWxsnysqhs6iWfW5oIhaQ

提取码:udbs文章来源地址https://www.toymoban.com/news/detail-418145.html

到了这里,关于(超详细)STM32芯片Flash读写操作讲解和代码(寄存器版本)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • stm32读写内部Flash

    因为我的stm32f407的内部flash是1M的所以块2不存在,但他的地址仍然存在,只是没有作用,这是stm32的整体框架。    一般我们说 STM32 内部 FLASH 的时候,都是指这个主存储器区域,它是存储用户应用程序的空间,芯片型号说明中的 1M FLASH、2M FLASH 都是指这个区域的大小。 主存储

    2024年02月01日
    浏览(32)
  • STM32 FLASH 读写数据

    2.1 修改代码后编译,会有提示信息 KEIL,计算出来代码总共 61076 Byte 2.2 如果什么都没有改,直接编译是没有这个提示信息的 0x08000000 是存放代码的起始地址,我们保存的数据要和代码分开,放在代码区域后面,所以后面加了个80000, 比keil 编译里面算出来的和要大将近2 万个

    2024年02月12日
    浏览(30)
  • STM32—Flash读写详解

    目录 前言 介绍 STM32 FLASH 闪存的编程和擦除 Flash读写的标准库函数 软件设计 FLASH的读取 直接读取某一地址的内容 读取选定位置的选定大小的内容 FLASH的写入 直接使用标准库写入 写入选定位置的选定大小的内容 如何在Keil 5中查看Flash某地址的内容 本文主要介绍STM32多种的内

    2024年02月09日
    浏览(37)
  • 【STM32 CubeMX】HAL库的本质读写寄存器

    在嵌入式系统开发中,HAL(Hardware Abstraction Layer)库是一个重要的概念,它提供了一个抽象层,使开发者可以更容易地编写可移植的代码,而不必担心底层硬件的细节。STM32CubeMX是一款由STMicroelectronics提供的工具,用于生成STM32微控制器的初始化代码,其中包括了HAL库的使用。

    2024年02月20日
    浏览(52)
  • 【STM32】读写BKP备份寄存器&RTC实时时钟

    目录 BKP BKP简介 BKP基本结构 BKP测试代码 RTC RTC简介 RTC框图 RTC基本结构 硬件电路 RTC操作注意事项 接线图 初始化 使用BKP解决只初始化一次时间  初始化参考代码 RTC设置时间 RTC读取时间 完整代码 MyRTC.c MyRTC.h main.c BKP(Backup Registers)备份寄存器 BKP可用于存储用户应用程序数据

    2024年04月22日
    浏览(46)
  • #stm32整理(一)flash读写

    参考资料正点原子和野火开发手册 stm32f4中文参考手册和datasheet Flash 接口可管理 CPU 通过 **AHB I-Code(指令指令总线) 和 D-Code (数据总线)**对 Flash 进行的访问。该接口可针对 Flash 执行擦除和编程操作,并实施读写保护机制。Flash 接口通过指令预取和缓存机制加速 代码执行。 关于

    2024年02月05日
    浏览(61)
  • stm32读写nand flash

    目前我在使用stm32f407ZGT6来读写三星的nand flash【K9F1G08U0E】。 板子我是在这里买的 【STM32F407ZGT6最小系统板/核心板/转接板/开发板/加128M FLASH】 他上面可以选装一个K9F1G08U0E。 针对这个nand flash,可以选择采用stm32的FSMC来进行读写。 stm32的程序我是stm32cubeide来编写的,感觉挺方便

    2024年02月11日
    浏览(38)
  • 基于STM32实现FLASH读写功能

    今天要学习的是flash读写,闪存(Flash Memory)是一种长寿命的非易失性(在断电情况下仍能保持所存储的数据信息)的存储器。用途SD卡、固态硬盘、芯片内存存储单元存储代码。 Flash 接口可管理 CPU 通过 AHB I-Code 和 D-Code 对 Flash 进行的访问。该接口可针对 Flash 执行擦除和编

    2024年02月11日
    浏览(39)
  • STM32 i2c读写寄存器地址8位,16位的方法

    一般常用的寄存器地址是8位的,遇到一个寄存器地址为16为的器件。总结一下代码编写。 寄存器地址16位的为SY103,寄存器地址为8位的为LT7911. 测试代码 lt7911该位置寄存器参考手册 sy103该位置寄存器参考手册 仿真测试 可以看到把值写入到相对应的寄存器内,并且读出。

    2024年01月19日
    浏览(60)
  • 【DRV8323】电机驱动芯片寄存器配置指南,通过STM32F407的SPI通信配置

    笔者计划使用一块使用到STM32F407控制芯片与DRV8323s驱动芯片的板子,驱动BLDC。了解到需要使用SPI通信来配置DRV8323s驱动芯片,配置过程中涉及DRV8323数据手册中提及的几个寄存器,故写此文做个记录。 另外,DRV8323芯片和DRV8302、DRV8303、DRV8353都有极大的相似之处,可以相互参考

    2024年02月02日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包