FLASH 读写
# 硬件基础
STM32 具有内存
注意
其中,对 FLASH 的使用需要注意以下几点:
- 为了保护数据的安全性,FLASH 有专门的锁寄存器,每次要对 FLASH 页面进行修改时首先要通过锁寄存器对页面进行解锁,修改完成后要进行加锁
- flash是不支持在保存原有数据的情况下进行修改的,因此要改变 FLASH 页面数据时,需要对这个页面进行擦除,擦除之后再写入新的数据
# 函数说明
# FLASH 擦除函数
HAL_StatusTypeDef HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit, uint32_t *SectorError)
1
# FLASH 写入函数
HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data)
1
# FLASH 读取函数
通过自定义的函数调用 memcpy
函数进行读取:
void flash_read(uint32_t address, uint32_t *buf, uint32_t len)
{
memcpy(buf, (void*)address, len *4);
}
1
2
3
4
2
3
4
参数3 | 字节长度 |
---|---|
--- | --- |
# FLASH 解锁函数
前面介绍过,写入或擦除数据时需要为 FLASH 进行解锁和加锁。下面就是 FLASH 的解锁函数HAL_FLASH_Unlock
。 这个函数的功能其实非常简单,只是为锁寄存器写入特定的 KEY 值以完成解锁
HAL_StatusTypeDef HAL_FLASH_Unlock(void)
1
# FLASH 加锁函数
下面是 FLASH 加锁操作函数HAL_FLASH_Lock
,该函数的功能同样简单,即清楚已解锁的锁寄存器的KEY值,便完成了加锁功能
HAL_StatusTypeDef HAL_FLASH_Lock(void)
1
# Bouns
我们的 FLASH 实际上是分扇区的,以STM32F407x
为例,其扇区就像这样:
其中芯片上电时,会从0x08000000
读取程序开始运行,故而在扇区 0 开始往往会存储程序,需要使用程序之后的扇区作为存储扇区
# boot
boot 用于控制芯片在上电之后如何引导程序加载到芯片中开始执行
STM32 的启动方式分为三种方式,采用哪一种方式启动可以通过芯片的 boot0 和 boot1引脚进行设置:
- 第一种方式是最常用的方式,即从 FLASH 中读取烧录的程序,将其引导到 STM32 中执行
- 第二种方式,芯片从一块特殊的系统存储区启动,在系统存储区中存有芯片生产厂商已经写好的 bootloader 程序,这个程序的功能是通过串口将程序读取到 FLASH 中去,再将 FLASH 中的程序引导到单片机中执行。有一些特殊的下载软件可以让我们通过串口进行 STM32 程序的下载,其原理就是使用了这种 boot 方式。使用这种 boot 的优点是不需要额外的下载器,缺点是下载速度比较慢
- 第三种方式是从 STM32 内嵌的 SRAM 中启动,可以将一小段程序写入 SRAM 中用于调试,但是因为 SRAM 有着掉电丢失的特性,所以一般不会采用这种方式进行 boot,否则每次重新给芯片上电就必须重新给 SRAM 写入一次程序
# 参考
[1] RoboMaster 开发板 C 型嵌入式软件教程文档
编辑 (opens new window)
上次更新: 2020/11/18, 13:11:00