Flash数据库
在上一步代码生成后,会出现User/flash_map.hpp
,该文件记录了STM32的Flash地址映射表,格式如下:
#pragma once
// Auto-generated Flash Layout Map
// MCU: STM32F407IGH6
#include "main.h"
#include "stm32_flash.hpp"
constexpr LibXR::FlashSector FLASH_SECTORS[] = {
{0x08000000, 0x00004000},
{0x08004000, 0x00004000},
{0x08008000, 0x00004000},
{0x0800C000, 0x00004000},
{0x08010000, 0x00010000},
{0x08020000, 0x00020000},
{0x08040000, 0x00020000},
{0x08060000, 0x00020000},
{0x08080000, 0x00020000},
{0x080A0000, 0x00020000},
{0x080C0000, 0x00020000},
{0x080E0000, 0x00020000},
};
constexpr size_t FLASH_SECTOR_NUMBER = sizeof(FLASH_SECTORS) / sizeof(LibXR::FlashSector);
创建Flash对象
第一个模板参数是flash的总扇区数,第二个是数据库的起始扇区编号。FLASH_SECTOR_NUMBER - 1意味着取最后两个扇区。此对象提供了擦除和读写flash的接口。
// app_main.cpp
/* User Code Begin 3 */
STM32Flash<FLASH_SECTOR_NUMBER, FLASH_SECTOR_NUMBER - 1> flash(FLASH_SECTORS);
创建数据库对象
对于STM32F1/F4等型号,使用DatabaseRaw。模板参数代表了flash的最小写入粒度。
LibXR::DatabaseRaw<4> database(flash);
对于STM32G4/L4等flash不支持逆序写入的型号,请使用DatabaseRawSequential。第二个参数为可选,代表最大缓冲区大小。
LibXR::DatabaseRawSequential database(flash, 128);
创建数据库键值
模板参数为键值存储的数据类型,第二个参数为键名,第三个参数为默认值。键值可自动转换成对应的类型,也可通过key.data_获取原始数据。
Database::Key<uint32_t> key1(database, "key1", 0);
写入数据库
key1.set(key1.data_ + 1);