stm32永久保存一些参数
如果需要在程序中永久保存一些参数,可以利用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中的地址,取出来的数据需要按照存储时的编码格式进行解码。

浙公网安备 33010602011771号