hal库 flash读写
时间: 2025-01-11 11:19:30 浏览: 63
### 关于STM32 HAL库中Flash读写的使用方法
#### 解锁内部FLASH
在执行任何闪存操作之前,必须先解锁内部FLASH。默认情况下,内部FLASH处于锁定状态以防止意外写入或擦除操作。通过调用`HAL_FLASH_Unlock()`函数可以解锁内部FLASH[^3]。
```c
// 解锁内部 FLASH 函数,默认内部 FLASH 是锁上的,使用的时候需要解锁。
HAL_FLASH_Unlock();
```
#### 设置FLASH编程/擦除控制器参数
为了准备后续的写入或擦除操作,需设置相应的结构体来定义具体的操作参数。对于写入和擦除来说,通常会涉及到地址、数据长度等信息。
```c
FLASH_EraseInitTypeDef EraseInitStruct;
uint32_t PageError = 0;
EraseInitStruct.TypeErase = TYPEERASE_PAGES; // 定义擦除类型为页面擦除
EriseInitStruct.PageAddress = StartPageAddr; // 开始页地址
EraseInitStruct.NbPages = NumberOfPages; // 需要擦除的页数
```
#### 执行擦除操作
一旦设置了上述参数,则可以通过调用`HAL_FLASHEx_Erase()`来进行实际的擦除工作。此过程可能会花费一定的时间,在某些应用场合下可能需要注意超时处理机制。
```c
if (HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) != HAL_OK){
// 错误处理...
}
```
#### 编程(写入)数据到指定位置
完成擦除之后就可以向目标区域写入新的数据了。这里同样需要用到特定的数据结构以及对应的API接口进行单字节或多字节形式的数据传输。
```c
for(uint16_t i=0;i<Size;i++){
if(HAL_FLASH_Program(TYPEPROGRAM_WORD, Address+i*4, Data[i])!= HAL_OK){
// 如果发生错误则停止并处理异常情况
break;
}
}
```
#### 上述代码片段中的宏定义解释
- `TYPEPROGRAM_WORD`: 表明将以单词(通常是32位)的形式对内存单元进行编程;
- `StartPageAddr`, `NumberOfPages`: 分别代表起始页地址及待擦除的总页数量;
- `Data[]`: 存储着即将被写入的目标数据序列;
#### 结束与保护措施
当所有的写入动作完成后应当重新锁定FLASH以防不必要的修改行为影响系统的稳定性。
```c
HAL_FLASH_Lock(); // 加锁内部 FLASH
```
阅读全文
相关推荐

















