为了保存工作状态
长按关机后或者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 一下
