/** * Flash 存储模块 (模拟 EEPROM) * 使用 STM32F103 内部 Flash 最后一页存储配置 * Flash: 128KB, 页大小 1KB, 最后一页 0x0801FC00 */ #ifndef STORAGE_H #define STORAGE_H #include "main.h" #include "nrf24l01.h" #include "pwm_out.h" #include /* Flash 页地址 (最后一页, 不占用程序空间) */ #define STORAGE_PAGE_SIZE 1024 #define FLASH_STORAGE_ADDR 0x0801FC00 /* Page 127 (128KB Flash, 最后一页) */ /* 模型最大数量 */ #define MODEL_MAX_COUNT 16 #define MODEL_NAME_LEN 9 /* 8字符 + '\0' */ /* 模型类型 */ #define MODEL_TYPE_AIRPLANE 0 #define MODEL_TYPE_CAR 1 #define MODEL_TYPE_BOAT 2 #define MODEL_TYPE_MULTIROTOR 3 /* 通道数 */ #define CHANNEL_COUNT 16 /* 输入类型 */ #define INPUT_TYPE_ADC 0 #define INPUT_TYPE_KEY 1 #define INPUT_TYPE_NONE 0xFF /* 混控类型 */ #define MIXER_TYPE_NONE 0 #define MIXER_TYPE_SIMPLE 1 /* 简单比例 */ #define MIXER_TYPE_DELTA 2 /* 三角翼混控 */ #define MIXER_TYPE_VTAIL 3 /* V尾混控 */ #define MIXER_TYPE_ELEVON 4 /* 升降副翼 */ /* 回传信息项 */ #define TELEM_VOLTAGE 0 #define TELEM_RSSI 1 #define TELEM_PACKET_LOSS 2 #define TELEM_TEMP 3 #define TELEM_COUNT 4 /* ---- 模型结构体 ---- */ typedef struct { char name[MODEL_NAME_LEN]; /* 模型名称 */ uint8_t type; /* 模型类型 */ uint8_t channel_map[CHANNEL_COUNT]; /* 通道映射: CHx -> ADC_INy 或 KEY_INy */ uint8_t input_type[CHANNEL_COUNT]; /* 输入类型: INPUT_TYPE_ADC/KEY */ uint8_t mixer_type[CHANNEL_COUNT]; /* 混控类型 */ int16_t mixer_scale[CHANNEL_COUNT]; /* 混控比例 (x100) */ int16_t mixer_offset[CHANNEL_COUNT];/* 混控偏移 */ uint8_t telem_enable[TELEM_COUNT]; /* 回传信息使能 */ } Model_t; /* ---- 全局配置结构体 ---- */ typedef struct { uint8_t magic[4]; /* 魔数 "LOLI" */ uint8_t active_model; /* 当前活动模型索引 */ Model_t models[MODEL_MAX_COUNT]; /* 模型列表 */ /* 高频头配置 */ uint8_t rf_type; /* 0=NRF24, 1=CRFS */ uint8_t nrf_channel; /* NRF24 频道 */ uint8_t nrf_rate; /* 速率 */ uint8_t nrf_power; /* 功率 */ uint8_t nrf_addr[5]; /* 地址 */ char nrf_phrase[7]; /* 对频短语 */ /* CRFS 配置 */ uint16_t crfs_packet_rate; /* 数据包速率 */ uint8_t crfs_telemetry_ratio; /* 遥测比例 */ uint8_t crfs_power; /* 功率 */ /* PWM 配置 */ uint8_t pwm1_mode; /* PWM_OUT1 模式 */ uint8_t pwm2_mode; /* PWM_OUT2 模式 */ uint8_t ws2812_effect; /* WS2812 效果 */ uint8_t led_brightness; /* LED 亮度 */ uint8_t vibrate_level; /* 振动档位 */ /* 首页设置 */ uint8_t home_page; /* 0=回传, 1=INx值 */ /* CRC32 校验 */ uint32_t crc32; } Config_t; /* 函数声明 */ void Storage_Init(void); void Storage_Load(void); /* 从 Flash 加载配置 */ void Storage_Save(void); /* 保存配置到 Flash */ void Storage_Reset(void); /* 恢复出厂设置 */ /* 模型操作 */ uint8_t Storage_ModelAdd(const char *name, uint8_t type); void Storage_ModelDelete(uint8_t idx); void Storage_ModelSelect(uint8_t idx); Model_t* Storage_GetActiveModel(void); Model_t* Storage_GetModel(uint8_t idx); /* 全局配置访问 */ extern Config_t g_config; #endif /* STORAGE_H */