stm32f1 内部flash读写 hal
时间: 2025-02-16 13:23:02 浏览: 47
### STM32F1 HAL库内部Flash读写教程
#### 解锁与锁定Flash
为了防止意外修改Flash内容,在执行任何Flash编程之前,必须先解锁Flash。完成后应重新锁定以保护数据。
```c
HAL_FLASH_Unlock();
// 执行Flash操作...
HAL_FLASH_Lock();
```
#### 擦除指定页面
在向Flash写入新数据前,需确保目标位置已被清空。这通常通过擦除整个页面来实现[^1]。
```c
uint32_t PageError;
FLASH_EraseInitTypeDef EraseInitStruct;
EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
EraseInitStruct.PageAddress = StartSectorAddr;
EraseInitStruct.NbPages = 1;
if (HAL_FLASHEx_Erase(&EriseInitStruct, &PageError) != HAL_OK) {
// 错误处理
}
```
#### 编程(写入)数据到Flash
对于STM32F1系列,可以按字节、半字或全字的方式写入数据。这里展示了一个简单的循环用于连续写入多个半字(16位)数据[^2]。
```c
for(uint16_t i = 0; i < NumToWrite; ++i){
if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD,
Writeaddr + (2 * i),
pBuffer[i]) != HAL_OK){
// 处理错误情况
}
}
```
#### 验证写入成功并读取数据
完成写入后建议验证数据是否正确无误地存储到了预期地址。可以通过直接访问内存地址或将指针强制转换为适当类型的变量来进行读取。
```c
__IO uint16_t* flashDataPtr = (__IO uint16_t*)Readaddr;
for(int i=0;i<NumToCheck;++i){
if(flashDataPtr[i]!=expectedValue[i]){
// 数据校验失败后的处理逻辑
}
}
```
阅读全文
相关推荐



















