stm32f107串口通信 printf 例程
时间: 2025-07-09 10:43:18 浏览: 9
### 关于STM32F107 USART与`printf`函数的实现
在嵌入式开发中,为了使`printf`函数能够通过USART进行数据打印,通常需要重定义标准库中的低级写操作 `_write` 函数。以下是针对STM32F107芯片的一个完整的示例代码。
#### 1. 实现`_write`函数
为了让`printf`能够在USART上工作,需提供一个自定义的`_write`函数来处理字符流输出:
```c
#include "usart.h"
int _write(int file, char *ptr, int len) {
for (int i = 0; i < len; i++) {
if (*ptr == '\n') { // 处理换行符
HAL_UART_Transmit(&huart1, (uint8_t*)"\r", 1, HAL_MAX_DELAY);
}
HAL_UART_Transmit(&huart1, (uint8_t*)ptr++, 1, HAL_MAX_DELAY); // 发送单个字节
}
return len;
}
```
此部分实现了将字符串逐字节发送至指定UART的功能[^1]。
#### 2. 初始化USART外设
使用HAL库初始化USART模块,确保其配置正确并启用中断或DMA模式以提高效率。以下是一个简单的初始化模板:
```c
void MX_USART1_UART_Init(void) {
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart1) != HAL_OK) {
Error_Handler();
}
}
```
该代码片段展示了如何设置波特率、停止位、校验方式以及传输模式等参数[^4]。
#### 3. 测试`printf`功能
编写测试代码验证`printf`能否正常工作:
```c
#include <stdio.h>
int main(void) {
HAL_Init(); // 初始化HAL库
SystemClock_Config(); // 配置系统时钟
MX_GPIO_Init(); // GPIO初始化
MX_USART1_UART_Init(); // USART初始化
printf("Hello, STM32F107!\n"); // 使用printf打印消息
while (1) {}
}
// 自定义_write函数已在此前定义
```
运行上述程序后,应能在连接到USART1的终端设备上看到输出的消息。
---
### 注意事项
- **缓冲区管理**:如果计划频繁调用`printf`,建议考虑环形缓冲区设计配合DMA技术优化性能。
- **线程安全**:当μC/OS-III或其他RTOS环境下使用时,注意保护共享资源访问以防竞争条件发生[^3]。
- **调试工具选择**:推荐采用串口调试助手或者Tera Term之类的软件监控实际效果。
---
阅读全文
相关推荐
















