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. CH390D 当前已恢复基础寄存器读写,调试重点已从“SPI 是否完全不通”转入初始化完整性、链路、中断与收发功能验证
  4. 最终实板定位表明,一颗 CH390D 供电滤波电容虚焊会直接导致供电不稳,并放大为网络收发异常

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 基础寄存器读写、PHY 管理寄存器访问与 lwIP netif 链路置位路径;RX/TX 实际业务流量仍需继续做板上验证
  3. 目前未提供完整的上板网络吞吐、丢包率与长时间稳定性报告
  4. config 模块仍保留较重的字符串解析逻辑,但当前体积已可接受

9.2 上板验证重点

  1. 验证 CH390 RST/CS/SCK/MOSI/MISO/INT 在芯片脚侧的实际波形与当前软件假设一致
  2. 验证 VID/PID/REV、MAC 写回、RCR/IMR/INTCR、PHY 寄存器与 LINK/netif 链路状态在多次上电下稳定一致
  3. 验证 TIM4 1ms 中断稳定性与 PC13 1秒翻转节拍
  4. 验证 UART2/UART3 DMA + IDLE 在长连续流量下的行为
  5. 验证 TCP Server 与 TCP Client 双链路同时工作时的稳定性
  6. 验证配置保存、复位、MAC 生效路径
  7. 验证 CH390 收发路径、链路变化中断与 RX/TX 数据通路

十、后续建议

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

  1. 在当前可读写基线下,优先验证 default_config、MAC、PHY 协商/链路、IRQ、RX/TX 是否完整生效
  2. 同步用芯片脚侧波形与电源域量测验证 RST/CS/SCK/MOSI/MISO/INTVDDK/AVDD33/VDDIO/AVDD33
  3. 若链路与寄存器状态可信,再推进 TCP Server / TCP Client 与 UART2 / UART3 的双向联调
  4. 完成后补充吞吐、丢包、长稳与异常恢复测试

十一、当前结论

截至本轮调试:

  1. 系统主循环、RTT、定时器心跳、UART 配置路径均可正常工作
  2. 已修复并验证多个真实软件问题,且相关中间里程碑已提交版本库
  3. CH390D 当前已恢复基础寄存器读写,且已在实机上验证 VID=0x1C00PID=0x9151REV=0x2B、PHY ID 可读
  4. 运行时 lwIP netif 已观察到 LINK_UP 置位,说明当前阶段已不再是“完全无响应”或“链路始终未起”
  5. 当前硬件修复后,ARP/Ping 基础链路已验证通过,后续重点转为业务流量与长稳验证
  6. 板级供电完整性应作为 CH390D 调试前置检查项,而不是放到软件排查后期才介入