- 集成 EasyLogger,增强日志功能。 - 更新 UART DMA 回调以使用 EasyLogger 记录日志。 - 重新格式化 README.md,提升可读性和清晰度。 - 添加新的 CMSIS DSP 和 FreeRTOS 源文件。 - 更新 CMake 配置以包含 EasyLogger 源文件。 此提交改进了日志功能,为后续开发做好了准备。
180 lines
3.8 KiB
Markdown
180 lines
3.8 KiB
Markdown
# 嵌入式调试开发指南
|
||
|
||
## 项目简介
|
||
|
||
本项目旨在实现基于 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. 实际连接与发送测试
|
||
|
||
通过串口助手发送数据,验证数据是否成功传输。
|
||
|
||
---
|
||
|
||
## 连接示意图
|
||
|
||

|
||
|
||
---
|
||
|
||
## 常见问题
|
||
|
||
### 1. 无法连接服务器
|
||
|
||
- 检查 IP 和端口是否正确。
|
||
- 确保 Wi-Fi 配置无误。
|
||
|
||
### 2. 透传模式无法退出
|
||
|
||
- 确保发送 `+++` 时未勾选“发送新行”。
|
||
- 确保发送后停顿 1 秒以上。
|
||
|
||
---
|
||
|
||
## 附录
|
||
|
||
### 相关工具截图
|
||
|
||
#### TCP 测试软件
|
||
|
||

|
||
|
||
#### 创建服务器
|
||
|
||

|
||
|
||
#### 启动服务器
|
||
|
||

|
||
|
||
#### 实际连接发送测试
|
||
|
||

|
||
|
||
---
|
||
|
||
## 串口重定向
|
||
|
||
使用以下函数,用于串口重定向:
|
||
|
||
```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);
|
||
```
|