6.5 KiB
6.5 KiB
TCP2UART 项目技术实现
一、当前实现结论
当前工程已经从原先的 FreeRTOS + lwIP socket/netconn 方向,重构为适配 STM32F103R8T6 的裸机实现。
当前基线特征如下:
- MCU 目标固定为
STM32F103R8T6 / STM32F103xB - 软件架构改为
bare-metal main loop + DMA/IDLE + EXTI - 网络栈采用
lwIP RAW API + NO_SYS=1 - 调试输出采用
SEGGER RTT - 构建目标已通过
MDK-ARM编译,适配64KB Flash / 20KB SRAM
二、硬件与资源约束
2.1 MCU
- 型号:
STM32F103R8T6 - Flash:
64 KB - SRAM:
20 KB - 主频:
72 MHz
2.2 主要外设
SPI1:连接CH390DUSART1:配置串口USART2:Server 透传串口USART3:Client 透传串口DMA1:UART 收发 DMAEXTI0:CH390 中断输入IWDG:独立看门狗
2.3 当前引脚分配
| 引脚 | 功能 | 用途 |
|---|---|---|
| PA2 | USART2_TX | Server 透传串口 |
| PA3 | USART2_RX | Server 透传串口 |
| PA4 | GPIO_Output | CH390D 片选 |
| PA5 | SPI1_SCK | CH390D SPI 时钟 |
| PA6 | SPI1_MISO | CH390D SPI 数据输入 |
| PA7 | SPI1_MOSI | CH390D SPI 数据输出 |
| PA9 | USART1_TX | 配置串口 |
| PA10 | USART1_RX | 配置串口 |
| PB0 | EXTI0 | CH390D INT |
| PB1 | GPIO_Output | CH390D RESET |
| PB10 | USART3_TX | Client 透传串口 |
| PB11 | USART3_RX | Client 透传串口 |
| PC13 | GPIO_Output | 状态 LED |
| PD0/PD1 | HSE | 8MHz 外部晶振 |
三、架构选择原因
STM32F103R8T6 的资源上限不足以稳定承载原方案中的以下组合:
FreeRTOSCMSIS-RTOS V2- 多任务栈
lwIP socket/netconn/tcpipOS 路线StreamBuffer / Semaphore / Mutex
因此当前实现采用如下组合:
- 去掉
FreeRTOS - 去掉
CMSIS-RTOS V2 - 去掉
lwIP socket/netconn - 改为
lwIP RAW API + NO_SYS=1 - 串口与网口统一由主循环推进
四、当前软件架构
4.1 分层
+--------------------------------------------------+
| Application Logic |
| config / tcp_server / tcp_client / uart bridge |
+--------------------------------------------------+
| Main Poll Loop |
| ethernetif_poll / sys_check_timeouts / watchdog |
+--------------------------------------------------+
| Peripheral/Event Layer |
| UART DMA+IDLE / DMA IRQ / EXTI / SysTick |
+--------------------------------------------------+
| Drivers |
| CH390 / lwIP netif / HAL |
+--------------------------------------------------+
4.2 执行模型
当前执行模型为:
SysTick提供全局毫秒时基EXTI0只置位 CH390 待处理标志DMA IRQ和UART IRQ只完成回调分发与 IDLE 采样- 主循环统一执行网络轮询、超时推进、串口桥接和看门狗喂狗
五、当前模块实现状态
5.1 配置模块
文件:App/config.c/.h
已实现:
- 从 Flash 加载配置
- UART1 命令口接收
- 常用网络与串口参数解析
- 参数保存与软复位请求
当前约束:
- 构建已关闭
DHCP,因此AT+DHCP=1会明确返回错误 - 配置损坏时会回退默认值,但默认值不会自动写回 Flash,仍需手动
AT+SAVE
5.2 UART 透传模块
文件:App/uart_trans.c/.h
已实现:
USART2/USART3使用DMA + IDLE- RX 使用 DMA 缓冲转环形缓冲
- TX 使用 DMA 发送
- TX/RX 完成由
HAL_UART_*Callback驱动
5.3 TCP Server 模块
文件:App/tcp_server.c/.h
已实现:
lwIP RAW API监听指定端口- 单连接接入
- 网络数据写入本地环形缓冲
- 主循环中与 UART2 做双向桥接
5.4 TCP Client 模块
文件:App/tcp_client.c/.h
已实现:
lwIP RAW API主动连接远端地址- 断链后按周期重连
- 网络数据写入本地环形缓冲
- 主循环中与 UART3 做双向桥接
5.5 CH390 与 netif 模块
文件:Drivers/CH390/*、Drivers/LwIP/src/netif/*
已实现:
SPI1 + GPIO CS + EXTI0驱动 CH390ethernetif.c采用NO_SYS=1路线- CH390 中断在主循环中轮询处理
- 配置中的 MAC 地址会在初始化时写入 CH390
5.6 RTT 调试输出
文件:Middlewares/Third_Party/SEGGER_RTT/*
已实现:
- 工程内置最小
SEGGER RTT源文件 main.c中printf/fputc已重定向到 RTT
六、lwIP 配置策略
当前 lwIP 配置以适配 R8T6 资源为原则,核心策略如下:
NO_SYS = 1LWIP_SOCKET = 0LWIP_NETCONN = 0LWIP_NETIF_API = 0LWIP_DHCP = 0LWIP_UDP = 0LWIP_DNS = 0LWIP_IGMP = 0- 关闭
lwIP平台诊断printf
同时从 MDK 工程中移除了:
FreeRTOS相关源码lwIP api/socket/netconn/tcpip路线源码altcp / autoip / acd / dhcp / dns / igmp等当前不需要模块
七、主循环实际骨架
当前主循环逻辑可概括为:
while (1)
{
ethernetif_poll();
ethernetif_check_link();
sys_check_timeouts();
tcp_client_poll();
uart_trans_poll();
config_poll();
tcp_server <-> UART2;
tcp_client <-> UART3;
if (reset_requested) {
NVIC_SystemReset();
}
HAL_IWDG_Refresh(&hiwdg);
}
八、当前构建状态
8.1 MDK 构建命令
"C:\Keil_v5\UV4\UV4.exe" -b "D:\code\STM32Project\TCP2UART\MDK-ARM\TCP2UART.uvprojx" -j0
8.2 当前结果
当前构建结果:
0 Error(s)0 Warning(s)Code=38664RO-data=1272RW-data=168ZI-data=19120
说明当前版本已经满足:
STM32F103R8T6 64KB Flash约束20KB SRAM约束MDK-ARM可直接编译
九、当前已知限制与待验证项
9.1 功能限制
- 当前使用静态 IP,不支持 DHCP
- 目前未提供上板网络与串口吞吐测试结论
config模块仍保留较重的字符串解析逻辑,但当前体积已可接受
9.2 上板验证重点
- 验证 CH390 INT 极性与 EXTI 触发行为
- 验证
SPI1与 CH390 的稳定性 - 验证
UART2/UART3 DMA + IDLE在长连续流量下的行为 - 验证 TCP Server 与 TCP Client 双链路同时工作时的稳定性
- 验证配置保存、复位、MAC 生效路径
十、后续建议
下一阶段建议按以下顺序推进:
- 上板联调 CH390 链路与 RTT 输出
- 验证 UART2/3 透传功能
- 补充双向透传稳定性与丢包测试
- 视需要继续优化
config.c的体积与命令集 - 若后续必须支持 DHCP,再单独评估资源预算