Files
433_STM32/indexed-jingling-puffin.md
zhongxuanzhen 1c6ff020e9 3.24_433_TX版本:项目去UI化,删除OLED/菜单/按键,TX已验证,RX待验证
删除内容:
- 删除OLED显示相关代码(u8g2库、I2C接口)
- 删除按键输入相关代码(key.c)
- 删除菜单系统(MultMenu整个目录)
- 删除USB CDC功能(USB_DEVICE目录)
- 删除旧的E32演示代码(e32_demo.c/h)
保留内容:
- Driver_RF433核心驱动(已封装完整)
- rf433_tx_app.c(TX应用层,独立无UI依赖)
- rf433_rx_app.c(RX应用层,独立无UI依赖)
- GPIO LED指示功能(LED_TX/LED_RX)
2026-03-24 19:39:43 +08:00

1016 lines
26 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# E32-433TBH-SC 项目去UI化准备计划更新版
## 📋 执行摘要
**当前状态**项目已完成核心代码重构新的应用层rf433_tx_app.c 和 rf433_rx_app.c已实现且**完全不依赖OLED/Menu/USB**。
**待完成**清理遗留的UI代码和声明删除不再使用的文件确保项目干净独立。
---
## 一、项目背景与目标
### 背景
当前项目已经完成从旧代码到新Driver_RF433的迁移
- ✅ 新的 `rf433_tx_app.c``rf433_rx_app.c` 已创建并独立运行
-`main.c` 已更新使用新的应用层接口
- ✅ 新应用层完全无OLED/Menu/USB依赖
但项目中仍遗留大量旧的UI相关代码和声明需要清理。
### 目标
1. **删除所有UI相关代码**OLED显示、按键输入、菜单系统
2. **清理遗留声明**删除main.h和usart.c中的旧接口声明
3. **删除不再使用的文件**:确保项目干净
4. **保留核心功能**433通信功能完整独立
### 工作模式
- **TX设备**上电后自动循环发送测试数据LED_TX闪烁指示
- **RX设备**上电后自动接收数据LED_RX闪烁指示维护丢包统计
- **手动接口**提供API供外部代码触发单次发送/接收
---
## 二、当前状态分析 ✅
### 2.1 已完成的重构工作
**核心驱动**
-`Driver_RF433/` - 完整的RF433驱动实现
-`Driver_RF433/Inc/rf433_hal.h` - 硬件抽象层
-`Driver_RF433/Inc/rf433_hal.h` - 包含 `uart1_check_rx_done()` 兼容接口
-`Driver_RF433/Inc/rf433_config.h` - 配置和编译模式选择
**新应用层(已独立运行)**
-`Core/Src/rf433_tx_app.c` - TX应用层**无UI依赖**
-`Core/Inc/rf433_tx_app.h` - TX应用层接口
-`Core/Src/rf433_rx_app.c` - RX应用层**无UI依赖**
-`Core/Inc/rf433_rx_app.h` - RX应用层接口
**主程序已更新**
-`Core/Src/main.c` - 使用新的rf433_tx_app/rf433_rx_app接口
- ✅ 条件编译支持TX/RX/双模模式
- ✅ 主循环调用 `rf433_tx_app_task()``rf433_rx_app_task()`
**UART已集成**
-`Core/Src/usart.c` - 已集成 `rf433_hal_uart_rxcplt_callback()`
- ✅ HAL_UART_RxCpltCallback 调用 RF433层
### 2.2 遗留的依赖问题(需要清理)
**main.h 中的遗留声明** (Core/Inc/main.h):
```c
// 第36行: #include "application.h" - 旧的菜单应用
// 第41-42行: extern uint8_t my_usb_rx_data[]; extern uint16_t my_usb_rx_num;
// 第43-48行: key_name_t 枚举 - 按键相关
// 第93行: void usb_printf() - USB打印
// 第95-96行: void gpio_usb_ctrl_on/off() - USB控制
// 第106-108行: 按键相关函数声明
// 第119-122行: void e32_demo_*() - 旧的E32演示函数
```
**main.c 中的遗留代码** (Core/Src/main.c):
```c
// 第48行: #include "usbd_cdc_if.h" - USB CDC头文件
// 第49行: extern uint8_t usb_rx_data;
// 第100行: MX_USB_DEVICE_Init() - USB初始化
```
**usart.c 中的遗留代码** (Core/Src/usart.c):
```c
// 第25行: #include "usbd_cdc_if.h"
// 第28-29行: usb_rx_data 和 current_feature 变量
// 第157-167行: usb_receive_to_tx_send() 函数
```
**usart.h 中的遗留声明** (Core/Inc/usart.h):
```c
// 第32-37行: uart_feature 枚举和 current_feature 声明
// 第50行: usb_receive_to_tx_send() 函数声明
```
---
## 三、需要删除的文件清单
### 3.1 整个目录删除
```
Middlewares/MultMenu/ ← 菜单系统(整个目录)
├── menu/
│ ├── menu.c
│ ├── menu.h
│ └── menuConfig.h
├── application/
│ ├── application.c
│ └── application.h
└── disp/
├── dispDirver.c
└── dispDirver.h
Middlewares/u8g2Lib/ ← OLED图形库整个目录
├── inc/
│ ├── u8g2.h
│ ├── u8x8.h
│ └── ...
└── src/
├── u8g2_*.c
└── u8x8_*.c
USB_DEVICE/ ← USB设备可选删除如需调试保留
├── App/
└── Target/
Middlewares/ST/STM32_USB_Device_Library/ ← USB库可选删除
```
### 3.2 单个文件删除
**OLED相关**:
- `Core/Src/u8g2_hal.c`
- `Core/Inc/u8g2_hal.h`
- `Core/Src/i2c.c` ← I2C仅用于OLED
- `Core/Inc/i2c.h`
**按键相关**:
- `Core/Src/key.c`
- `Core/Inc/key.h`
**旧的E32驱动**:
- `Core/Src/e32_demo.c`
- `Core/Inc/e32_demo.h`
- `Core/Src/e32_hal.c`
- `Core/Inc/e32_hal.h`
**FIFO缓冲**:
- `Core/Src/fifo.c` ← 已集成到Driver_RF433
- `Core/Inc/fifo.h`
### 3.3 可以安全删除(已在新驱动中实现)
以下功能已在 `Driver_RF433/` 中完整实现,旧文件可以删除:
| 旧文件/功能 | 新实现位置 | 状态 |
|------------|-----------|------|
| `e32_hal.c/h` | `Driver_RF433/Src/rf433_hal.c` | ✅ 已迁移 |
| `e32_demo.c/h` | `Driver_RF433/Src/rf433.c` | ✅ 已迁移 |
| `fifo.c/h` | `Driver_RF433/Src/rf433_hal.c` (内部实现) | ✅ 已集成 |
| `uart1_check_rx_done()` | `Driver_RF433/Src/rf433_hal.c:452` | ✅ 已实现 |
---
## 四、清理步骤详解
### 步骤1清理main.h中的遗留声明
**文件**: `Core/Inc/main.h`
**删除以下内容**:
```c
// 第36行 - 删除旧的菜单应用包含
#include "application.h"
// 第41-48行 - 删除USB和按键相关
extern uint8_t my_usb_rx_data[ ];
extern uint16_t my_usb_rx_num ;
typedef enum {
KEY_NAME_UP = 0,
KEY_NAME_DOWN ,
KEY_NAME_ENTER,
}key_name_t;
// 第93-122行 - 删除所有遗留函数声明
void usb_printf(const char *format, ...);
void gpio_usb_ctrl_on(void);
void gpio_usb_ctrl_off(void);
void buzzer_on(void);
void buzzer_off(void);
void buzzer_button_press(void);
bool key_check_press( key_name_t name );
void key_set_continue( key_name_t name , bool enable );
void key_timer_1ms_interrupt_callback(void);
void uart1_reconfig( uint32_t rate );
void uart1_rx_timeout_1ms_callback(void);
void uart1_wait_response_blocked( uint8_t * buffer, uint16_t *length );
bool uart1_check_rx_done( uint8_t *buffer , uint32_t *length );
void e32_demo_read_device_name( char *buffer , uint8_t *length );
void e32_demo_read_fireware_version( char *buffer , uint8_t *length);
void e32_demo_menu_config( menu_config_t *config );
void e32_demo_transmit( uint8_t *buffer , uint16_t length );
```
**保留的GPIO定义**用于LED指示:
```c
#define LED_TX_Pin GPIO_PIN_15
#define LED_TX_GPIO_Port GPIOA
#define LED_RX_Pin GPIO_PIN_6
#define LED_RX_GPIO_Port GPIOB
```
### 步骤2清理main.c中的遗留代码
**文件**: `Core/Src/main.c`
**删除以下内容**:
```c
// 第48行 - 删除USB CDC头文件
#include "usbd_cdc_if.h"
// 第49行 - 删除USB数据变量声明
extern uint8_t usb_rx_data;
// 第100行 - 删除USB初始化
MX_USB_DEVICE_Init();
```
**保留的初始化**:
```c
MX_GPIO_Init(); // GPIO控制LED等
MX_USART1_UART_Init(); // UART通信RF433
MX_TIM2_Init(); // 定时器(超时检测)
```
### 步骤3清理usart.c中的遗留代码
**文件**: `Core/Src/usart.c`
**删除以下内容**:
```c
// 第25行 - 删除USB CDC头文件
#include "usbd_cdc_if.h"
// 第28-29行 - 删除USB和功能标志变量
uint8_t usb_rx_data;
uart_feature current_feature = FUNC_FEATURE1;
// 第157-167行 - 删除USB桥接函数
void usb_receive_to_tx_send( void ) {
// 整个函数删除
}
```
### 步骤4清理usart.h中的遗留声明
**文件**: `Core/Inc/usart.h`
**删除以下内容**:
```c
// 第32-37行 - 删除uart_feature枚举
typedef enum {
FUNC_NONE = 0,
FUNC_FEATURE1,
FUNC_FEATURE2
} uart_feature;
extern uart_feature current_feature;
// 第50行 - 删除USB桥接函数声明
void usb_receive_to_tx_send( void );
```
### 步骤5删除Keil项目中的文件
从Keil项目中移除以下文件组
**删除文件组**:
- `Middlewares/MultMenu`
- `Middlewares/u8g2Lib`
- `USB_DEVICE`
- `Middlewares/ST/STM32_USB_Device_Library`
**删除单个文件**从Application/User组:
- `u8g2_hal.c`
- `i2c.c`
- `key.c`
- `e32_demo.c`
- `e32_hal.c`
- `fifo.c`
### 步骤6更新编译配置
**删除Include路径**:
- `../Middlewares/MultMenu/application`
- `../Middlewares/MultMenu/menu`
- `../Middlewares/MultMenu/disp`
- `../Middlewares/u8g2Lib/inc`
- `../USB_DEVICE/App`
- `../USB_DEVICE/Target`
- `../Middlewares/ST/STM32_USB_Device_Library/Core/Inc`
- `../Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc`
**删除Preprocessor Macros**(如果有):
- `USE_USB`
- `USE_HAL_PCD`
---
## 五、验证清单
清理完成后,验证以下项目:
- [ ] 编译无错误
- [ ] 编译无警告
- [ ] TX模式下能正常发送数据
- [ ] RX模式下能正常接收数据
- [ ] LED指示正常工作
- [ ] 没有未使用的变量警告
- [ ] 没有未使用的函数警告
- [ ] 没有缺失的头文件错误
---
## 六、回滚计划
如果删除后出现问题:
1. **使用Git恢复**
```bash
git checkout HEAD -- <文件路径>
```
2. **重新添加文件到项目**
- 打开Keil项目
- 添加必要的文件回项目
3. **关键备份点**
- 删除前提交当前代码到Git
- 保留原始代码分支
---
## 七、总结
### 2.1 TX模式实现application.c: 442-499
**状态机流程**
```
TX_MODE_INIT → TX_MODE_SEND → TX_MODE_WAIT → TX_MODE_END
```
**核心代码路径**
- `tx_mode_callback()` - 主状态机
- `tx_e32_send()` - 发送数据
- `e32_demo_menu_config()` - 配置模块
- `e32_demo_transmit()` - 底层发送
**数据包格式**
```c
"TX.总次数.当前序号." // 例如: "TX.010.001."
```
**配置参数**menu_config_t
```c
typedef struct {
int work_mode; // 工作模式 (0-3)
int rate_mode; // 空速模式 (2-5)
int channel; // 信道 (0-41)
int tx_power; // 发射功率 (21/24/27/30)
int tx_count; // 发送次数 (10-100)
} menu_config_t;
```
### 2.2 RX模式实现application.c: 619-719
**状态机流程**
```
RX_MODE_INIT → RX_MODE_RECV → RX_MODE_WAIT → RX_MODE_END
```
**核心代码路径**
- `rx_mode_callback()` - 主状态机
- `rx_analysis()` - 数据包解析
- `rx_mode_display()` - 丢包统计
- `uart1_check_rx_done()` - 接收检查
**丢包统计算法**
```c
lost_number = tx_number_record - rx_count;
lost_percent = (lost_number * 100) / tx_number_record;
```
### 2.3 RF433驱动层状态
**已完成的重构**
- `Driver_RF433/Inc/rf433_hal.h` - 硬件抽象层接口
- `Driver_RF433/Src/rf433_hal.c` - 硬件抽象层实现
- `Driver_RF433/Inc/rf433.h` - 主驱动接口
- `Driver_RF433/Src/rf433.c` - 主驱动实现
**已实现的API**
```c
// 初始化和配置
rf433_init()
rf433_set_config()
rf433_set_work_mode()
// TX功能
rf433_transmit()
// RX功能
rf433_rx_start()
rf433_rx_stop()
rf433_receive()
```
---
## 三、需要删除的UI相关代码
### 3.1 OLED显示相关需完全删除
**文件列表**
- `Core/Src/u8g2_hal.c` - OLED硬件接口
- `Core/Inc/u8g2_hal.h`
- `Core/Src/i2c.c` - I2C接口仅用于OLED
- `Core/Inc/i2c.h`
- `Middlewares/u8g2Lib/` - 整个U8g2图形库
**删除的函数调用**
```c
// 这些调用需要删除
OLED_ClearBuffer()
OLED_DrawStr()
OLED_DrawLine()
OLED_SendBuffer()
OLED_SetDrawColor()
OLED_DrawBox()
OLED_DrawXBMP()
```
### 3.2 按键输入相关(需完全删除)
**文件列表**
- `Core/Src/key.c` - 按键处理
- `Core/Inc/key.h`
**删除的函数调用**
```c
key_check_press()
key_set_continue()
```
### 3.3 菜单系统相关(需完全删除)
**文件列表**
- `Middlewares/MultMenu/menu/menu.c` - 菜单核心
- `Middlewares/MultMenu/menu/menu.h`
- `Middlewares/MultMenu/menu/menuConfig.h`
- `Middlewares/MultMenu/application/application.c` - 菜单应用
- `Middlewares/MultMenu/application/application.h`
- `Middlewares/MultMenu/disp/dispDirver.c` - 显示驱动
- `Middlewares/MultMenu/disp/dispDirver.h`
**删除的函数调用**
```c
Menu_Init()
Menu_Task()
AddItem()
// 所有 xxx_callback() 函数
```
### 3.4 需要保留的核心文件
**RF433驱动**
- `Driver_RF433/` - 整个目录保留
**底层硬件**
- `Core/Src/usart.c` - UART通信已集成RF433
- `Core/Src/fifo.c` - FIFO缓冲
- `Core/Src/gpio.c` - GPIO控制
- `Core/Src/tim.c` - 定时器(用于超时检测)
**USB CDC**
- `USB_DEVICE/` - 保留用于调试输出(可选)
**系统文件**
- `Core/Src/main.c` - 主程序
- `Core/Src/stm32f1xx_it.c` - 中断处理
- `Core/Src/systick.c` - 系统定时器
---
## 四、核心功能提取方案
### 4.1 TX模式提取
**创建新文件**`Core/Src/rf433_tx_app.c`
**核心功能**
```c
// TX状态机
typedef enum {
TX_STATE_INIT = 0,
TX_STATE_SENDING,
TX_STATE_WAITING,
TX_STATE_IDLE,
} tx_state_t;
// TX应用结构体
typedef struct {
tx_state_t state;
uint32_t send_count;
uint32_t total_count;
uint32_t send_interval_ms;
uint32_t last_send_time;
rf433_register_t config;
} rf433_tx_app_t;
// 核心API
rf433_error_t rf433_tx_app_init(const rf433_register_t *config);
rf433_error_t rf433_tx_app_start(uint32_t count, uint32_t interval_ms);
rf433_error_t rf433_tx_app_stop(void);
rf433_error_t rf433_tx_app_manual_send(uint8_t *data, uint16_t length);
void rf433_tx_app_task(void); // 主循环调用
```
**实现要点**
1. 去除所有OLED显示调用替换为LED控制
2. 去除按键检测改为自动循环或手动API触发
3. 保留数据包构造逻辑:`sprintf(buffer, "TX.%03d.%03d.", total, current)`
4. 保留配置流程:调用`rf433_set_config()`设置模块参数
5. 保留LED指示发送时LED_TX亮起
### 4.2 RX模式提取
**创建新文件**`Core/Src/rf433_rx_app.c`
**核心功能**
```c
// RX状态机
typedef enum {
RX_STATE_INIT = 0,
RX_STATE_RECEIVING,
RX_STATE_IDLE,
} rx_state_t;
// RX统计结构体
typedef struct {
uint32_t total_received;
uint32_t total_expected;
uint32_t lost_packets;
uint8_t lost_percent;
} rf433_rx_stats_t;
// RX应用结构体
typedef struct {
rx_state_t state;
rf433_rx_stats_t stats;
uint32_t tx_current_number;
uint32_t tx_total_number;
uint32_t tx_number_record;
rf433_register_t config;
} rf433_rx_app_t;
// 核心API
rf433_error_t rf433_rx_app_init(const rf433_register_t *config);
rf433_error_t rf433_rx_app_start(void);
rf433_error_t rf433_rx_app_stop(void);
void rf433_rx_app_task(void); // 主循环调用
rf433_error_t rf433_rx_app_get_stats(rf433_rx_stats_t *stats);
```
**实现要点**
1. 去除所有OLED显示调用替换为LED控制
2. 保留数据包解析:校验"TX"前缀,提取序号
3. 保留丢包统计算法
4. 保留LED指示接收时LED_RX闪烁
5. 提供API获取统计信息供外部查询
### 4.3 配置文件支持
**创建新文件**`Core/Src/rf433_config_file.c`
**功能实现**
```c
// Flash配置结构体对齐Flash扇区
typedef struct {
uint32_t magic; // 魔数标识 0xA5A5A5A5
uint32_t version; // 配置版本
rf433_register_t rf_config; // RF433配置
uint32_t tx_count; // 发送次数
uint32_t tx_interval; // 发送间隔
uint8_t work_mode; // 工作模式
uint8_t reserved[7]; // 对齐到16字节
uint32_t crc; // CRC校验
} rf433_flash_config_t;
// 核心API
rf433_error_t rf433_config_load(rf433_flash_config_t *config);
rf433_error_t rf433_config_save(const rf433_flash_config_t *config);
rf433_error_t rf433_config_reset_to_default(rf433_flash_config_t *config);
```
**Flash地址规划**
- 使用STM32的最后一页Flash如0x0800FC00-0x08010000
- 配置大小64字节单页足够
- 提供默认配置,首次启动时自动写入
### 4.4 手动接口API
**创建新文件**`Core/Inc/rf433_manual.h`
**接口定义**
```c
// 手动发送接口
rf433_error_t rf433_manual_send(uint8_t *data, uint16_t length);
// 手动接收接口(阻塞模式)
rf433_error_t rf433_manual_recv(uint8_t *buffer, uint16_t max_len,
uint16_t *actual_len, uint32_t timeout);
// 获取RX统计信息
rf433_error_t rf433_manual_get_rx_stats(rf433_rx_stats_t *stats);
// 重置统计信息
rf433_error_t rf433_manual_reset_stats(void);
```
---
## 五、编译模式配置
### 5.1 预编译宏定义
在`rf433_config.h`中定义:
```c
// 工作模式选择(三选一)
#define RF433_WORK_MODE_TX 1 // 仅TX模式
#define RF433_WORK_MODE_RX 2 // 仅RX模式
#define RF433_WORK_MODE_DUAL 3 // 双模模式同时支持TX和RX
// 当前工作模式(在编译选项中定义)
#ifndef RF433_MODE
#define RF433_MODE RF433_WORK_MODE_TX // 默认TX模式
#endif
// 功能裁剪
#define RF433_ENABLE_CONFIG_FILE 1 // 启用配置文件
#define RF433_ENABLE_LED_INDICATOR 1 // 启用LED指示
#define RF433_ENABLE_USB_DEBUG 0 // 禁用USB调试可选
```
### 5.2 Keil项目配置
**TX设备配置**
- Preprocessor Symbols: `RF433_MODE=1`
- 保留文件:`rf433_tx_app.c`
- 排除文件:`rf433_rx_app.c`(或通过条件编译)
**RX设备配置**
- Preprocessor Symbols: `RF433_MODE=2`
- 保留文件:`rf433_rx_app.c`
- 排除文件:`rf433_tx_app.c`(或通过条件编译)
**双模设备配置**
- Preprocessor Symbols: `RF433_MODE=3`
- 保留文件:`rf433_tx_app.c`、`rf433_rx_app.c`
### 5.3 条件编译示例
```c
#if (RF433_MODE == RF433_WORK_MODE_TX) || (RF433_MODE == RF433_WORK_MODE_DUAL)
// TX相关代码
#include "rf433_tx_app.h"
#endif
#if (RF433_MODE == RF433_WORK_MODE_RX) || (RF433_MODE == RF433_WORK_MODE_DUAL)
// RX相关代码
#include "rf433_rx_app.h"
#endif
```
---
## 六、main.c重构方案
### 6.1 初始化流程
```c
int main(void) {
HAL_Init();
SystemClock_Config();
// 硬件初始化(保留必要部分)
MX_GPIO_Init();
MX_USART1_UART_Init();
MX_TIM2_Init(); // 用于超时检测
#if RF433_ENABLE_USB_DEBUG
MX_USB_DEVICE_Init();
#endif
// 加载配置文件
rf433_flash_config_t config;
if (rf433_config_load(&config) != RF433_OK) {
// 加载失败,使用默认配置
rf433_config_reset_to_default(&config);
rf433_config_save(&config);
}
// 初始化RF433模块
rf433_init(&config.rf_config);
// 初始化TX/RX应用层
#if (RF433_MODE == RF433_WORK_MODE_TX) || (RF433_MODE == RF433_WORK_MODE_DUAL)
rf433_tx_app_init(&config.rf_config);
rf433_tx_app_start(config.tx_count, config.tx_interval);
#endif
#if (RF433_MODE == RF433_WORK_MODE_RX) || (RF433_MODE == RF433_WORK_MODE_DUAL)
rf433_rx_app_init(&config.rf_config);
rf433_rx_app_start();
#endif
// 启动UART接收
HAL_UART_Receive_IT(&huart1, &usb_rx_data, 1);
// 主循环
while (1) {
#if (RF433_MODE == RF433_WORK_MODE_TX) || (RF433_MODE == RF433_WORK_MODE_DUAL)
rf433_tx_app_task();
#endif
#if (RF433_MODE == RF433_WORK_MODE_RX) || (RF433_MODE == RF433_WORK_MODE_DUAL)
rf433_rx_app_task();
#endif
HAL_Delay(1);
}
}
```
### 6.2 删除的内容
```c
// 删除这些初始化
// MX_I2C2_Init(); // OLED用的I2C
// Menu_Init(); // 菜单初始化
// 删除主循环中的这些调用
// Menu_Task(); // 菜单任务
// usb_receive_to_tx_send(); // USB桥接可选保留
```
---
## 七、实施步骤
### 阶段1准备工作1-2小时
- [ ] 创建新文件模板
- `Core/Src/rf433_tx_app.c`
- `Core/Src/rf433_rx_app.c`
- `Core/Src/rf433_config_file.c`
- `Core/Inc/rf433_manual.h`
- [ ] 备份原项目代码
- [ ] 创建新的Keil项目配置TX/RX版本
### 阶段2TX功能提取2-3小时
- [ ] 从`application.c`提取`tx_mode_callback`核心逻辑
- [ ] 实现`rf433_tx_app.c`
- 状态机(去除菜单相关)
- 自动发送逻辑
- LED指示
- 手动发送接口
- [ ] 测试TX功能
### 阶段3RX功能提取2-3小时
- [ ] 从`application.c`提取`rx_mode_callback`核心逻辑
- [ ] 实现`rf433_rx_app.c`
- 状态机(去除菜单相关)
- 数据包解析
- 丢包统计
- LED指示
- 统计查询接口
- [ ] 测试RX功能
### 阶段4配置文件实现2-3小时
- [ ] 实现Flash读写函数
- [ ] 定义默认配置
- [ ] 实现配置加载/保存
- [ ] 测试配置持久化
### 阶段5删除UI代码1-2小时
- [ ] 删除OLED相关文件和调用
- [ ] 删除按键相关文件和调用
- [ ] 删除菜单系统文件和调用
- [ ] 清理main.c初始化代码
- [ ] 编译测试,确保无错误
### 阶段6集成测试2-3小时
- [ ] TX模式测试
- 自动循环发送
- LED指示正常
- 手动发送接口测试
- [ ] RX模式测试
- 自动接收
- 丢包统计准确
- LED指示正常
- [ ] 双模模式测试
- [ ] 配置文件测试
- 默认配置加载
- 配置修改和保存
- 配置恢复默认值
### 阶段7优化和文档1-2小时
- [ ] 代码优化和注释
- [ ] 编写使用说明
- [ ] 更新项目文档
- [ ] 创建编译配置说明
**总计时间11-18小时**
---
## 八、测试验证方案
### 8.1 TX模式测试
**测试项目**
1. 上电自动启动发送
2. 按配置间隔循环发送
3. LED_TX闪烁指示
4. 发送计数正确
5. 数据包格式正确:"TX.010.001."
6. 手动发送接口正常工作
**测试方法**
- 使用逻辑分析仪或示波器观察UART输出
- 使用另一台RX设备接收并验证
- 观察LED指示
### 8.2 RX模式测试
**测试项目**
1. 上电自动启动接收
2. 正确解析数据包
3. 丢包统计准确
4. LED_RX闪烁指示
5. 统计查询接口返回正确数据
**测试方法**
- 使用TX设备发送测试数据
- 通过LED观察接收状态
- 通过手动接口查询统计信息
### 8.3 配置文件测试
**测试项目**
1. 首次启动写入默认配置
2. 修改配置后重启,配置保持
3. 配置损坏时自动恢复默认值
4. 配置CRC校验正确
**测试方法**
- 修改配置参数
- 断电重启
- 读取Flash验证
---
## 九、关键文件清单
### 9.1 需要创建的文件
| 文件路径 | 功能描述 | 代码量估算 |
|---------|---------|-----------|
| `Core/Src/rf433_tx_app.c` | TX应用层实现 | ~300行 |
| `Core/Inc/rf433_tx_app.h` | TX应用层接口 | ~80行 |
| `Core/Src/rf433_rx_app.c` | RX应用层实现 | ~400行 |
| `Core/Inc/rf433_rx_app.h` | RX应用层接口 | ~100行 |
| `Core/Src/rf433_config_file.c` | 配置文件实现 | ~200行 |
| `Core/Inc/rf433_config_file.h` | 配置文件接口 | ~60行 |
| `Core/Inc/rf433_manual.h` | 手动接口定义 | ~50行 |
### 9.2 需要修改的文件
| 文件路径 | 修改内容 | 变更量 |
|---------|---------|--------|
| `Core/Src/main.c` | 重构初始化和主循环 | -50行+100行 |
| `Core/Src/usart.c` | 保留RF433集成删除USB桥接 | -20行 |
| `Core/Inc/main.h` | 删除UI相关定义 | -30行 |
### 9.3 需要删除的文件
**整个目录删除**
- `Middlewares/MultMenu/` (整个菜单系统)
- `Middlewares/u8g2Lib/` OLED图形库
**单个文件删除**
- `Core/Src/u8g2_hal.c`
- `Core/Inc/u8g2_hal.h`
- `Core/Src/i2c.c`
- `Core/Inc/i2c.h`
- `Core/Src/key.c`
- `Core/Inc/key.h`
### 预期成果
清理完成后,项目将获得:
1. **代码精简**
- Flash占用减少约 **30KB**去除UI库
- RAM占用减少约 **5KB**
- 编译时间缩短
2. **架构清晰**
- 只保留 `Driver_RF433/` 和 `Core/` 中的核心代码
- 应用层 `rf433_tx_app` 和 `rf433_rx_app` 完全独立
- 无任何UI依赖
3. **易于集成**
- 纯粹的RF433通信模块
- 清晰的API接口
- 支持TX/RX/双模三种编译模式
4. **维护性强**
- 代码结构清晰
- 依赖关系明确
- 便于后续功能扩展
---
## 八、关键文件路径速查
### 新架构核心文件(保留)
```
✅ Driver_RF433/
├── Inc/
│ ├── rf433.h # 主驱动接口
│ ├── rf433_hal.h # 硬件抽象层
│ └── rf433_config.h # 配置文件
└── Src/
├── rf433.c
└── rf433_hal.c
✅ Core/Src/
├── main.c # 主程序(已更新)
├── usart.c # UART通信需清理
├── gpio.c # GPIO控制保留LED相关
├── tim.c # 定时器
├── rf433_tx_app.c # TX应用层
└── rf433_rx_app.c # RX应用层
✅ Core/Inc/
├── main.h # 主头文件(需清理)
├── rf433_tx_app.h
└── rf433_rx_app.h
```
### 待删除文件/目录
```
❌ Middlewares/MultMenu/ # 整个目录删除
❌ Middlewares/u8g2Lib/ # 整个目录删除
❌ USB_DEVICE/ # 可选删除(如需调试保留)
❌ Core/Src/u8g2_hal.c
❌ Core/Src/i2c.c
❌ Core/Src/key.c
❌ Core/Src/e32_demo.c
❌ Core/Src/e32_hal.c
❌ Core/Src/fifo.c
```
---
## 九、执行时间估算
| 步骤 | 操作 | 时间 |
|------|------|------|
| 1 | 清理main.h声明 | 5分钟 |
| 2 | 清理main.c代码 | 5分钟 |
| 3 | 清理usart.c代码 | 5分钟 |
| 4 | 清理usart.h声明 | 3分钟 |
| 5 | 从Keil删除文件 | 5分钟 |
| 6 | 更新编译配置 | 5分钟 |
| 7 | 编译验证 | 5分钟 |
| 8 | 功能测试 | 15分钟 |
| **总计** | | **48分钟** |
---
## 十、注意事项
1. **删除前备份**
- 使用Git提交当前代码
- 或手动备份项目文件夹
2. **分步执行**
- 建议按步骤顺序执行
- 每步完成后编译验证
- 确保无错误再进行下一步
3. **USB调试保留**
- 如果需要USB调试输出可保留 `USB_DEVICE/`
- 相应保留 `main.c` 中的 `MX_USB_DEVICE_Init()`
4. **LED功能保留**
- `gpio_led_tx_on/off()` 和 `gpio_led_rx_on/off()` 必须保留
- 这些函数在新应用层中被使用
---
**计划版本**: v2.0(基于当前代码状态)
**更新时间**: 2025-03-24
**适用项目**: E32-433TBH-SC RF433无线通信模块