hal库读写flash
时间: 2025-05-09 14:21:43 浏览: 28
### STM32 HAL库 Flash 读写教程
#### 使用HAL库实现Flash的读写操作概述
STM32微控制器提供了灵活的功能来访问其内部闪存(Flash)。通过使用STM32 HAL库,可以简化对Flash的操作过程。具体来说,可以通过调用`HAL_FLASH_Unlock()`解锁Flash区域以便进行编程或擦除操作,并利用函数如`HAL_FLASH_Program()`完成数据写入以及`HAL_FLASH_Lock()`重新锁定Flash以防止意外修改。
以下是基于STM32F4系列的一个简单示例代码展示如何执行基本的Flash读写操作:
```c
#include "stm32f4xx_hal.h"
// 定义要存储到Flash中的地址和数据
#define DATA_ADDRESS ((uint32_t)0x08010000)
void Flash_Write(uint32_t address, uint64_t data){
HAL_StatusTypeDef status;
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |
FLASH_FLAG_PGAERR| FLASH_FLAG_PGPERR| FLASH_FLAG_PGSERR);
// 解锁flash控制寄存器
HAL_FLASH_Unlock();
// 半字写入模式下,先清除目标位置的数据再写入新数据
if(HAL_OK != HAL_FLASHEx_DataEEPROM_Erase(address)){
Error_Handler();
}
// 将两个半字分别写入指定地址
for(int i=0;i<2;i++){
status = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD,address,(uint16_t)(data >> (i*16)));
if(status != HAL_OK){
Error_Handler();
}
address += sizeof(uint16_t); // 移动至下一个半字单元
}
// 锁定flash控制寄存器以防进一步更改
HAL_FLASH_Lock();
}
uint64_t Flash_Read(uint32_t address){
uint64_t read_data = 0;
for(int i=0;i<2;i++,address+=sizeof(uint16_t)){
*(volatile uint16_t*)&read_data |= (*(volatile uint16_t*)address << (i*16));
}
return read_data;
}
```
上述代码展示了如何定义一个用于向特定Flash地址写入数据并从中读取数据的方法[^1]。需要注意的是不同型号之间可能存在差异因此实际应用时需参照相应手册调整参数设置[^2]。
对于外部SPI Flash设备,则需要按照制造商提供的命令集来进行通信交互。例如,在给定的例子中演示了怎样获取W25QXX类型的器件ID号[^3]。
#### 注意事项
当处理任何种类的非易失性内存时,请始终遵循以下准则:
- 确认所选扇区未被先前配置为只读属性。
- 执行所有必要的错误检查步骤确保每次交易顺利完成。
- 考虑电源管理策略因为某些情况下断电可能会导致部分已完成而另一些尚未开始的事务失败从而引起数据丢失或者损坏等问题发生。
阅读全文
相关推荐


















