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

26 KiB
Raw Blame History

E32-433TBH-SC 项目去UI化准备计划更新版

📋 执行摘要

当前状态项目已完成核心代码重构新的应用层rf433_tx_app.c 和 rf433_rx_app.c已实现且完全不依赖OLED/Menu/USB

待完成清理遗留的UI代码和声明删除不再使用的文件确保项目干净独立。


一、项目背景与目标

背景

当前项目已经完成从旧代码到新Driver_RF433的迁移

  • 新的 rf433_tx_app.crf433_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):

// 第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):

// 第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):

// 第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):

// 第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

删除以下内容:

// 第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指示:

#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

删除以下内容:

// 第48行 - 删除USB CDC头文件
#include "usbd_cdc_if.h"

// 第49行 - 删除USB数据变量声明
extern uint8_t usb_rx_data;

// 第100行 - 删除USB初始化
MX_USB_DEVICE_Init();

保留的初始化:

MX_GPIO_Init();         // GPIO控制LED等
MX_USART1_UART_Init();  // UART通信RF433
MX_TIM2_Init();         // 定时器(超时检测)

步骤3清理usart.c中的遗留代码

文件: Core/Src/usart.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

删除以下内容:

// 第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恢复

    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() - 底层发送

数据包格式

"TX.总次数.当前序号."  // 例如: "TX.010.001."

配置参数menu_config_t

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() - 接收检查

丢包统计算法

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

// 初始化和配置
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图形库

删除的函数调用

// 这些调用需要删除
OLED_ClearBuffer()
OLED_DrawStr()
OLED_DrawLine()
OLED_SendBuffer()
OLED_SetDrawColor()
OLED_DrawBox()
OLED_DrawXBMP()

3.2 按键输入相关(需完全删除)

文件列表

  • Core/Src/key.c - 按键处理
  • Core/Inc/key.h

删除的函数调用

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

删除的函数调用

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

核心功能

// 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

核心功能

// 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

功能实现

// 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

接口定义

// 手动发送接口
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中定义:

// 工作模式选择(三选一)
#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.crf433_rx_app.c

5.3 条件编译示例

#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 初始化流程

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 删除的内容

// 删除这些初始化
// 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_apprf433_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无线通信模块