stm32单片机如何声明flash
时间: 2025-01-23 21:34:16 浏览: 28
### 如何在 STM32 单片机中正确声明和使用 Flash 存储器
#### 声明 Flash 变量
为了使变量保存到 Flash 中,在定义这些变量时需要指定特定的关键字或宏。通常情况下,编译器提供了关键字 `__attribute__((section(".my_flash_section")))` 来把变量放置于自定义的节区中。
```c
// 定义一个位于Flash中的常量字符串数组
const char myString[] __attribute__((section(".flash_data"))) = "Stored in flash";
```
对于 STM32 的具体实现,可以通过设置地址映射将数据存储至 Flash 特定区域:
```c
#define FLASH_USER_START_ADDR ADDR_FLASH_PAGE_129 /* Start @ of user Flash area */
#define FLASH_USER_END_ADDR (ADDR_FLASH_PAGE_129 + FLASH_PAGE_SIZE - 1) /* End @ of user Flash area */
uint32_t dataToStoreInFlash; // 需要被存储的数据
volatile uint32_t *pFlashDataAddress = (uint32_t*)FLASH_USER_START_ADDR;
*pFlashDataAddress = dataToStoreInFlash;
```
需要注意的是,上述方法仅适用于初始化阶段向 Flash 写入固定不变的内容;如果希望动态更新 Flash 数据,则需调用 HAL 库函数完成擦除与编程操作[^1]。
#### 使用 Flash 进行读写操作
当涉及到修改 Flash 上的信息时,应该遵循如下流程:
- 锁定/解锁 Flash 访问权限;
- 执行页面擦除命令清除目标位置原有内容;
- 编程指令往已清零的位置写入新数值;
- 最终再次锁定防止意外更改。
下面给出一段基于 HAL 库的操作实例代码片段:
```c
HAL_StatusTypeDef status;
/* Unlock the Flash to enable the flash control register access */
status = HAL_FLASH_Unlock();
if(status != HAL_OK){
Error_Handler();
}
/* Clear All Errors Flags */
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_WRPERR |
FLASH_FLAG_PGERR);
/* Erase Page at Address specified by FLASH_USER_START_ADDR */
status = HAL_FLASHEx_Erase(&eraseInitStruct, &pageError);
if(status != HAL_OK){
Error_Handler();
}
/* Program word at address given by pFlashDataAddress with value stored in variable 'dataToStoreInFlash'*/
status = HAL_FLASH_Program(TYPEPROGRAM_WORD, (uint32_t)pFlashDataAddress, dataToStoreInFlash);
if(status != HAL_OK){
Error_Handler();
}
/* Lock the Flash to disable the flash control register access */
HAL_FLASH_Lock();
```
此过程确保了对 Flash 的安全可靠访问,并且能够有效管理其生命周期内的多次改写需求[^3]。
阅读全文
相关推荐
















