Files
TCP2UART/项目技术实现.md
T

6.5 KiB
Raw Blame History

TCP2UART 项目技术实现

一、当前实现结论

当前工程已经从原先的 FreeRTOS + lwIP socket/netconn 方向,重构为适配 STM32F103R8T6 的裸机实现。

当前基线特征如下:

  1. MCU 目标固定为 STM32F103R8T6 / STM32F103xB
  2. 软件架构改为 bare-metal main loop + DMA/IDLE + EXTI
  3. 网络栈采用 lwIP RAW API + NO_SYS=1
  4. 调试输出采用 SEGGER RTT
  5. 构建目标已通过 MDK-ARM 编译,适配 64KB Flash / 20KB SRAM

二、硬件与资源约束

2.1 MCU

  • 型号:STM32F103R8T6
  • Flash64 KB
  • SRAM20 KB
  • 主频:72 MHz

2.2 主要外设

  • SPI1:连接 CH390D
  • USART1:配置串口
  • USART2Server 透传串口
  • USART3Client 透传串口
  • DMA1UART 收发 DMA
  • EXTI0CH390 中断输入
  • 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 的资源上限不足以稳定承载原方案中的以下组合:

  1. FreeRTOS
  2. CMSIS-RTOS V2
  3. 多任务栈
  4. lwIP socket/netconn/tcpip OS 路线
  5. StreamBuffer / Semaphore / Mutex

因此当前实现采用如下组合:

  1. 去掉 FreeRTOS
  2. 去掉 CMSIS-RTOS V2
  3. 去掉 lwIP socket/netconn
  4. 改为 lwIP RAW API + NO_SYS=1
  5. 串口与网口统一由主循环推进

四、当前软件架构

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 执行模型

当前执行模型为:

  1. SysTick 提供全局毫秒时基
  2. EXTI0 只置位 CH390 待处理标志
  3. DMA IRQUART IRQ 只完成回调分发与 IDLE 采样
  4. 主循环统一执行网络轮询、超时推进、串口桥接和看门狗喂狗

五、当前模块实现状态

5.1 配置模块

文件:App/config.c/.h

已实现:

  1. 从 Flash 加载配置
  2. UART1 命令口接收
  3. 常用网络与串口参数解析
  4. 参数保存与软复位请求

当前约束:

  1. 构建已关闭 DHCP,因此 AT+DHCP=1 会明确返回错误
  2. 配置损坏时会回退默认值,但默认值不会自动写回 Flash,仍需手动 AT+SAVE

5.2 UART 透传模块

文件:App/uart_trans.c/.h

已实现:

  1. USART2/USART3 使用 DMA + IDLE
  2. RX 使用 DMA 缓冲转环形缓冲
  3. TX 使用 DMA 发送
  4. TX/RX 完成由 HAL_UART_*Callback 驱动

5.3 TCP Server 模块

文件:App/tcp_server.c/.h

已实现:

  1. lwIP RAW API 监听指定端口
  2. 单连接接入
  3. 网络数据写入本地环形缓冲
  4. 主循环中与 UART2 做双向桥接

5.4 TCP Client 模块

文件:App/tcp_client.c/.h

已实现:

  1. lwIP RAW API 主动连接远端地址
  2. 断链后按周期重连
  3. 网络数据写入本地环形缓冲
  4. 主循环中与 UART3 做双向桥接

5.5 CH390 与 netif 模块

文件:Drivers/CH390/*Drivers/LwIP/src/netif/*

已实现:

  1. SPI1 + GPIO CS + EXTI0 驱动 CH390
  2. ethernetif.c 采用 NO_SYS=1 路线
  3. CH390 中断在主循环中轮询处理
  4. 配置中的 MAC 地址会在初始化时写入 CH390

5.6 RTT 调试输出

文件:Middlewares/Third_Party/SEGGER_RTT/*

已实现:

  1. 工程内置最小 SEGGER RTT 源文件
  2. main.cprintf/fputc 已重定向到 RTT

六、lwIP 配置策略

当前 lwIP 配置以适配 R8T6 资源为原则,核心策略如下:

  1. NO_SYS = 1
  2. LWIP_SOCKET = 0
  3. LWIP_NETCONN = 0
  4. LWIP_NETIF_API = 0
  5. LWIP_DHCP = 0
  6. LWIP_UDP = 0
  7. LWIP_DNS = 0
  8. LWIP_IGMP = 0
  9. 关闭 lwIP 平台诊断 printf

同时从 MDK 工程中移除了:

  1. FreeRTOS 相关源码
  2. lwIP api/socket/netconn/tcpip 路线源码
  3. 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 当前结果

当前构建结果:

  1. 0 Error(s)
  2. 0 Warning(s)
  3. Code=38664
  4. RO-data=1272
  5. RW-data=168
  6. ZI-data=19120

说明当前版本已经满足:

  1. STM32F103R8T6 64KB Flash 约束
  2. 20KB SRAM 约束
  3. MDK-ARM 可直接编译

九、当前已知限制与待验证项

9.1 功能限制

  1. 当前使用静态 IP,不支持 DHCP
  2. 目前未提供上板网络与串口吞吐测试结论
  3. config 模块仍保留较重的字符串解析逻辑,但当前体积已可接受

9.2 上板验证重点

  1. 验证 CH390 INT 极性与 EXTI 触发行为
  2. 验证 SPI1 与 CH390 的稳定性
  3. 验证 UART2/UART3 DMA + IDLE 在长连续流量下的行为
  4. 验证 TCP Server 与 TCP Client 双链路同时工作时的稳定性
  5. 验证配置保存、复位、MAC 生效路径

十、后续建议

下一阶段建议按以下顺序推进:

  1. 上板联调 CH390 链路与 RTT 输出
  2. 验证 UART2/3 透传功能
  3. 补充双向透传稳定性与丢包测试
  4. 视需要继续优化 config.c 的体积与命令集
  5. 若后续必须支持 DHCP,再单独评估资源预算