Files
car_stm32f103vet6/README.md
wangbeihong 8d2a0ea0c8 feat: 集成 EasyLogger 并更新 UART DMA 回调
- 集成 EasyLogger,增强日志功能。
- 更新 UART DMA 回调以使用 EasyLogger 记录日志。
- 重新格式化 README.md,提升可读性和清晰度。
- 添加新的 CMSIS DSP 和 FreeRTOS 源文件。
- 更新 CMake 配置以包含 EasyLogger 源文件。

此提交改进了日志功能,为后续开发做好了准备。
2026-04-02 00:27:58 +08:00

180 lines
3.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.
# 嵌入式调试开发指南
## 项目简介
本项目旨在实现基于 STM32F103 的嵌入式开发,支持通过 TCP/IP 协议进行数据传输。以下内容将详细介绍如何配置和使用相关功能。
---
## 环境准备
### 硬件需求
- STM32F103 开发板
- USB 转串口模块
- 连接线
### 软件需求
- 串口调试工具(如 XCOM 或 SecureCRT
- TCP 测试软件
---
## 配置步骤
### 1. 串口配置
1. 选择实际的串口号(如 COM4
2. 设置波特率为 `115200`
### 2. AT 指令操作
#### 配置 Wi-Fi
```bash
AT+CWMODE=1 # 设置工作模式为 STA
AT+CWJAP="ssid","password" # 配置 Wi-Fi
```
#### 连接服务器
```bash
AT+CIPSTART="TCP","192.168.1.101",3456 # 连接服务器IP 为电脑的 IP端口为 3456
AT+SAVETRANSLINK=1,"192.168.1.101",3456,"TCP" # 保存连接信息,开机后自动连接
AT+CIPMODE=1 # 设置为透传模式
AT+CIPSEND # 发送数据
HELLOWORLD # 示例数据
```
#### 退出透传模式
进入自动透传模式后,如需重新配置(如更换 IP需退出透传模式
1. 在串口助手中发送 `+++`
2. 注意:
- 不要勾选“发送新行”。
- 发送 `+++` 后,停顿 1 秒以上不要发送任何数据。
3. 模块返回 `OK` 后,即可重新进入命令模式。
---
## 测试与验证
### 1. 启动服务器
使用 TCP 测试软件创建服务器并启动。
### 2. 实际连接与发送测试
通过串口助手发送数据,验证数据是否成功传输。
---
## 连接示意图
![连接线示意图](image.png)
---
## 常见问题
### 1. 无法连接服务器
- 检查 IP 和端口是否正确。
- 确保 Wi-Fi 配置无误。
### 2. 透传模式无法退出
- 确保发送 `+++` 时未勾选“发送新行”。
- 确保发送后停顿 1 秒以上。
---
## 附录
### 相关工具截图
#### TCP 测试软件
![TCP 测试软件](image-2.png)
#### 创建服务器
![创建服务器](image-3.png)
#### 启动服务器
![启动服务器](image-4.png)
#### 实际连接发送测试
![实际连接发送测试](image-5.png)
---
## 串口重定向
使用以下函数,用于串口重定向:
```c
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE {
HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
return ch;
}
```
该函数用于将 `printf` 输出重定向到串口。
---
## TCP 接收与发送
### 接收数据
使用空闲中断接收 TCP 数据,开启了 DMA 接收:
```c
void UART_IDLE_Callback(UART_HandleTypeDef *huart) {
/* 仅处理 USART1 的实例 */
if (huart == NULL || huart->Instance != USART1)
return;
/* 清除空闲中断标志位HAL库宏 */
__HAL_UART_CLEAR_IDLEFLAG(huart);
/* 停止 DMA 以便安全读取计数器并更新状态 */
HAL_UART_DMAStop(huart);
/* 计算接收到的字节数:总缓冲区长度 - DMA 剩余传输计数 */
uint16_t recv_len = UART1_RX_BUF_SIZE - __HAL_DMA_GET_COUNTER(huart->hdmarx);
if (recv_len > 0 && recv_len < UART1_RX_BUF_SIZE) {
uart1_rx_len = recv_len;
uart1_rx_buf[recv_len] = '\0'; /* 添加字符串结束符,方便后续字符串处理 */
uart1_rx_flag = 1; /* 置位标志,通知应用层新消息到达 */
/* 仅供调试在中断中打印接收到的数据注意printf 可能会影响实时性) */
elog_raw("UART1 Received: %s\r\n", (char *)uart1_rx_buf);
}
/* 重新启动新一轮的 DMA 接收 */
HAL_UART_Receive_DMA(&huart1, uart1_rx_buf, UART1_RX_BUF_SIZE);
}
```
### 发送数据
封装了发送函数,只需填入数据即可发送:
```c
const char *message = "Hello, ESP12F! This is a test message.";
HAL_StatusTypeDef status = ESP12F_TCP_SendMessage(message);
```