stm32f4内部的flash

stm32芯片内部有一个flash存储器,主要用于存储编译之后烧录进来的代码,由于flash存储器的内容在掉电之后不会丢失,芯片重新上电复位之后内核可以从内部flash中加载代码并运行。

除了使用外部的工具(如下载器)读写内部FLASH外,STM32F4芯片在运行的时候,也能对自身的内部FLASH进行读写,因此,若内部FLASH存储了应用程序后还有剩余空间,我们可以把它像外部SPI-FLASH那样利用起来,存储一些程序运行时产生的需要掉电保存的数据。

由于访问内部FLASH比外部SPI-FLASH的速度快的多,所以在紧急状态下常常会使用内部FLASH存储关键记录;为了防止应用程序被抄袭,有的应用会禁止读写内部FLASH中的内容,或者在第一次运行时计算机机密信息并记录到某些区域,然后删除自身的部分加密代码,这些都涉及到内部FLASH的操作。

芯片内部存储的分区

主存储器

  • 介绍芯片时提到的flash的内存的大小都是指主存储器的大小,用于存放代码和数据常量(例如const类型的数据)。
  • 主存储器分为256页,每页大小2KB,一共512KB。这个分页就是FLASH的存储扇区,与其他的FLASH一样,写入数据前要先按照页就是扇区进行擦除。
  • stm32f4的主存储器分为4个 16KB 扇区、1个 64KB 扇区和 7个 128KB 扇区
  • stm32的型号:STM32F4ZG

    • G代表FLASH的大小

      4表示16KB; 6表示32KB; 8表示64KB; B表示128KB

      C表示256KB; E表示512KB; F表示768KB; G表示1024KB

  • 闪存存储器接口寄存器

    • 用于控制闪存读写,是整个闪存模块的控制机构
    • 在执行闪存写操作时,任何对闪存的读操作都是锁住总线,在写操作完成后,读操作才能正确进行;也就是说在进行写或者擦除操作时,不能进行数据或者代码的读取操作
  • 内部FLASH写入过程

    1. 解锁
      由于内部FLASH空间主要存储的是应用程序。是非常关键的数据,为了防止误操作修改了这些内容,芯片复位后默认会给 FLASH 上锁,这个时候不再允许设置 FLASH 的控制寄存器,同时也不能修改 FLASH 中的内容。

      所以对 FLASH 写入程序之前,需要先对其进行解锁操作。

      • 往 FLASH 密钥寄存器 FLASH_KEYR 中写入 KEY1=0x45670123
      • 再往 FLASH 密钥寄存器 FLASH_KEYR 中写入 KEY2=0xCDEF89AB
    2. 擦除扇区

      在写入新的数据前,需要先擦除存储区域,STM32提供了扇区擦除指令整个FLASH擦除——批量擦除的指令,批量擦除指令仅针对主存储区。

      扇区擦除的过程

      • 检查FLASH_SR状态寄存器的 “忙碌寄存器BSY” ,以确认当前未执行任何FLASH操作
      • 在FLASH_CR寄存器中,将 “激活页擦除寄存器位PER” 置1
      • 用FLASH_AR寄存器选择要擦除的页
        将FLASH_CR控制寄存器中的 “开始擦除寄存器位STRT” 置1,开始擦除
      • 等待BSY位被清零,表示擦除完成
    3. 写入数据

      擦除完毕后即可写入数据,写入数据的过程并不是仅仅使用指针指向地址赋值,赋值前还需要配置一系列的寄存器

      • 检查FLASH_SR状态寄存器中的BSY位,以确认当前未执行任何其他的内部FLASH操作
      • 将FLASH_CR控制寄存器中 “激活编程寄存器位PG” 置1
      • 向指定的FLASH存储器地址执行数据写入操作,每次只能以16位的方式写入
      • 等待BSY位被清零时,表示写入成功
    4. 查看工程的空间分布

      由于内部FLASH本身存储有程序数据,若不是有意删除某段程序代码,一般不应该修改程序空间的内容,所以在使用内部FLASH存储其他数据前需要了解哪一些空间已经写入了程序代码,存储了程序代码的扇区都不应做任何的修改。通过查询应用程序编译时产生的 “*.map” 后缀文件,可以了解程序存储到了哪些区域。

  1. 系统存储器

    系统存储器是STM32开发板出厂之前就已经使用的一块区域,用户是无法访问系统存储区的,主要是做串口下载程序的支持,以及USB、CAN等ISP烧录功能。(系统存储器主要是用来存放STM32F4的bootloader代码,此代码是出厂的时候就固化在STM32F4里面的,专门来给主存储器下载代码的)

  2. OTP区域

    一次性可编程区域,共528字节,被分成两部分,前面512个字节(32字节为1块,分成16块),可以用来存储一些用户数据(一次性的,写完一次,永远不可以擦除)后面16个字节,用于锁定对应块。

  3. 选项字节区域

    选项字节区域是用来配置FLASH的读写保护、待机/停机、软件/硬件看门狗功能。可以通过修改FLASH的选项控制寄存器进行修改。

鼎新图蓝牙使用

  1. 波特率,置低波特率为9600,置高为115200,其他波特率值只能用AT设置
  2. 密码,置低密码方式1=8888,置高默认密码0000
  3. 主从模式,置低为从设备,置高为主设备
  4. 距离class级别切换,置低class1设备,置高为class2设备
  5. 拨码有效,置低pio按键无效,置高有效
  6. 清零,置高保持5秒再置低
    • 数据模式置高5秒再复位-启动清零=模块做清楚地址码并重新搜索工作。
    • AT模式置高5秒再复位-启动清零+恢复=模块做彻底清零并恢复到出厂设置,并重新启动。
  7. 主机切换连接至从机2,至低-时为当前从机,至高+为切换至另一个
  8. AT/数据模式切换,置低数据模式,AT无效,置高AT状态,红灯亮起

绿灯常亮为成功配对,若要清零,把5或8,和6一起置高,等五秒再置低
淘宝网站