如果需要在程序中永久保存一些参数,可以利用STM32的Flash存储器作为自定义存储器区域。在保存参数时,可以将参数按照一定的编码格式打包成一个字节数组(例如采用结构体表示),然后按照一定的规则写入Flash存储器。
1、定义参数结构体
定义一个结构体存放要保存的参数。例如,假设要保存两个参数,一个浮点数和一个整型数,可以定义如下结构体:
// 定义保存参数的结构体 typedef struct { float param1; // 浮点型参数 int param2; // 整型参数 } Parameters;
2、设置Flash存储器地址
在程序中设置Flash存储器的起始地址。可以定义一个常量来表示Flash存储器的起始地址,例如:
#define FLASH_BASE_ADDR 0x08004000 // 要保存的地址从0x08004000开始
3、计算存储器地址
在写入参数前,计算参数要保存的地址。可以定义一个变量(或常量)表示参数在Flash中的偏移量,例如:
#define PARAMS_OFFSET 0x40 // 参数在Flash中的偏移量为64字节
然后根据偏移量和存储器起始地址计算要保存的地址,例如:
uint32_t flash_addr = FLASH_BASE_ADDR + PARAMS_OFFSET; // 计算要保存的地址
4、擦除Flash存储器
在写入参数前,需要先将存储器的相关页进行擦除操作。可以借助HAL库函数来完成操作,例如:
FLASH_EraseInitTypeDef erase_config; erase_config.TypeErase = FLASH_TYPEERASE_PAGES; erase_config.PageAddress = FLASH_BASE_ADDR; erase_config.NbPages = 1; uint32_t page_error = 0; HAL_FLASHEx_Erase(&erase_config, &page_error);
5、写入Flash存储器
在进行擦除操作后,可以使用 HAL_FLASH_Program()
函数将参数写入Flash存储器中,在写入前需要先解锁Flash存储器。例如:
// 解锁Flash存储器 HAL_FLASH_Unlock(); // 写入参数 Parameters params_to_save = {.param1 = 3.14, .param2 = 123}; HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, flash_addr, *(uint32_t *)¶ms_to_save); flash_addr += sizeof(Parameters); // 再写入参数 Parameters another_params_to_save = {.param1 = 1.3, .param2 = 456}; HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, flash_addr, *(uint32_t *)&another_params_to_save); // 锁定Flash存储器 HAL_FLASH_Lock();
在上述代码中,首先解锁Flash存储器;然后定义要保存的参数,使用 HAL_FLASH_Program()
函数将参数写入Flash存储器中,每次写入一个字。写入后更新 flash_addr
变量,准备写入下一个参数。最后再次锁定Flash存储器。
在读取Flash存储器中的参数时,也可以采用类似的方法,计算出参数在Flash中的地址,取出来的数据需要按照存储时的编码格式进行解码。
标签:Flash,FLASH,存储器,写入,永久,stm32,参数,HAL From: https://www.cnblogs.com/Bingley-Z/p/17463058.html