stm32f103c8t6程序里面有printf就会被卡死
时间: 2025-01-02 07:36:10 浏览: 16
### STM32F103C8T6 中 `printf` 函数卡死解决方案
在嵌入式开发环境中,尤其是像 STM32 这样的微控制器平台,标准库中的 `printf` 函数可能会因为默认配置不当而导致程序卡死。为了有效解决问题并实现稳定的数据输出功能,可以采取以下措施:
#### 使用自定义串口打印函数替代 `printf`
对于 STM32F103C8T6 而言,构建一个专门用于处理浮点数的串口打印函数是一个可行的方法。通过这种方式可以直接控制数据传输过程,避免因缓冲区溢出或其他原因引起的阻塞现象。
```cpp
void PrintFloat(float value) {
int tmp, tmp1, tmp2, tmp3, tmp4;
tmp = (int)value;
tmp1 = abs((int)((value - tmp) * 10)) % 10;
tmp2 = abs((int)((value - tmp) * 100)) % 10;
tmp3 = abs((int)((value - tmp) * 1000)) % 10;
tmp4 = abs((int)((value - tmp) * 10000)) % 10;
printf("%d.%d%d%d%d\n", tmp, tmp1, tmp2, tmp3, tmp4);
}
```
上述代码展示了如何创建一个简单的浮点数打印函数[^1]。然而,在实际应用中还需要考虑更多细节来确保可靠性。
#### 配置重映射 `__io_putchar` 实现 UART 输出
为了让 C 库中的 `printf` 正常工作于特定硬件上,通常需要重新定向字符输出操作至指定外设接口。具体做法是在项目源文件里加入如下宏定义:
```c
#include "usart.h"
// 定义弱链接版本的 _write() 或者 __io_putchar()
int __io_putchar(int ch) {
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF); // 假定使用 USART1 发送单字节
return ch;
}
// 如果使用的是新版本HAL库,则可能需要这个方法代替上面那个
int fputc(int ch, FILE *f) {
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
```
这段代码片段说明了怎样将标准 I/O 流导向到 UART 接口中去[^2]。注意这里假设使用的通信端口为 USART1 (`&huart1`) 并且已经完成了相应的初始化设置;同时超时参数可以根据实际情况调整。
#### 利用 DMA 提升效率防止阻塞
当频繁调用 `printf` 导致系统负载过高时,采用直接存储器访问(DMA)技术能够显著提高性能表现。这不仅减少了 CPU 的占用率还降低了潜在的风险因素。关于这一点可以在头文件 `USART_DMA.h` 中找到相关声明。
综上所述,针对 STM32F103C8T6 上遇到的 `printf` 卡顿问题,建议按照以上三个方向逐一排查优化,最终达到预期效果。
阅读全文