Add core firmware modules: input, menu, NRF24L01, OLED, protocol, PWM, storage + UI assets
This commit is contained in:
111
Core/Inc/storage.h
Normal file
111
Core/Inc/storage.h
Normal file
@@ -0,0 +1,111 @@
|
||||
/**
|
||||
* 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 <string.h>
|
||||
|
||||
/* 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 */
|
||||
Reference in New Issue
Block a user