2026-03-24 19:39:43 +08:00
|
|
|
|
# E32-433TBH-SC 项目去UI化准备计划(更新版)
|
|
|
|
|
|
|
|
|
|
|
|
## 📋 执行摘要
|
|
|
|
|
|
|
|
|
|
|
|
**当前状态**:项目已完成核心代码重构,新的应用层(rf433_tx_app.c 和 rf433_rx_app.c)已实现且**完全不依赖OLED/Menu/USB**。
|
|
|
|
|
|
|
|
|
|
|
|
**待完成**:清理遗留的UI代码和声明,删除不再使用的文件,确保项目干净独立。
|
|
|
|
|
|
|
|
|
|
|
|
---
|
2026-03-24 16:59:20 +08:00
|
|
|
|
|
|
|
|
|
|
## 一、项目背景与目标
|
|
|
|
|
|
|
|
|
|
|
|
### 背景
|
2026-03-24 19:39:43 +08:00
|
|
|
|
当前项目已经完成从旧代码到新Driver_RF433的迁移:
|
|
|
|
|
|
- ✅ 新的 `rf433_tx_app.c` 和 `rf433_rx_app.c` 已创建并独立运行
|
|
|
|
|
|
- ✅ `main.c` 已更新使用新的应用层接口
|
|
|
|
|
|
- ✅ 新应用层完全无OLED/Menu/USB依赖
|
|
|
|
|
|
|
|
|
|
|
|
但项目中仍遗留大量旧的UI相关代码和声明需要清理。
|
2026-03-24 16:59:20 +08:00
|
|
|
|
|
|
|
|
|
|
### 目标
|
|
|
|
|
|
1. **删除所有UI相关代码**:OLED显示、按键输入、菜单系统
|
2026-03-24 19:39:43 +08:00
|
|
|
|
2. **清理遗留声明**:删除main.h和usart.c中的旧接口声明
|
|
|
|
|
|
3. **删除不再使用的文件**:确保项目干净
|
|
|
|
|
|
4. **保留核心功能**:433通信功能完整独立
|
2026-03-24 16:59:20 +08:00
|
|
|
|
|
|
|
|
|
|
### 工作模式
|
|
|
|
|
|
- **TX设备**:上电后自动循环发送测试数据,LED_TX闪烁指示
|
|
|
|
|
|
- **RX设备**:上电后自动接收数据,LED_RX闪烁指示,维护丢包统计
|
|
|
|
|
|
- **手动接口**:提供API供外部代码触发单次发送/接收
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
2026-03-24 19:39:43 +08:00
|
|
|
|
## 二、当前状态分析 ✅
|
|
|
|
|
|
|
|
|
|
|
|
### 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
|
|
|
|
|
|
- 保留原始代码分支
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 七、总结
|
2026-03-24 16:59:20 +08:00
|
|
|
|
|
|
|
|
|
|
### 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`
|
|
|
|
|
|
|
2026-03-24 19:39:43 +08:00
|
|
|
|
### 预期成果
|
|
|
|
|
|
|
|
|
|
|
|
清理完成后,项目将获得:
|
|
|
|
|
|
|
|
|
|
|
|
1. **代码精简**:
|
|
|
|
|
|
- Flash占用减少约 **30KB**(去除UI库)
|
|
|
|
|
|
- RAM占用减少约 **5KB**
|
|
|
|
|
|
- 编译时间缩短
|
|
|
|
|
|
|
|
|
|
|
|
2. **架构清晰**:
|
|
|
|
|
|
- 只保留 `Driver_RF433/` 和 `Core/` 中的核心代码
|
|
|
|
|
|
- 应用层 `rf433_tx_app` 和 `rf433_rx_app` 完全独立
|
|
|
|
|
|
- 无任何UI依赖
|
|
|
|
|
|
|
|
|
|
|
|
3. **易于集成**:
|
|
|
|
|
|
- 纯粹的RF433通信模块
|
|
|
|
|
|
- 清晰的API接口
|
|
|
|
|
|
- 支持TX/RX/双模三种编译模式
|
|
|
|
|
|
|
|
|
|
|
|
4. **维护性强**:
|
|
|
|
|
|
- 代码结构清晰
|
|
|
|
|
|
- 依赖关系明确
|
|
|
|
|
|
- 便于后续功能扩展
|
|
|
|
|
|
|
2026-03-24 16:59:20 +08:00
|
|
|
|
---
|
|
|
|
|
|
|
2026-03-24 19:39:43 +08:00
|
|
|
|
## 八、关键文件路径速查
|
2026-03-24 16:59:20 +08:00
|
|
|
|
|
2026-03-24 19:39:43 +08:00
|
|
|
|
### 新架构核心文件(保留)
|
2026-03-24 16:59:20 +08:00
|
|
|
|
|
2026-03-24 19:39:43 +08:00
|
|
|
|
```
|
|
|
|
|
|
✅ 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
|
|
|
|
|
|
```
|
2026-03-24 16:59:20 +08:00
|
|
|
|
|
2026-03-24 19:39:43 +08:00
|
|
|
|
### 待删除文件/目录
|
2026-03-24 16:59:20 +08:00
|
|
|
|
|
2026-03-24 19:39:43 +08:00
|
|
|
|
```
|
|
|
|
|
|
❌ 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
|
|
|
|
|
|
```
|
2026-03-24 16:59:20 +08:00
|
|
|
|
|
2026-03-24 19:39:43 +08:00
|
|
|
|
---
|
2026-03-24 16:59:20 +08:00
|
|
|
|
|
2026-03-24 19:39:43 +08:00
|
|
|
|
## 九、执行时间估算
|
2026-03-24 16:59:20 +08:00
|
|
|
|
|
2026-03-24 19:39:43 +08:00
|
|
|
|
| 步骤 | 操作 | 时间 |
|
|
|
|
|
|
|------|------|------|
|
|
|
|
|
|
| 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分钟** |
|
2026-03-24 16:59:20 +08:00
|
|
|
|
|
2026-03-24 19:39:43 +08:00
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 十、注意事项
|
|
|
|
|
|
|
|
|
|
|
|
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()` 必须保留
|
|
|
|
|
|
- 这些函数在新应用层中被使用
|
|
|
|
|
|
|
|
|
|
|
|
---
|
2026-03-24 16:59:20 +08:00
|
|
|
|
|
2026-03-24 19:39:43 +08:00
|
|
|
|
**计划版本**: v2.0(基于当前代码状态)
|
|
|
|
|
|
**更新时间**: 2025-03-24
|
|
|
|
|
|
**适用项目**: E32-433TBH-SC RF433无线通信模块
|