F405 hal库flash读写
时间: 2025-05-10 10:23:47 浏览: 25
### STM32F405 使用 HAL 库实现 Flash 的读写操作
对于 STM32F405 芯片,使用 HAL 库进行 Flash 的读写操作涉及多个步骤,主要包括解锁 Flash、执行擦除和编程操作以及重新锁定 Flash。以下是详细的说明和示例代码。
#### 1. 宏定义与初始化
为了方便管理 Flash 地址范围,在代码中可以预先定义一些常量来表示 Flash 的起始地址和其他参数:
```c
#define FLASH_START_ADDR ((uint32_t)0x080C0000) // 假设从这个地址开始存储数据
#define DATA_TO_WRITE (0xAABBCCDD) // 需要写入的数据
#define WRITE_ADDRESS (FLASH_START_ADDR + 4) // 写入的具体位置
```
这些宏可以根据实际需求调整,例如 `WRITE_ADDRESS` 可能指向某个特定偏移的位置。
---
#### 2. 解锁 Flash 并准备擦除
在对 Flash 执行任何修改之前,必须先调用 `HAL_FLASH_Unlock()` 来解锁 Flash 访问权限。接着通过结构体 `FLASH_EraseInitTypeDef` 初始化擦除参数并调用 `HAL_FLASHEx_Erase()` 函数完成扇区擦除。
```c
void EraseFlashSector(uint32_t address, uint32_t sectorNumber) {
HAL_StatusTypeDef status;
/* Unlock the Flash to enable the flash control register access */
HAL_FLASH_Unlock();
/* Fill EraseInit structure*/
FLASH_EraseInitTypeDef eraseInitStruct;
eraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS; // 按照扇区擦除
eraseInitStruct.Sector = __HAL_FLASH_GET_SECTOR(address); // 获取对应扇区号
eraseInitStruct.NbSectors = sectorNumber;
/* Variable used for Erased sectors error management */
uint32_t page_error = 0;
/* Perform the erase operation */
status = HAL_FLASHEx_Erase(&eraseInitStruct, &page_error);
if (status != HAL_OK) {
// 错误处理逻辑
while(1);
}
/* Lock the Flash to disable the flash control register access (recommended to protect the Flash memory against possible unwanted operations) */
HAL_FLASH_Lock();
}
```
上述代码片段展示了如何安全地擦除指定数量的扇区[^1]。需要注意的是,如果尝试在一个未完全对齐到其所属扇区边界的地址上启动擦除过程,则可能导致程序挂起或失败。
---
#### 3. 编程(写入)数据至 Flash
一旦目标区域被成功清除后就可以继续向该区域内写入新数据了。这一步骤同样需要遵循严格的规则——每次只能针对单个字或者半字长度单位实施写动作;而且每项单独的操作之间都应当保持适当间隔以免触发硬件保护机制。
下面是一个简单的例子展示怎样把一个整数值存放到预定义好的内存单元当中去:
```c
void WriteToFlash(uint32_t addr, uint32_t data){
HAL_StatusTypeDef result ;
HAL_FLASH_Unlock() ;
result = HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD ,addr,data);
if(result!=HAL_OK ){
// Handle Error Here...
}
HAL_FLASH_Lock();
}
```
此函数接受两个参数:一个是目标存储器地址(addr),另一个是要保存进去的实际资料(data). 如果一切正常的话,它将会把这个四字节宽度的新值放置于所指派的地方之上.
---
#### 4. 数据验证 - 读取已写入的内容
最后我们还需要确认刚才所做的更改确实生效无误。为此我们可以再次访问相同的物理位址,并将其当前状态提取出来加以核验。
```c
bool VerifyDataInFlash(uint32_t readAddr,uint32_t expectedValue){
bool success=true;
volatile uint32_t actualValue=*(volatile uint32_t *)readAddr;
if(actualValue !=expectedValue ){
success=false;
}
return success;
}
```
这段小程序段用来对比先前设定的目标数值(expectedValue)跟现在实际存在于那个地方的东西是否相符。如果不一致则返回false表明存在差异.
---
### 总结
以上便是利用STM32 HAL库来进行基本flash读写的全过程概述及其相应示范编码。值得注意的是不同型号间可能存在细微差别因此务必参照各自官方文档做进一步核实校正工作。
阅读全文
相关推荐



















