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

318 lines
9.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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`
- Flash`64 KB`
- SRAM`20 KB`
- 主频:`72 MHz`
### 2.2 主要外设
- `SPI1`:连接 `CH390D`
- `USART1`:配置串口
- `USART2`Server 透传串口
- `USART3`Client 透传串口
- `DMA1`UART 收发 DMA
- `EXTI0`CH390 中断输入
- `IWDG`:独立看门狗
- `TIM4`LED 心跳定时器
当前说明:
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 分层
```text
+--------------------------------------------------+
| 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 IRQ``UART 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.c``printf/fputc` 已重定向到 RTT
### 5.7 TIM4 心跳闪烁
文件:`Core/Src/tim.c``Core/Src/main.c``Core/Src/stm32f1xx_it.c`
已实现:
1. 使用 `TIM4` 作为 LED 心跳定时器
2. `TIM4` 时钟来自 `APB1 Timer Clock = 72 MHz`
3. 通过 `Prescaler = 7199``Period = 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` 等当前不需要模块
## 七、主循环实际骨架
当前主循环逻辑可概括为:
```c
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 构建命令
```bat
"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. 因此最可信的当前判断是:剩余问题更偏向硬件/总线/器件状态,而不是普通软件逻辑错误