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號