HAL库STM32中使用printf打印数据到串口

一、在 STM32 中使用printf()函数打印调试信息是开发过程中的常见需求,但需要进行适当配置才能将输出重定向到串口(如 USART1)。以下是详细实现方法:

二.printf()函数默认使用标准输出(stdout),而 STM32 没有标准控制台。因此需要:

1.重定向fputc()函数:将printf()的输出数据通过串口发送

2.初始化串口:配置波特率、数据位等参数

3.禁用半主机模式:避免与 ARM 调试协议冲突.

三.初始化串口(结合自己的单片机和硬件我的硬件是正点原子的开发板F407)查到我的串口在下面这个

1.设置时钟

2.IO配置,注意,我硬件是分配到了PB6 PB7但是CUBEMX第一次分配不是这个引脚,需要自己修改下,别的型号也要看

3.生成代码

4.打开KEILL工程自己实现下

c 复制代码
int fputc(int c,FILE *f)
{
	
	HAL_UART_Transmit(&huart1,(uint8_t *)&c,1,1000);
	return c;
}

5.配置

6.调用函数

c 复制代码
		printf("hello wrod");

7.验证

备注...答疑

什么是半主机模式(Semihosting)?

1半主机模式是 ARM 提供的一种调试功能,允许在程序运行时,通过调试器和主机电脑之间通信,例如:

2.使用 printf() 把内容输出到电脑终端;

3.使用 scanf() 从电脑终端输入数据;

它不是通过串口或 LCD 输出,而是靠调试器与 IDE 通信实现的。

为什么要禁用半主机模式?

  1. 运行时依赖调试器

    如果启用了半主机模式,而你没连接调试器运行程序,程序在执行到 printf() 这类函数时会 卡死/进入HardFault,因为它等不到主机响应。

  2. 与调试协议冲突

    在某些 IDE(比如 Keil、IAR)或 OpenOCD 调试器下,半主机协议和正常 SWD 调试协议可能冲突,导致调试不稳定。

禁用方法(建议总是禁用):

如果你使用的是 Keil:

c 复制代码
// 添加这句在 main() 前面
#pragma import(__use_no_semihosting)
struct __FILE { int handle; };
FILE __stdout;
int fputc(int ch, FILE *f) { return ch; }  // 让 printf 仍然能用(重定向)

void _sys_exit(int x) { x = x; } // 防止 semihosting 出错
相关推荐
普中科技1 小时前
【普中 51-Ai8051 开发攻略】-- 第 9 章 按键控制实验
单片机·嵌入式硬件·开发板·keil·按键·普中科技·ai8051u
曼亿点2 小时前
STM32HAL驱动L298N电机驱动模块(PWM调速+双电机控制)保姆级教程
stm32·单片机·嵌入式硬件
筱谙2 小时前
BES 芯片跨核通讯与共享内存设计原理
嵌入式硬件·音频·蓝牙
思为无线NiceRF2 小时前
高空线路安装智能安全帽全双工组网对讲系统(含优先级管控)应用方案
嵌入式硬件·物联网
独小乐4 小时前
012.整体框架适配SDRAM|千篇笔记实现嵌入式全栈/裸机篇
c语言·汇编·笔记·单片机·嵌入式硬件·arm·gnu
不吃鱼的羊4 小时前
ADC扫描组Scan Group
单片机
海砥装备HardAus5 小时前
飞控算法中双环串级PID深度解析:角度环与角速度环的协同机制
stm32·算法·无人机·飞控·串级pid
LCMICRO-133108477465 小时前
长芯微LPC556D1完全P2P替代DAC8830,是引脚兼容的16位数模转换器,该系列产品为单通道、低功耗、缓冲电压输出型DAC
stm32·单片机·嵌入式硬件·fpga开发·硬件工程·电压输出型dac
forAllforMe5 小时前
如何用定时器PWM产生SPWM?--电机驱动控制
嵌入式硬件
charlie1145141915 小时前
嵌入式C++教程实战之Linux下的单片机编程(9):HAL时钟使能 —— 不开时钟,外设就是一坨睡死的硅
linux·开发语言·c++·单片机·嵌入式硬件·c