stm32串口printf输出

本文介绍了一种在GCC编译环境下利用HAL_UART库实现PUTCHAR函数的方法。通过定义宏PUTCHAR_PROTOTYPE并根据编译器类型选择不同的函数原型,实现了向串行端口发送字符的功能。代码示例展示了如何在huart1实例上发送单个字符,并返回发送的字符值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include "stdio.h"



#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(&huart1 , (uint8_t *)&ch, 1 , 0xffff);
    return ch;
}

 

### 解决 STM32 UART `printf` 函数无法输出的问题 当遇到 STM32 的 UART `printf` 函数无法正常工作的情况时,可以考虑以下几个方面来排查并解决问题: #### 1. 配置 USART 初始化设置 确保 USART 已经被正确初始化。这包括波特率、字长、停止以及校验等参数配置无误。通常情况下,在 HAL 库中会有一个类似的初始化函数用于配置这些参数。 ```c UART_HandleTypeDef huart1; 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(); } } ``` #### 2. 检查中断优先级和服务例程 如果使用了中断方式发送数据,则需确认 NVIC 中断优先级已经合理分配给相应的 USART 外设,并且编写了正确的中断服务程序(ISR)。对于基于 HAL 库的应用来说,默认生成的模板文件里会有 ISR 定义,只需适当调整即可[^1]。 #### 3. 实现重定向标准输出到 UART 为了让 C 标准库中的 `printf()` 能够通过指定的串口打印信息,需要实现 `_write` 函数或者利用其他方法将 stdout 流指向目标硬件接口。下面是一个简单的例子展示如何覆盖默认行为以便于调试目的: ```c #include <stdio.h> #include "stm32f4xx_hal.h" int __io_putchar(int ch){ ITM_SendChar(ch); return ch; } // 或者更常见的做法是直接操作USART寄存器 /* int fputc(int ch, FILE *f){ while((huart1.gState != HAL_UART_STATE_READY)); HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,0xFFFF); return ch; } */ ``` 上述代码片段展示了两种不同的途径来完成这一任务——一种是借助 DWT/ITM 协议栈来进行实时追踪;另一种则是直接调用 HAL 提供的功能API 来传输单个字符[^2]。 #### 4. 编译选项的影响 编译过程中使用的优化级别也可能影响最终可执行文件的行为。例如 `-O3` 这样的高度优化可能会移除某些看似不必要的语句或变量声明,从而间接导致预期之外的结果发生。因此建议尝试降低编译器优化等级以排除此类可能性。 #### 5. 硬件连接验证 最后但同样重要的是要仔细检查物理连线是否牢固可靠,特别是 TXD 和 RXD 引脚之间的跳线应该按照设计图纸准确对接。另外还需注意电源供电情况及地线共用地问题,任何细微之处都可能成为通信失败的原因之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值