# 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版本) ### 阶段2:TX功能提取(2-3小时) - [ ] 从`application.c`提取`tx_mode_callback`核心逻辑 - [ ] 实现`rf433_tx_app.c`: - 状态机(去除菜单相关) - 自动发送逻辑 - LED指示 - 手动发送接口 - [ ] 测试TX功能 ### 阶段3:RX功能提取(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无线通信模块