Add core firmware modules: input, menu, NRF24L01, OLED, protocol, PWM, storage + UI assets
This commit is contained in:
98
Core/Inc/config.h
Normal file
98
Core/Inc/config.h
Normal file
@@ -0,0 +1,98 @@
|
||||
/*****************************************************************
|
||||
* 萝莉3代遥控器 - 硬件引脚配置
|
||||
* MCU: STM32F103RBT6 (LQFP64)
|
||||
*
|
||||
* 引脚编码: (port << 8) | pin
|
||||
* port: 0=GPIOA, 1=GPIOB, 2=GPIOC, 3=GPIOD
|
||||
* pin: 0-15
|
||||
*
|
||||
* 示例: PA0=0x000, PB1=0x101, PC2=0x202
|
||||
*****************************************************************/
|
||||
#ifndef CONFIG_H
|
||||
#define CONFIG_H
|
||||
|
||||
/* ================================================================
|
||||
* ADC 输入引脚 (16通道)
|
||||
* ADC_IN0~15 可在 OLED 菜单中配置映射通道、混控
|
||||
* 支持自动检测按键/ADC 输入类型
|
||||
* ================================================================ */
|
||||
#define ADC_IN0 0x200 /* PC0 - ADC12_IN10 */
|
||||
#define ADC_IN1 0x201 /* PC1 - ADC12_IN11 */
|
||||
#define ADC_IN2 0x202 /* PC2 - ADC12_IN12 */
|
||||
#define ADC_IN3 0x203 /* PC3 - ADC12_IN13 */
|
||||
#define ADC_IN4 0x000 /* PA0 - ADC12_IN0 */
|
||||
#define ADC_IN5 0x001 /* PA1 - ADC12_IN1 */
|
||||
#define ADC_IN6 0x002 /* PA2 - ADC12_IN2 */
|
||||
#define ADC_IN7 0x003 /* PA3 - ADC12_IN3 */
|
||||
#define ADC_IN8 0x004 /* PA4 - ADC12_IN4 */
|
||||
#define ADC_IN9 0x005 /* PA5 - ADC12_IN5 */
|
||||
#define ADC_IN10 0x006 /* PA6 - ADC12_IN6 */
|
||||
#define ADC_IN11 0x007 /* PA7 - ADC12_IN7 */
|
||||
#define ADC_IN12 0x204 /* PC4 - ADC12_IN14 */
|
||||
#define ADC_IN13 0x205 /* PC5 - ADC12_IN15 */
|
||||
#define ADC_IN14 0x100 /* PB0 - ADC12_IN8 */
|
||||
#define ADC_IN15 0x101 /* PB1 - ADC12_IN9 */
|
||||
|
||||
/* ================================================================
|
||||
* OLED 屏幕 (128x64 SSD1306, 硬件 I2C)
|
||||
* ================================================================ */
|
||||
#define OLED_SDA 0x10B /* PB11 - I2C2_SDA */
|
||||
#define OLED_SCL 0x10A /* PB10 - I2C2_SCL */
|
||||
|
||||
/* ================================================================
|
||||
* 操作按键 (上拉输入, 按下低电平)
|
||||
* 上/下/确认/返回
|
||||
* 确认长按 -> 高频头配置页
|
||||
* 返回长按 -> 主页值/回传切换
|
||||
* ================================================================ */
|
||||
#define KEY_IN1 0x10C /* PB12 - 上 */
|
||||
#define KEY_IN2 0x10D /* PB13 - 下 */
|
||||
#define KEY_IN3 0x10E /* PB14 - 确认/菜单 */
|
||||
#define KEY_IN4 0x10F /* PB15 - 返回/回传 */
|
||||
|
||||
/* ================================================================
|
||||
* PWM 输出 (TIM4 CH3/CH4)
|
||||
* 可配置为: WS2812 / LED 呼吸灯 / 振动电机
|
||||
* ================================================================ */
|
||||
#define PWM_OUT1 0x108 /* PB8 - TIM4_CH3 */
|
||||
#define PWM_OUT2 0x109 /* PB9 - TIM4_CH4 */
|
||||
|
||||
/* ================================================================
|
||||
* LED 状态指示灯
|
||||
* LED_OUT1: 系统状态 - 开机常亮
|
||||
* LED_OUT2: NRF24L01 状态 - 未连接慢闪/配对快闪/已连接常亮
|
||||
* LED_OUT3: CRFS 状态 - 未连接慢闪/配对快闪/已连接常亮
|
||||
* ================================================================ */
|
||||
#define LED_OUT1 0x206 /* PC6 */
|
||||
#define LED_OUT2 0x207 /* PC7 */
|
||||
#define LED_OUT3 0x208 /* PC8 */
|
||||
|
||||
/* ================================================================
|
||||
* NRF24L01+ 2.4G 无线模块 (硬件 SPI1)
|
||||
* 默认开启,可在 OLED 菜单中关闭
|
||||
* ================================================================ */
|
||||
#define NRF24L01_CE 0x107 /* PB7 - 输出 */
|
||||
#define NRF24L01_CSN 0x106 /* PB6 - 输出 (SPI 片选) */
|
||||
#define NRF24L01_SCK 0x103 /* PB3 - SPI1_SCK */
|
||||
#define NRF24L01_MOSI 0x105 /* PB5 - SPI1_MOSI */
|
||||
#define NRF24L01_MISO 0x104 /* PB4 - SPI1_MISO */
|
||||
#define NRF24L01_IRQ 0x302 /* PD2 - 外部中断 */
|
||||
|
||||
/* ================================================================
|
||||
* 串口
|
||||
* UART1: 可选接收外部 SBUS 信号 (OLED 菜单中开启)
|
||||
* UART3: 发送 CRFS 信号 (OLED 菜单中开启)
|
||||
* ================================================================ */
|
||||
#define RX1 0x00A /* PA10 - USART1_RX */
|
||||
#define TX1 0x009 /* PA9 - USART1_TX */
|
||||
#define RX3 0x20B /* PC11 - USART3_RX */
|
||||
#define TX3 0x20A /* PC10 - USART3_TX */
|
||||
|
||||
/* ================================================================
|
||||
* USB (虚拟 HID Joystick)
|
||||
* 连接电脑自动识别为飞行模拟器外设
|
||||
* ================================================================ */
|
||||
#define USB_DM 0x00B /* PA11 - USB_DM */
|
||||
#define USB_DP 0x00C /* PA12 - USB_DP */
|
||||
|
||||
#endif /* CONFIG_H */
|
||||
61
Core/Inc/input.h
Normal file
61
Core/Inc/input.h
Normal file
@@ -0,0 +1,61 @@
|
||||
/**
|
||||
* 按键输入与 ADC 读取模块
|
||||
* 按键: PB12(上), PB13(下), PB14(确认), PB15(返回) - 上拉输入, 按下低电平
|
||||
* ADC: 16通道 (ADC_IN0~15), 使用 ADC2 扫描
|
||||
*/
|
||||
#ifndef INPUT_H
|
||||
#define INPUT_H
|
||||
|
||||
#include "main.h"
|
||||
#include "adc.h"
|
||||
#include "config.h"
|
||||
|
||||
/* 按键定义 */
|
||||
#define KEY_UP 0
|
||||
#define KEY_DOWN 1
|
||||
#define KEY_OK 2
|
||||
#define KEY_BACK 3
|
||||
#define KEY_NONE 0xFF
|
||||
|
||||
/* 按键状态 */
|
||||
#define KEY_STATE_IDLE 0
|
||||
#define KEY_STATE_PRESS 1
|
||||
#define KEY_STATE_HOLD 2 /* 长按 */
|
||||
#define KEY_STATE_RELEASE 3
|
||||
|
||||
/* 长按阈值 (ms) */
|
||||
#define KEY_LONG_PRESS_MS 800
|
||||
#define KEY_POWER_OFF_MS 2000
|
||||
|
||||
/* ADC 通道数 */
|
||||
#define ADC_CHANNEL_COUNT 16
|
||||
|
||||
/* ADC 原始值范围 */
|
||||
#define ADC_RAW_MIN 0
|
||||
#define ADC_RAW_MAX 4095
|
||||
|
||||
/* 函数声明 */
|
||||
void Input_Init(void);
|
||||
void Input_Scan(void); /* 每 10ms 调用一次 */
|
||||
|
||||
/* 按键查询 */
|
||||
uint8_t Input_GetKey(void); /* 返回当前按下的键 (单次) */
|
||||
uint8_t Input_GetKeyState(uint8_t key); /* 获取按键状态 */
|
||||
uint8_t Input_IsKeyPressed(uint8_t key); /* 是否刚按下 */
|
||||
uint8_t Input_IsKeyHeld(uint8_t key); /* 是否长按 */
|
||||
uint8_t Input_IsKeyReleased(uint8_t key); /* 是否刚释放 */
|
||||
|
||||
/* ADC 读取 */
|
||||
uint16_t Input_GetADC(uint8_t ch); /* 读取指定通道原始值 */
|
||||
uint16_t Input_GetADC_Percent(uint8_t ch); /* 读取百分比 0-1000 */
|
||||
void Input_ReadAllADC(void); /* 读取所有 ADC 通道 */
|
||||
|
||||
/* ADC 值存储 (用于通道映射) */
|
||||
extern uint16_t adc_values[ADC_CHANNEL_COUNT];
|
||||
extern uint8_t key_values[4]; /* 按键数字值 (0/1) */
|
||||
|
||||
/* 引脚编码解码 */
|
||||
GPIO_TypeDef* Config_GetPort(uint16_t pin_code);
|
||||
uint16_t Config_GetPin(uint16_t pin_code);
|
||||
|
||||
#endif /* INPUT_H */
|
||||
86
Core/Inc/menu.h
Normal file
86
Core/Inc/menu.h
Normal file
@@ -0,0 +1,86 @@
|
||||
/**
|
||||
* 菜单系统与 UI 交互
|
||||
* 基于 OLED 128x64 的层级菜单
|
||||
* 支持: 模型选择、高频头配置、通道映射、混控、PWM驱动、首页设置
|
||||
*/
|
||||
#ifndef MENU_H
|
||||
#define MENU_H
|
||||
|
||||
#include "main.h"
|
||||
#include "oled.h"
|
||||
#include "input.h"
|
||||
#include "storage.h"
|
||||
#include "pwm_out.h"
|
||||
#include "nrf24l01.h"
|
||||
|
||||
/* 页面 ID */
|
||||
#define PAGE_HOME 0
|
||||
#define PAGE_MAIN_MENU 1
|
||||
#define PAGE_MODEL_LIST 2
|
||||
#define PAGE_MODEL_NEW 3
|
||||
#define PAGE_MODEL_EDIT 4
|
||||
#define PAGE_CHANNEL_MAP 5
|
||||
#define PAGE_MIXER 6
|
||||
#define PAGE_MIXER_EDIT 7
|
||||
#define PAGE_TELEM 8
|
||||
#define PAGE_RF_CONFIG 9
|
||||
#define PAGE_NRF_CONFIG 10
|
||||
#define PAGE_CRFS_CONFIG 11
|
||||
#define PAGE_PWM_CONFIG 12
|
||||
#define PAGE_HOME_SET 13
|
||||
#define PAGE_BIND 14
|
||||
#define PAGE_RF_QUICK 15
|
||||
|
||||
/* 菜单项最大数 */
|
||||
#define MENU_MAX_ITEMS 10
|
||||
|
||||
/* 菜单项结构 */
|
||||
typedef struct {
|
||||
const char *text;
|
||||
uint8_t target_page;
|
||||
void (*action)(void); /* 可选回调 */
|
||||
} MenuItem_t;
|
||||
|
||||
/* 页面上下文 */
|
||||
typedef struct {
|
||||
uint8_t page_id;
|
||||
uint8_t cursor; /* 当前选中项 */
|
||||
uint8_t scroll_offset; /* 滚动偏移 */
|
||||
uint8_t item_count;
|
||||
MenuItem_t items[MENU_MAX_ITEMS];
|
||||
uint8_t edit_idx; /* 编辑模式下的索引 */
|
||||
uint8_t edit_value; /* 编辑值 */
|
||||
char edit_str[16]; /* 编辑字符串 */
|
||||
uint8_t edit_str_len;
|
||||
} Page_t;
|
||||
|
||||
/* 函数声明 */
|
||||
void Menu_Init(void);
|
||||
void Menu_Run(void); /* 主循环调用 */
|
||||
|
||||
/* 页面渲染 */
|
||||
void Menu_DrawHome(void);
|
||||
void Menu_DrawMainMenu(void);
|
||||
void Menu_DrawModelList(void);
|
||||
void Menu_DrawModelNew(void);
|
||||
void Menu_DrawChannelMap(void);
|
||||
void Menu_DrawMixer(void);
|
||||
void Menu_DrawMixerEdit(void);
|
||||
void Menu_DrawRFConfig(void);
|
||||
void Menu_DrawNRFConfig(void);
|
||||
void Menu_DrawCRFSConfig(void);
|
||||
void Menu_DrawPWMConfig(void);
|
||||
void Menu_DrawHomeSet(void);
|
||||
void Menu_DrawBind(void);
|
||||
void Menu_DrawRFQuick(void);
|
||||
|
||||
/* 混控计算 */
|
||||
void Mixer_Compute(int16_t *channels);
|
||||
|
||||
/* 全局页面状态 */
|
||||
extern Page_t g_page;
|
||||
|
||||
/* 通道输出值 (混控后) */
|
||||
extern int16_t g_channels[CHANNEL_COUNT];
|
||||
|
||||
#endif /* MENU_H */
|
||||
114
Core/Inc/nrf24l01.h
Normal file
114
Core/Inc/nrf24l01.h
Normal file
@@ -0,0 +1,114 @@
|
||||
/**
|
||||
* NRF24L01+ 2.4G 无线模块驱动
|
||||
* 硬件 SPI1: PB3=SCK, PB4=MISO, PB5=MOSI
|
||||
* CE=PB7, CSN=PB6, IRQ=PD2
|
||||
*/
|
||||
#ifndef NRF24L01_H
|
||||
#define NRF24L01_H
|
||||
|
||||
#include "main.h"
|
||||
#include "spi.h"
|
||||
#include "config.h"
|
||||
|
||||
/* NRF24L01 寄存器地址 */
|
||||
#define NRF_CONFIG 0x00
|
||||
#define NRF_EN_AA 0x01
|
||||
#define NRF_EN_RXADDR 0x02
|
||||
#define NRF_SETUP_AW 0x03
|
||||
#define NRF_SETUP_RETR 0x04
|
||||
#define NRF_RF_CH 0x05
|
||||
#define NRF_RF_SETUP 0x06
|
||||
#define NRF_STATUS 0x07
|
||||
#define NRF_OBSERVE_TX 0x08
|
||||
#define NRF_RPD 0x09
|
||||
#define NRF_RX_ADDR_P0 0x0A
|
||||
#define NRF_RX_ADDR_P1 0x0B
|
||||
#define NRF_RX_ADDR_P2 0x0C
|
||||
#define NRF_RX_ADDR_P3 0x0D
|
||||
#define NRF_RX_ADDR_P4 0x0E
|
||||
#define NRF_RX_ADDR_P5 0x0F
|
||||
#define NRF_TX_ADDR 0x10
|
||||
#define NRF_RX_PW_P0 0x11
|
||||
#define NRF_RX_PW_P1 0x12
|
||||
#define NRF_RX_PW_P2 0x13
|
||||
#define NRF_RX_PW_P3 0x14
|
||||
#define NRF_RX_PW_P4 0x15
|
||||
#define NRF_RX_PW_P5 0x16
|
||||
#define NRF_FIFO_STATUS 0x17
|
||||
#define NRF_DYNPD 0x1C
|
||||
#define NRF_FEATURE 0x1D
|
||||
|
||||
/* 命令 */
|
||||
#define NRF_CMD_R_REGISTER 0x00
|
||||
#define NRF_CMD_W_REGISTER 0x20
|
||||
#define NRF_CMD_R_RX_PAYLOAD 0x61
|
||||
#define NRF_CMD_W_TX_PAYLOAD 0xA0
|
||||
#define NRF_CMD_FLUSH_TX 0xE1
|
||||
#define NRF_CMD_FLUSH_RX 0xE2
|
||||
#define NRF_CMD_REUSE_TX_PL 0xE3
|
||||
#define NRF_CMD_NOP 0xFF
|
||||
|
||||
/* 状态标志 */
|
||||
#define NRF_STATUS_RX_DR 0x40
|
||||
#define NRF_STATUS_TX_DS 0x20
|
||||
#define NRF_STATUS_MAX_RT 0x10
|
||||
|
||||
/* 数据速率 */
|
||||
#define NRF_RATE_250K 0x20
|
||||
#define NRF_RATE_1M 0x00
|
||||
#define NRF_RATE_2M 0x08
|
||||
|
||||
/* 发射功率 */
|
||||
#define NRF_PA_MIN 0x00
|
||||
#define NRF_PA_LOW 0x02
|
||||
#define NRF_PA_HIGH 0x04
|
||||
#define NRF_PA_MAX 0x06
|
||||
|
||||
/* 地址宽度 */
|
||||
#define NRF_ADDR_WIDTH 5
|
||||
|
||||
/* 最大通道数 */
|
||||
#define NRF_MAX_CHANNEL 125
|
||||
|
||||
/* 宏: 引脚操作 */
|
||||
#define NRF_CE_H() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET)
|
||||
#define NRF_CE_L() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET)
|
||||
#define NRF_CSN_H() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET)
|
||||
#define NRF_CSN_L() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET)
|
||||
#define NRF_IRQ_READ() HAL_GPIO_ReadPin(GPIOD, GPIO_PIN_2)
|
||||
|
||||
/* 函数声明 */
|
||||
void NRF24L01_Init(void);
|
||||
uint8_t NRF24L01_Check(void); /* 检测模块是否存在 */
|
||||
|
||||
/* 基本配置 */
|
||||
void NRF24L01_SetChannel(uint8_t ch);
|
||||
void NRF24L01_SetRate(uint8_t rate);
|
||||
void NRF24L01_SetPower(uint8_t power);
|
||||
void NRF24L01_SetTXAddr(const uint8_t *addr);
|
||||
void NRF24L01_SetRXAddr(uint8_t pipe, const uint8_t *addr);
|
||||
|
||||
/* 发送/接收 */
|
||||
void NRF24L01_TXMode(void);
|
||||
void NRF24L01_RXMode(void);
|
||||
uint8_t NRF24L01_TxPacket(const uint8_t *data, uint8_t len);
|
||||
uint8_t NRF24L01_RxPacket(uint8_t *data);
|
||||
uint8_t NRF24L01_IsDataReady(void);
|
||||
|
||||
/* 对频相关 */
|
||||
void NRF24L01_BindMode(void); /* 进入对频模式 */
|
||||
uint8_t NRF24L01_BindScan(uint8_t *found_addr); /* 扫描对频设备 */
|
||||
|
||||
/* 低层 SPI 操作 */
|
||||
uint8_t NRF24L01_ReadReg(uint8_t reg);
|
||||
void NRF24L01_WriteReg(uint8_t reg, uint8_t value);
|
||||
void NRF24L01_ReadBuf(uint8_t reg, uint8_t *buf, uint8_t len);
|
||||
void NRF24L01_WriteBuf(uint8_t reg, const uint8_t *buf, uint8_t len);
|
||||
|
||||
/* 全局状态 */
|
||||
extern uint8_t nrf_connected;
|
||||
extern uint8_t nrf_bind_phrase[7]; /* 对频短语, 最多6字符+'\0' */
|
||||
extern uint8_t nrf_channel;
|
||||
extern uint8_t nrf_tx_addr[NRF_ADDR_WIDTH];
|
||||
|
||||
#endif /* NRF24L01_H */
|
||||
65
Core/Inc/oled.h
Normal file
65
Core/Inc/oled.h
Normal file
@@ -0,0 +1,65 @@
|
||||
/**
|
||||
* OLED SSD1306 / SSD1315 128x64 I2C 驱动
|
||||
* 基于硬件 I2C2 (PB10=SCL, PB11=SDA)
|
||||
*
|
||||
* 芯片选择: 修改下方 OLED_CHIP 宏即可切换
|
||||
* OLED_CHIP_SSD1306 - 外部电荷泵 (0x8D 0x14)
|
||||
* OLED_CHIP_SSD1315 - 内置 DC-DC (0xAD 0x8A)
|
||||
*/
|
||||
#ifndef OLED_H
|
||||
#define OLED_H
|
||||
|
||||
#include "main.h"
|
||||
#include "i2c.h"
|
||||
|
||||
/* ---- 芯片选择 ---- */
|
||||
#define OLED_CHIP_SSD1306 0
|
||||
#define OLED_CHIP_SSD1315 1
|
||||
#define OLED_CHIP OLED_CHIP_SSD1315 /* 根据实际模块修改 */
|
||||
|
||||
#define OLED_ADDR 0x78 /* SSD1306 I2C 地址 (SA0=0) */
|
||||
#define OLED_WIDTH 128
|
||||
#define OLED_HEIGHT 64
|
||||
#define OLED_PAGES 8 /* 64/8 = 8 pages */
|
||||
|
||||
/* OLED 初始化 */
|
||||
void OLED_Init(void);
|
||||
|
||||
/* 基础操作 */
|
||||
void OLED_Clear(void);
|
||||
void OLED_Display(void); /* 刷新显存到屏幕 */
|
||||
void OLED_SetCursor(uint8_t x, uint8_t y); /* x:0-127, y:0-7(page) */
|
||||
|
||||
/* 绘制函数 */
|
||||
void OLED_DrawPixel(uint8_t x, uint8_t y, uint8_t color); /* y:0-63 */
|
||||
void OLED_DrawLine(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2);
|
||||
void OLED_DrawRect(uint8_t x, uint8_t y, uint8_t w, uint8_t h);
|
||||
void OLED_FillRect(uint8_t x, uint8_t y, uint8_t w, uint8_t h, uint8_t color);
|
||||
void OLED_DrawCircle(uint8_t cx, uint8_t cy, uint8_t r);
|
||||
|
||||
/* 文字绘制 */
|
||||
void OLED_ShowChar(uint8_t x, uint8_t y, char ch, uint8_t size); /* size:6或16 */
|
||||
void OLED_ShowString(uint8_t x, uint8_t y, const char *str, uint8_t size);
|
||||
void OLED_ShowNum(uint8_t x, uint8_t y, uint32_t num, uint8_t len, uint8_t size);
|
||||
|
||||
/* 汉字绘制 (使用 ui/words.h 中的字库) */
|
||||
void OLED_ShowCN(uint8_t x, uint8_t y, uint8_t index);
|
||||
|
||||
/* 图片绘制 */
|
||||
void OLED_DrawBitmap(uint8_t x, uint8_t y, const uint8_t *bmp, uint8_t w, uint8_t h);
|
||||
|
||||
/* 反色/滚动 */
|
||||
void OLED_InvertDisplay(uint8_t invert);
|
||||
void OLED_StartScrollRight(uint8_t start_page, uint8_t end_page);
|
||||
void OLED_StopScroll(void);
|
||||
|
||||
/* 进度条 */
|
||||
void OLED_DrawProgressBar(uint8_t x, uint8_t y, uint8_t w, uint8_t h, uint8_t percent);
|
||||
|
||||
/* 外部显存缓冲区 (128*64/8 = 1024 bytes) */
|
||||
extern uint8_t OLED_Buffer[OLED_WIDTH * OLED_HEIGHT / 8];
|
||||
|
||||
/* 开机图片 (来自 ui/image.h) */
|
||||
extern const unsigned char bitmap_bytes[];
|
||||
|
||||
#endif /* OLED_H */
|
||||
52
Core/Inc/protocol.h
Normal file
52
Core/Inc/protocol.h
Normal file
@@ -0,0 +1,52 @@
|
||||
/**
|
||||
* 协议层: 遥控信号打包/解包、SBUS 解析、USB HID Joystick
|
||||
* 统一管理 NRF24/CRFS/SBUS/USB 四种协议的数据流
|
||||
*/
|
||||
#ifndef PROTOCOL_H
|
||||
#define PROTOCOL_H
|
||||
|
||||
#include "main.h"
|
||||
#include "nrf24l01.h"
|
||||
#include "storage.h"
|
||||
#include "menu.h"
|
||||
|
||||
/* 数据包结构 (NRF24 协议) */
|
||||
#define RF_PACKET_SIZE 32
|
||||
#define RF_HEADER_SIZE 6
|
||||
|
||||
/* 数据包头 */
|
||||
#define RF_SYNC_BYTE0 0xAA
|
||||
#define RF_SYNC_BYTE1 0x55
|
||||
|
||||
/* SBUS 帧结构 */
|
||||
#define SBUS_FRAME_SIZE 25
|
||||
#define SBUS_BAUDRATE 100000
|
||||
|
||||
/* USB HID 报告大小 */
|
||||
#define HID_REPORT_SIZE 16
|
||||
|
||||
/* 函数声明 */
|
||||
void Protocol_Init(void);
|
||||
|
||||
/* RF 协议 */
|
||||
void Protocol_SendRFPacket(void); /* 发送 NRF24 数据包 */
|
||||
void Protocol_ProcessRF(void); /* 处理 RF 收发 */
|
||||
|
||||
/* SBUS 输入 */
|
||||
void Protocol_SBUS_Init(void);
|
||||
uint8_t Protocol_SBUS_Parse(const uint8_t *frame, int16_t *channels);
|
||||
|
||||
/* USB HID Joystick */
|
||||
void Protocol_HID_Init(void);
|
||||
void Protocol_HID_Send(void); /* 发送 HID 报告 */
|
||||
|
||||
/* 主循环调用 */
|
||||
void Protocol_Run(void);
|
||||
|
||||
/* 回传数据 */
|
||||
extern uint16_t telem_voltage; /* 电压 (mV) */
|
||||
extern uint8_t telem_rssi; /* RSSI */
|
||||
extern uint8_t telem_packet_loss; /* 丢包率 */
|
||||
extern uint16_t telem_temp; /* 温度 */
|
||||
|
||||
#endif /* PROTOCOL_H */
|
||||
58
Core/Inc/pwm_out.h
Normal file
58
Core/Inc/pwm_out.h
Normal file
@@ -0,0 +1,58 @@
|
||||
/**
|
||||
* PWM 输出与 LED 控制模块
|
||||
* TIM3 CH1/CH2/CH3 -> PC6/PC7/PC8 (LED 指示灯)
|
||||
* TIM4 CH3/CH4 -> PB8/PB9 (PWM_OUT1/2, 可配置 WS2812/LED/振动)
|
||||
*/
|
||||
#ifndef PWM_H
|
||||
#define PWM_H
|
||||
|
||||
#include "main.h"
|
||||
#include "tim.h"
|
||||
#include "config.h"
|
||||
|
||||
/* PWM 输出模式 */
|
||||
#define PWM_MODE_DISABLED 0
|
||||
#define PWM_MODE_WS2812 1
|
||||
#define PWM_MODE_LED 2
|
||||
#define PWM_MODE_VIBRATE 3
|
||||
|
||||
/* WS2812 模式 */
|
||||
#define WS2812_MODE_RAINBOW_BREATH 0
|
||||
#define WS2812_MODE_COLOR_FLOW 1
|
||||
#define WS2812_MODE_SINGLE_FLOW 2
|
||||
#define WS2812_MODE_SINGLE_BREATH 3
|
||||
#define WS2812_MODE_GRADIENT 4
|
||||
#define WS2812_MODE_STROBE 5
|
||||
#define WS2812_MODE_COUNT 6
|
||||
|
||||
/* LED 模式 */
|
||||
#define LED_MODE_BREATH 0
|
||||
#define LED_MODE_CONSTANT 1
|
||||
|
||||
/* 振动档位 */
|
||||
#define VIBRATE_LEVEL_MIN 1
|
||||
#define VIBRATE_LEVEL_MAX 9
|
||||
|
||||
/* 函数声明 */
|
||||
void PWM_Init(void);
|
||||
|
||||
/* LED 指示灯控制 */
|
||||
void LED_SetSystem(uint8_t on); /* 系统状态 LED (PC6) */
|
||||
void LED_SetNRF(uint8_t mode); /* NRF 状态 LED (PC7): 0=慢闪,1=快闪,2=常亮,3=灭 */
|
||||
void LED_SetCRFS(uint8_t mode); /* CRFS 状态 LED (PC8) */
|
||||
void LED_Update(void); /* 每 10ms 调用, 更新 LED 闪烁 */
|
||||
|
||||
/* PWM 输出控制 */
|
||||
void PWM_SetMode(uint8_t ch, uint8_t mode); /* ch: 0=PWM_OUT1, 1=PWM_OUT2 */
|
||||
void PWM_SetWS2812Mode(uint8_t mode); /* 设置 WS2812 效果模式 */
|
||||
void PWM_SetLEDBrightness(uint8_t brightness); /* 0-100 */
|
||||
void PWM_SetVibrateLevel(uint8_t level); /* 1-9 */
|
||||
|
||||
/* 配置存储 */
|
||||
extern uint8_t pwm1_mode;
|
||||
extern uint8_t pwm2_mode;
|
||||
extern uint8_t ws2812_effect;
|
||||
extern uint8_t led_brightness;
|
||||
extern uint8_t vibrate_level;
|
||||
|
||||
#endif /* PWM_H */
|
||||
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