stm32 内部flash的读写
时间: 2025-02-25 10:01:15 浏览: 64
### STM32 内部 Flash 读写方法
#### 一、内部 Flash 的特性
STM32 芯片内置有 FLASH 存储器,主要用于存储代码,在掉电后其内容不会丢失。当芯片重新上电复位时,内核可以从内部 FLASH 加载代码并执行[^2]。
#### 二、读取内部 Flash 数据
对于 STM32 来说,读取内部 FLASH 是一件非常直接的事情,因为它被映射到了系统的地址空间里,可以如同访问 RAM 或者其他外设寄存器一样轻松获取其中的信息。下面给出了一种基于指针的方式实现对指定位置数据的检索:
```c
#define FLASH_START_ADDR ((uint32_t)0x08000000)
// 定义指向 flash 地址的指针变量 p
volatile uint32_t* p = (volatile uint32_t*)FLASH_START_ADDR;
// 使用 *p 获取该地址处的数据
uint32_t read_data = *p;
```
这段代码定义了一个 `volatile` 类型的指针 `p` 指向了 FLASH 开始的地方,并通过解引用此指针来获得那个地方所储存的具体数值[^4]。
#### 三、写入/修改内部 Flash 数据
需要注意的是,往 FLASH 中写入新数据之前通常需要先完成擦除动作。这里提供一段简单的例子用于展示如何准备以及实际执行一次完整的写过程(假设目标扇区已经被解锁):
```c
#include "stm32f1xx_hal.h"
void HAL_FLASH_Unlock(void);
void HAL_FLASH_Lock(void);
HAL_StatusTypeDef WriteToFlash(uint32_t Address, uint32_t Data){
// 解锁 FLASH 控制寄存器以便对其进行配置
HAL_FLASH_Unlock();
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_WRPERR | FLASH_FLAG_PGERR);
// 设置页面大小为字节单位下的偏移量
const uint32_t PAGE_SIZE = 1024U;
// 如果当前页不是空白,则需先行整页清除再继续后续工作
if(HAL_OK != HAL_FLASHEx_EraseInit(&EraseInitStruct)){
return HAL_ERROR;
}
EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
EraseInitStruct.PageAddress = Address & ~(PAGE_SIZE - 1UL);
EraseInitStruct.NbPages = 1U;
if(HAL_OK != HAL_FLASHEx_Erase(&EraseInitStruct,&PageError)){
return HAL_ERROR;
}
// 执行真正的编程指令前再次确认状态标志已被清零
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_WRPERR | FLASH_FLAG_PGERR);
// 向给定地址写入一个单词长度的新值
if(__HAL_FLASH_PROGRAM_WORD(Address,Data)!= HAL_OK){
// 错误处理...
HAL_FLASH_Lock();
return HAL_ERROR;
}else{
// 成功之后记得锁定回去防止意外更改
HAL_FLASH_Lock();
return HAL_OK;
}
}
```
上述函数实现了针对特定地址写入单个四字节数的操作流程,包括必要的前期准备工作如解锁、清理错误标记等,同时也包含了可能出现异常情况时的基本应对措施[^1]。
阅读全文
相关推荐

















