// 存:校准值写到 App 区末尾 1 页
HAL_FLASH_Unlock();
FLASH_EraseInitTypeDef fe = {
.TypeErase = FLASH_TYPEERASE_PAGES,
.PageAddress = APP_END_PAGE_ADDR, // 如 0x0803F800
.NbPages = 1
};
uint32_t err = 0;
HAL_FLASHEx_Erase(&fe, &err);
HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, APP_END_PAGE_ADDR, calib_value);
HAL_FLASH_Lock();
// 读:直接指针访问
uint32_t saved = *(volatile uint32_t*)APP_END_PAGE_ADDR;