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

9.8 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. CH390 运行时访问已收敛为单一拥有者 ch390_runtime
  6. 构建目标已通过 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:独立看门狗
  • TIM4LED 心跳定时器

当前说明:

  1. IWDG 外设仍保留在工程中,但当前调试基线默认不在 main() 中启用 MX_IWDG_Init()
  2. App_Poll() 已对 HAL_IWDG_Refresh(&hiwdg) 做句柄保护,避免未初始化句柄导致 HardFault

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  |
+--------------------------------------------------+
| CH390 Runtime Owner                              |
| ch390_runtime (single runtime SPI owner)         |
+--------------------------------------------------+
| Peripheral/Event Layer                           |
| UART DMA+IDLE / DMA IRQ / EXTI / SysTick         |
+--------------------------------------------------+
| Drivers                                           |
| CH390 / lwIP netif / HAL                         |
+--------------------------------------------------+

4.2 执行模型

当前执行模型为:

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

五、当前模块实现状态

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. 新增 Drivers/CH390/ch390_runtime.c,统一负责 CH390 初始化、链路查询、IRQ pending 消费、RX/TX 服务与启动诊断快照
  4. main.c 不再直接读取 CH390 原始寄存器,启动诊断通过 ch390_runtime_get_diag() 获取快照
  5. EXTI0_IRQHandler() 只投递 IRQ pending,不再直接混入 CH390 访问
  6. 配置中的 MAC 地址会在初始化时写入 CH390

当前状态:

  1. 运行时架构层面的 SPI/LwIP/CH390 多源访问问题已经消除
  2. HardFault 与“运行一会儿卡死”问题已修复
  3. CH390 当前仍未建立可信通信,最近稳定读回表现为全 0xFFFF 或全 0x0000,说明剩余问题已经收敛到低层器件响应/总线层面,而不再是运行时并发问题

5.6 RTT 调试输出

文件:Middlewares/Third_Party/SEGGER_RTT/*

已实现:

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

5.7 TIM4 心跳闪烁

文件:Core/Src/tim.cCore/Src/main.cCore/Src/stm32f1xx_it.c

已实现:

  1. 使用 TIM4 作为 LED 心跳定时器
  2. TIM4 时钟来自 APB1 Timer Clock = 72 MHz
  3. 通过 Prescaler = 7199Period = 9 生成 1 ms 更新中断
  4. HAL_TIM_PeriodElapsedCallback() 中进行 1ms 计数
  5. 累计 1000 次后翻转一次 PC13,形成 1 s 闪烁节拍

当前实现说明:

  1. PC13 为低电平点亮、高电平熄灭
  2. 当前逻辑为每 1 s 翻转一次 LED 状态,即完整亮灭周期为 2 s
  3. 若后续需要“每 1 秒完整闪烁一次”,可改为 500 ms 翻转一次

六、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();
    }

    if (hiwdg.Instance == IWDG) {
        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. 代码体积仍满足 STM32F103R8T6 资源约束
  4. MDK-ARM 工程可直接编译并下载验证

说明当前版本已经满足:

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

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

9.1 功能限制

  1. 当前使用静态 IP,不支持 DHCP
  2. CH390 当前仍未返回可信的 VID/PID/REV,最新稳定读回表现为全 0xFFFF/0xFF
  3. 因此当前不能宣称网络链路已经真正建立,LINK 位读数也不可信
  4. 目前未提供上板网络与串口吞吐测试结论
  5. config 模块仍保留较重的字符串解析逻辑,但当前体积已可接受
  6. 新增 bit-bang 诊断读也返回全 0xFF,说明问题不再像单纯的 STM32 硬件 SPI 外设配置错误

9.2 上板验证重点

  1. 验证 CH390 CS/SCK/MOSI/MISO/RST/INT 的实际波形与极性是否和当前软件假设一致
  2. 重点验证为何 CH390 在硬件 SPI 与 bit-bang 两条读路径下都稳定返回 0xFFFF/0xFF
  3. 验证 TIM4 1ms 中断稳定性与 PC13 1秒翻转节拍
  4. 验证 UART2/UART3 DMA + IDLE 在长连续流量下的行为
  5. 验证 TCP Server 与 TCP Client 双链路同时工作时的稳定性
  6. 验证配置保存、复位、MAC 生效路径

十、后续建议

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

  1. 暂停继续盲目修改 CH390 软件驱动;当前软件侧已基本排除到足以支持硬件优先排查
  2. 先做板级波形与供电/复位取证,重点看 CS/SCK/MOSI/MISO/RST
  3. 若板级取证证明 CH390 端真实有响应,再回到软件侧处理 mode0 与 packet SRAM 连续事务等兼容性问题
  4. 在 CH390 可可信通信后,再验证真正的链路建立、收发与中断路径
  5. 验证 UART2/3 透传功能
  6. 补充双向透传稳定性与丢包测试

十一、当前结论

截至本轮调试:

  1. 系统主循环、RTT、定时器心跳、UART 配置路径均可正常工作
  2. 已修复并验证多个真实软件问题,且相关中间里程碑已提交版本库
  3. CH390 当前失败边界已被压缩到“器件未在总线上给出可信响应”
  4. 在相同板卡上,硬件 SPI 读寄存器与 bit-bang 读寄存器均返回全 0xFF
  5. 因此最可信的当前判断是:剩余问题更偏向硬件/总线/器件状态,而不是普通软件逻辑错误