STM32的Flash读写

文章目录

    • 简介
    • 存储器
    • STM32的Flash和SRAM
    • 与Flash相关的函数
      • flash 擦除函数
      • flash写入函数
      • flash读取函数
      • flash解锁函数
      • flash加锁函数
    • boot作用

简介

在STM32芯片内有一个Flash存储器,主要用于存储代码,我们先在电脑上编写程序代码,然后通过下载器把代码烧录到芯片中,这里我们烧录进去的代码其实就是烧录到了Flash中,Flash存储器有一个特点,就是在芯片断电后,里面的数据不会丢失,在重新上电后内核可以从Flash中加载代码并运行。

访问内部Flash的数据速度比外部的SPI-FLASH要快得多,因此,Flash中经常存储一些关键数据,例如:在 RM 比赛中常常将机器人特征数据例(如云台电机中值)保存进 flash。

STM32Flash地址起始于0x0800,结束地址是0x0800加上芯片实际的Flash大小

存储器

存储器分为2种

  1. 易失性:掉电数据会丢失,通常指RAM(random access memory);
RAM分为SRAM、DRAM
1.SRAM:静态RAM,只要上电数据就不会丢失;
2.DRAM:动态RAM,需要每隔一段时间刷新数据,否则数据会丢失;
  1. 非易失性:掉电数据仍然可以保存,通常指ROM(read-only memory);
1.最初的ROM只读或可写一次然后只读;
2.后来,发展出电可擦除即EEPROM,从此“ROM只读存储器”只是名义上的只读,实际就是可读可写。EEPROM可对指定字节进入擦除写入。
3.再后来,FLASH闪存出现了,以块为单位擦除,使得存储的数据密度更高,成本更低;
4.FLASH分为Nor FLASH和Nand FLASH:
  Nor FLASH可以以字节为单位读取;
  Nand FLASH是以块为单位读取数据;

STM32的Flash和SRAM

FlashSRAM
容量较大(1M)容量较小(192kb)
读取和写入速度较慢读取和写入速度较快
掉电不会丢失数据掉电丢失数据
分扇区不分扇区
写入需要先擦除写入不需擦除
存储程序,长时间保存的数据等变量等

字节<页(Page)<扇区(Sector)< 块(Block)< 芯片(Chip)

对于Flash的使用:

  • 为了保护数据安全性,Flash有专门的锁寄存器,每次对Flash进行修改时要先通过该寄存器进行解锁,修改后还要进行加锁
  • Flash在修改时要对原先的数据进行擦除

与Flash相关的函数

flash 擦除函数

HAL_StatusTypeDef HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit, uint32_t *SectorError)

在这里插入图片描述

函数名HAL_FLASHEx_Erase
作用擦除指定的Flash页面(以页为单位)
返回值HAL_StatusTypeDef类型(状态,程序成功执行就返回HAL_OK,失败会返回HAL_ERROR,超时会返回HAL_TIMEOUT)
参数1FLASH_EraseInitTypeDef *pEraseInit,擦除flash时使用的结构体指针,需要创建一个FLASH_EraseInitTypeDef类型的结构体flash_erase,需要赋予这个结构体以下参数:Sector(要擦除的页面的首地址),TypeErase(擦除方式),VoltageRange(电压范围),NbSectors(待擦除页面数),最后我们将&flash_erase作为参数输入函数
参数2uint32_t *SectorError ,如果本次flash擦除产生了错误,则发生擦除错误的页面号存储在SectorError中。创建一个uint32_t error(存放错误信息的数组),将&error输入即可,如果擦除出错,可以去读取error中的值确认出错的页面号。(0xFFFFFFFFU表示所有扇区都被正确擦除)

FLASH_EraseInitTypeDef该结构体包含如下:

在这里插入图片描述

flash写入函数

HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data)

在这里插入图片描述

在这里插入图片描述

函数名HAL_FLASH_Program
作用以指定的方式,向flash中的一页写入数据
返回值HAL_StatusTypeDef类型
参数1uint32_t TypeProgram,取值为FLASH Type Program类型,FLASH Type Program包括8位字节FLASH_TYPEPROGRAM_BYTE,16位半字FLASH_TYPEPROGRAM_HALFWORD,32位字FLASH_TYPEPROGRAM_WORD,或者64位双字FLASH_TYPEPROGRAM_DOUBLEWORD
参数2uint32_t Address,需要写入数据的地址
参数3uint64_t Data,需要写入的目标数据

FLASH Type Program类型:

在这里插入图片描述

flash读取函数

void flash_read(uint32_t address, uint32_t *buf, uint32_t len)

flash的读取相对简单,可以通过memcpy函数进行读取

void flash_read(uint32_t address, uint32_t *buf, uint32_t len)
{ 
    memcpy(buf, (void*)address, len *4);
}
函数名flash_read
作用从flash读取数据
返回值None
参数1Flash地址
参数2读取后的存储变量地址
参数3字节长度

前面讲过Flash有专门的锁寄存器,每次对Flash进行修改时要先通过该寄存器进行解锁,修改后还要进行加锁

相关函数如下:

flash解锁函数

HAL_StatusTypeDef HAL_FLASH_Unlock(void)

在这里插入图片描述

函数名HAL_FLASH_Unlock
作用为flash解锁,使用户可以修改flash内容
返回值HAL_StatusTypeDef类型

flash加锁函数

HAL_StatusTypeDef HAL_FLASH_Lock(void)

在这里插入图片描述

函数名HAL_FLASH_Lock
作用为flash加锁,后续操作时只有先解锁才能对flash内容进行修改
返回值HAL_StatusTypeDef类型

本次使用c板进行flash的读写,程序流程如下:

在这里插入图片描述

boot作用

boot主要用于控制芯片在上电之后如何引导程序加载到芯片中开始执行。

STM32的启动方式分为三种:

  1. 最常用的方式,即是从flash中读取烧录的程序,将其引导到STM32中执行。

  2. 芯片从一块特殊的系统存储区启动,在系统存储区中存有芯片生产厂商已经写好的bootloader程序,这个程序的功能是通过串口将程序读取到flash中去,再将flash中的程序引导到单片机中执行。有一些特殊的下载软件可以让我们通过串口进行STM32程序的下载,其原理就是使用了这种boot方式。使用这种boot的优点是不需要额外的下载器,缺点是下载速度比较慢。

  3. 从STM32内嵌的SRAM中启动,可以将一小段程序写入SRAM中用于调试,但是因为SRAM的易失性,所以一般不会采用这种方式进行boot,否则每次重新给芯片上电就必须重新给SRAM写入一次程序。

可以通过芯片的boot0和boot1引脚进行设置

方式1方式2方式3
BOOT引脚状态BOOT0:GND
BOOT1:GND or VCC
BOOT0:VCC
BOOT1:GND
BOOT0:VCC
BOOT1:VCC
启动区域Flash的用户程序存储区Bootloader程序存储区内嵌SRAM
功能将用户通过下载器烧录的程序引导到单片机执行,是最常用的方式通过串口将程序读取到flash中去,再将flash中程序引导到单片机中执行。将SRAM中的程序引导到单片机执行,一般用于调试
  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

书阁下

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值