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 *)&params_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中的地址,取出来的数据需要按照存储时的编码格式进行解码。

 

posted @ 2023-06-07 13:24  颖风船  阅读(1424)  评论(0)    收藏  举报