0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32学习笔记:读写内部Flash

GReq_mcu168 来源:玩转单片机 2019-11-26 14:32 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

一、介绍

首先我们需要了解一个内存映射:

stm32的flash地址起始于0x0800 0000,结束地址是0x0800 0000加上芯片实际的flash大小,不同的芯片flash大小不同。

RAM起始地址是0x2000 0000,结束地址是0x2000 0000加上芯片的RAM大小。不同的芯片RAM也不同。

Flash中的内容一般用来存储代码和一些定义为const的数据,断电不丢失,
RAM可以理解为内存,用来存储代码运行时的数据,变量等等。掉电数据丢失。

STM32将外设等都映射为地址的形式,对地址的操作就是对外设的操作。
stm32的外设地址从0x4000 0000开始,可以看到在库文件中,是通过基于0x4000 0000地址的偏移量来操作寄存器以及外设的。

一般情况下,程序文件是从 0x0800 0000 地址写入,这个是STM32开始执行的地方,0x0800 0004是STM32的中断向量表的起始地址。
在使用keil进行编写程序时,其编程地址的设置一般是这样的:

程序的写入地址从0x08000000(数好零的个数)开始的,其大小为0x80000也就是512K的空间,换句话说就是告诉编译器flash的空间是从0x08000000-0x08080000,RAM的地址从0x20000000开始,大小为0x10000也就是64K的RAM。这与STM32的内存地址映射关系是对应的。

M3复位后,从0x08000004取出复位中断的地址,并且跳转到复位中断程序,中断执行完之后会跳到我们的main函数,main函数里边一般是一个死循环,进去后就不会再退出,当有中断发生的时候,M3将PC指针强制跳转回中断向量表,然后根据中断源进入对应的中断函数,执行完中断函数之后,再次返回main函数中。大致的流程就是这样。

1.1、内部Flash的构成:

STM32F429 的内部 FLASH 包含主存储器、系统存储器、 OTP 区域以及选项字节区域,它们的地址分布及大小如下:

STM32F103的中容量内部 FLASH 包含主存储器、系统存储器、 OTP 区域以及选项字节区域,它们的地址分布及大小如下:

注意STM32F105VC的是有64K或128页x2K=256k字节的内置闪存存储器,用于存放程序和数据。

主存储器:一般我们说 STM32 内部 FLASH 的时候,都是指这个主存储器区域它是存储用户应用程序的空间,芯片型号说明中的 1M FLASH、 2M FLASH 都是指这个区域的大小。与其它 FLASH 一样,在写入数据前,要先按扇区擦除,

系统存储区:系统存储区是用户不能访问的区域,它在芯片出厂时已经固化了启动代码,它负责实现串口、 USB 以及 CAN 等 ISP 烧录功能。

OTP 区域:OTP(One Time Program),指的是只能写入一次的存储区域,容量为 512 字节,写入后数据就无法再更改, OTP 常用于存储应用程序的加密密钥。

选项字节:选项字节用于配置 FLASH 的读写保护、电源管理中的 BOR 级别、软件/硬件看门狗等功能,这部分共 32 字节。可以通过修改 FLASH 的选项控制寄存器修改。

1.2、对内部Flash的写入过程:

1. 解锁 (固定的KEY值)
(1) 往 Flash 密钥寄存器 FLASH_KEYR 中写入 KEY1 = 0x45670123
(2) 再往 Flash 密钥寄存器 FLASH_KEYR 中写入 KEY2 = 0xCDEF89AB
2. 数据操作位数
最大操作位数会影响擦除和写入的速度,其中 64 位宽度的操作除了配置寄存器位外,还需要在 Vpp 引脚外加一个 8-9V 的电压源,且其供电间不得超过一小时,否则 FLASH可能损坏,所以 64 位宽度的操作一般是在量产时对 FLASH 写入应用程序时才使用,大部分应用场合都是用 32 位的宽度。
3. 擦除扇区
在写入新的数据前,需要先擦除存储区域, STM32 提供了扇区擦除指令和整个FLASH 擦除(批量擦除)的指令,批量擦除指令仅针对主存储区。
扇区擦除的过程如下:
(1) 检查 FLASH_SR 寄存器中的“忙碌寄存器位 BSY”,以确认当前未执行任何
Flash 操作;
(2) 在 FLASH_CR 寄存器中,将“激活扇区擦除寄存器位 SER ”置 1,并设置“扇
区编号寄存器位 SNB”,选择要擦除的扇区;
(3) 将 FLASH_CR 寄存器中的“开始擦除寄存器位 STRT ”置 1,开始擦除;
(4) 等待 BSY 位被清零时,表示擦除完成。
4. 写入数据
擦除完毕后即可写入数据,写入数据的过程并不是仅仅使用指针向地址赋值,赋值前还还需要配置一系列的寄存器,步骤如下:
(1) 检查 FLASH_SR 中的 BSY 位,以确认当前未执行任何其它的内部 Flash 操作;
(2) 将 FLASH_CR 寄存器中的 “激活编程寄存器位 PG” 置 1;
(3) 针对所需存储器地址(主存储器块或 OTP 区域内)执行数据写入操作;
(4) 等待 BSY 位被清零时,表示写入完成。

1.3、查看工程内存的分布:

由于内部 FLASH 本身存储有程序数据,若不是有意删除某段程序代码,一般不应修改程序空间的内容,所以在使用内部 FLASH 存储其它数据前需要了解哪一些空间已经写入了程序代码,存储了程序代码的扇区都不应作任何修改。通过查询应用程序编译时产生的“ *.map”后缀文件,
打开 map 文件后,查看文件最后部分的区域,可以看到一段以“ Memory Map of the
image”开头的记录(若找不到可用查找功能定位),

【注】ROM加载空间

这一段是某工程的 ROM 存储器分布映像,在 STM32 芯片中, ROM 区域的内容就是 指存储到内部 FLASH 的代码。
在上面 map 文件的描述中,我们了解到加载及执行空间的基地址(Base)都是0x08000000,它正好是 STM32 内部 FLASH 的首地址,即 STM32 的程序存储空间就直接是执行空间;它们的大小(Size)分别为 0x00000b50 及 0x00000b3c,执行空间的 ROM 比较小的原因就是因为部分 RW-data 类型的变量被拷贝到 RAM 空间了;它们的最大空间(Max)均为 0x00100000,即 1M 字节,它指的是内部 FLASH 的最大空间。

计算程序占用的空间时,需要使用加载区域的大小进行计算,本例子中应用程序使用
的内部 FLASH 是从 0x08000000 至(0x08000000+0x00000b50)地址的空间区域。
所以从扇区 1(地址 0x08004000)后的存储空间都可以作其它用途,使用这些存储空间时不会篡改应用程序空间的数据。
具体可参考原子的例程:实验四十一:FLASH 模拟 EEPROM 实验

文章引用地址:https://blog.csdn.net/qq_33559992/article/details/77676716

感谢原文作者

二、代码拆分介绍(以STM32F105系列为例,如上图表5所示)

2.1 读/写入数据流程

写数据流程

2.1.1、Flash 解锁,直接调用#include "stm32f10x_flash.h"中的void FLASH_Unlock(void)函数,这个函数是官方提供的

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    31

    文章

    5622

    浏览量

    130574
  • FlaSh
    +关注

    关注

    10

    文章

    1761

    浏览量

    156053
  • STM32
    +关注

    关注

    2313

    文章

    11205

    浏览量

    375108

原文标题:STM32学习笔记:读写内部Flash(附代码)

文章出处:【微信号:mcu168,微信公众号:硬件攻城狮】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    CS32L010F8的flash擦除,读写操作

    求CS32L010F8的flash擦除,读写操作参考例程,自己写的一直不能用,不知道哪出问题了,谢谢啦
    发表于 04-25 22:34

    NOR Flash和NAND flash有什么区别

    在嵌入式系统、移动设备与存储领域,NOR Flash和NAND Flash是两种最常见的非易失性存储技术。尽管它们都属于闪存(Flash EEPROM)家族,但在内部结构、接口方式、
    的头像 发表于 03-11 15:08 812次阅读
    NOR <b class='flag-5'>Flash</b>和NAND <b class='flag-5'>flash</b>有什么区别

    LAT1180+STM32L4R9 的 QuadSPI Flash 通讯速率不理想应用笔记

    客户反应 STM32L4R9 同 QSPI Flash 通讯,测出来的读取速率为 10MB/s, 和理论值相差较大。按照客户的时钟配置和 STM32L4R9 的数据手册中的数据,OSPI 读数速率为 10MB/s肯定存在问题。
    发表于 01-11 17:30 0次下载

    LAT1198+通过 KEIL 制作 QSPI 接口的外部 Flash 下载算法应用笔记

    时,需要将代码或数据烧录到外部 Flash。如果调试工具不能够一键烧录,势必会给调试带来诸多的麻烦。本文以 STM32H750 芯片为例,介绍通过 KEIL制作 QSPI 接口的外部 Flash 下载算法的方法。
    发表于 01-11 17:25 0次下载

    AN2606_STM32单片机系统内存启动方式应用笔记

    自举程序存储在STM32器件的内部自举ROM(系统存储器)中,由ST在生产期间进行编程。其主要任务是通过一种可用的串行外设(如USART、CAN、USB、I 2C)将应用程序下载到内部Flas
    发表于 01-08 14:49 0次下载

    【干货分享】瑞萨RA6E2地奇星开发板Flash读写与OLED显示实战

    本次测评基于瑞萨RA6E2地奇星开发板,验证其内部CodeFlash与DataFlash的读写功能稳定性与可靠性,测试Flash擦除、写入、读取及数据验证的全流程可行性,为后续嵌入式项目存储方案提供参考依据。
    的头像 发表于 12-16 08:08 1321次阅读
    【干货分享】瑞萨RA6E2地奇星开发板<b class='flag-5'>Flash</b><b class='flag-5'>读写</b>与OLED显示实战

    【原创】【RA4M2-SENSOR开发板评测】内部flash读写测试

    编译好后下载至开发板中,按下K3按键,观察有效果如下 由此可以说明内部flash读写测试正常。 至此,本次测评也就完成了。 keil完整工程如下:*附件:RA4M2_Sensor.7z
    发表于 12-06 18:32

    华邦高性能NOR Flash用于学习平板

    华邦电子(Winbond)的NOR Flash以其卓越性能成为学习平板理想的存储解决方案。其芯片内执行(XIP)特性可实现系统秒级快速启动,高可靠性确保固件和核心代码安全,低功耗特性则有效延长设备续航,为流畅稳定的学习体验奠定坚
    的头像 发表于 11-10 09:48 740次阅读
    华邦高性能NOR <b class='flag-5'>Flash</b>用于<b class='flag-5'>学习</b>平板

    studio有没有通过更改下载算法,同时下载到内部flash和外部flash

    我现在使用的stm32h750,内部flash很小,需要使用外部qspiflash来储存程序。 studio可以像mdk一样设置两个下载算法吗? 这样才能一个程序使用两个flash不用
    发表于 09-26 07:04

    STM32C011开发(3)----Flash操作

    STM32C011 系列微控制器内置 Flash 存储器,支持程序存储与数据保存,具备页面擦除、双字写入、读写保护等功能。本文将简要介绍 STM32C011 的
    的头像 发表于 09-18 16:48 5401次阅读
    <b class='flag-5'>STM32</b>C011开发(3)----<b class='flag-5'>Flash</b>操作

    【RA4M2-SENSOR】读写Code Flash

    的 code flash大小为512Kb 添加flash的stack 进行配置 这里只进行读写code flash的实验,需要enable Code
    发表于 09-14 10:39

    SPI NOR FLASH是什么,与SPI NAND Flash的区别

    SPI NOR FLASH是什么?   SPI NOR FLASH是一种非易失性存储器,它通过串行接口进行数据传输,具有读写速度快、可靠性高、体积小等优点。它采用类似SRAM的存储方式,每个存储单元
    的头像 发表于 08-21 09:26 1984次阅读

    请问STM32内部Flash操作是不是优先级最高?

    STM32内部Flash操作是不是优先级最高?目前在内部Flash的单独一页存储了数据,发现在进行页擦除的时候正常工作的定时器中断无法进入
    发表于 08-13 07:03

    求助,关于STM32F407的flash读写问题求解

    目前flash模拟EEPROM是参考的官方的flash读写代码,但C语言中attribute ((at())绝对定位的应用 网上的一段代码如下 1、定位到flash中,一般用于固化的信
    发表于 07-18 07:14

    第二十九章 读写内部FLASH

    本文介绍了W55MH32内部FLASH,其含主存储、系统存储等,可存储代码及掉电保存数据。读写需解锁、擦除页等步骤,标准库提供相关函数。还展示了擦除编程测试及模拟EEPROM读写的实验
    的头像 发表于 06-20 14:09 1426次阅读
    第二十九章 <b class='flag-5'>读写</b><b class='flag-5'>内部</b><b class='flag-5'>FLASH</b>