Featured image of post HAL_flash 数据备份与读取

HAL_flash 数据备份与读取

HAL_flash 数据备份与读取

为了保存工作状态 长按关机后或者30分钟后断电 在这个操作前先保存状态 下次开机时直接读取保存内容

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include "Flash_baup.h"


void SaveStateToFlash(uint8_t level, uint8_t reverse)
{
    // 解锁 Flash
    HAL_FLASH_Unlock();

    // 擦除 Flash 页
    FLASH_EraseInitTypeDef EraseInitStruct;
    uint32_t PageError = 0;
    EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
    EraseInitStruct.PageAddress = FLASH_USER_START_ADDR;
    EraseInitStruct.NbPages = 1;
    if (HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) != HAL_OK)
    {
        // 错误处理
        Error_Handler();
    }

    // 写入当前档位和正反转状态
    uint32_t data = (level << 8) | reverse;
    __disable_irq();  // 加这个 是为了防止中断打断写入操作
    if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, FLASH_USER_START_ADDR, data) != HAL_OK)
    {
        // 错误处理
        Error_Handler();
    }
    __enable_irq();   // 使能中断
    // 锁定 Flash
    HAL_FLASH_Lock();
}

void LoadStateFromFlash(uint8_t *level, uint8_t *reverse)
{
    uint32_t data = *(__IO uint32_t*)FLASH_USER_START_ADDR;
    *level = (data >> 8) & 0xFF;
    *reverse = data & 0xFF;
}

头文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#ifndef FLASH_BAUP_H
#define FLASH_BAUP_H

#include "stm32f0xx_hal.h"
#include "main.h"

// 定义 Flash 存储地址
#define FLASH_USER_START_ADDR   ((uint32_t)0x08007000)   /* Start @ of user Flash area, assuming 1KB per page and 128KB total Flash size */


// Flash 操作函数声明
void SaveStateToFlash(uint8_t level, uint8_t reverse);
void LoadStateFromFlash(uint8_t *level, uint8_t *reverse);


#endif // FLASH_BAUP_H

保存的是两个 uint8_t 的数据 值得注意的是我们要注意地址 存储的起始地址有讲究的 最后通过 keil 也是能看到的 如果资源紧张 可以 debug 一下

最后更新于 Apr 26, 2025 10:23 +0800
世界是你们
使用 Hugo 构建
主题 StackJimmy 设计