尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
STM32 printf重定向串口调试
STM32 printf重定向串口调试在 STM32 开发过程中经常需要查看程序运行过程中的变量和数据。使用串口将数据发送到电脑再通过串口调试助手查看是一种比较方便的调试方式。本文使用 STM32F1 标准外设库实现 USART1 的基本配置并将 printf 重定向到 USART1。配置完成后可以直接使用 printf() 输出字符串、整数、十六进制数据、浮点数等内容。一、硬件连接首先需要准备一个USB转TTL的串口模块用来实现STM32和电脑之间的通信。这里使用 STM32F1 的 USART1默认引脚为PA9 - USART1_TXPA10 - USART1_RX然后将 STM32 的串口引脚与模块上的 TX 和 RX 进行交叉连接并且要连接上 GND 保证电平一致连接完成后电脑会识别出一个 COM 端口需要提前安装好CH340驱动打开串口调试助手设置为也就是常见的115200 8N1。二、USART1 初始化首先开启 GPIOA 和 USART1 的时钟然后配置 PA9 和 PA10最后配置 USART1 的通信参数。PA9 是 USART1 的发送引脚因此配置为复用推挽输出PA10 是接收引脚配置为上拉输入。USART1 设置为 115200 波特率、8 位数据位、1 位停止位、无校验、无硬件流控同时开启发送和接收功能。完整初始化代码如下voidUSART1_Init(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);GPIO_InitTypeDef GPIO_InitStructure{0};GPIO_InitStructure.GPIO_ModeGPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_SpeedGPIO_Speed_50MHz;GPIO_InitStructure.GPIO_PinGPIO_Pin_9;GPIO_Init(GPIOA,GPIO_InitStructure);GPIO_InitStructure.GPIO_PinGPIO_Pin_10;GPIO_InitStructure.GPIO_ModeGPIO_Mode_IPU;GPIO_Init(GPIOA,GPIO_InitStructure);USART_InitTypeDef USART_InitStructure{0};USART_InitStructure.USART_BaudRate115200;USART_InitStructure.USART_WordLengthUSART_WordLength_8b;USART_InitStructure.USART_StopBitsUSART_StopBits_1;USART_InitStructure.USART_ParityUSART_Parity_No;USART_InitStructure.USART_ModeUSART_Mode_Tx|USART_Mode_Rx;USART_InitStructure.USART_HardwareFlowControlUSART_HardwareFlowControl_None;USART_Init(USART1,USART_InitStructure);NVIC_InitTypeDef NVIC_InitStructure{0};NVIC_InitStructure.NVIC_IRQChannelUSART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority5;NVIC_InitStructure.NVIC_IRQChannelSubPriority0;NVIC_InitStructure.NVIC_IRQChannelCmdENABLE;NVIC_Init(NVIC_InitStructure);USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);USART_Cmd(USART1,ENABLE);}三、实现单字节发送USART 配置完成后先实现最基本的单字节发送函数。voidUSART1_SendByte(uint8_tbyte){while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)RESET);USART_SendData(USART1,byte);}这里等待 USART_FLAG_TXE 置位表示发送数据寄存器为空可以写入新的数据。有了单字节发送函数之后就可以进一步实现字符串发送voidUSART1_SendString(char*str){while(*str){USART1_SendByte(*str);}}例如USART1_SendString(Hello STM32\r\n);此时就可以在电脑的串口调试助手中看到输出内容。不过这种方式只能方便地发送固定字符串如果需要输出变量还需要自己进行数据转换。因此通常会进一步使用 printf()。四、printf重定向C 标准库中的 printf() 最终会通过 fputc() 输出字符因此可以重写 fputc()让每一个字符都通过 USART1 发送。#includestdio.hintfputc(intch,FILE*f){USART1_SendByte((uint8_t)ch);returnch;}这样就完成了 printf() 到 USART1 的重定向。同时需要在 Keil 中开启 MicroLIB以使用精简版 C 运行库减少程序的代码和内存资源占用。五、测试代码配置完成后可以直接使用下面的代码测试printf是否正常工作。#includestm32f10x.h#includeusart.h#includestdio.hintmain(void){USART1_Init();printf(\r\n);printf( STM32 USART Test \r\n);/* 字符串 */printf(String : Hello STM32!\r\n);/* 字符 */printf(Char : %c\r\n,A);/* 有符号整数 */printf(Int : %d\r\n,-12345);/* 无符号整数 */printf(Uint : %u\r\n,12345);/* 十六进制 */printf(Hex : 0x%X\r\n,0x1234ABCD);/* 八进制 */printf(Octal : %o\r\n,12345);/* 长整数 */printf(Long : %ld\r\n,123456789L);/* 浮点数 */printf(Float : %.2f\r\n,3.1415926);/* 多个变量 */intx100;inty200;printf(x %d, y %d\r\n,x,y);/* 模拟传感器数据 */int16_tax1234;int16_tay-567;int16_taz16384;printf(ACC: X%d, Y%d, Z%d\r\n,ax,ay,az);/* 模拟状态信息 */uint8_tstate2;printf(State %d\r\n,state);printf(\r\n);while(1){}}能够正常看到以下内容就说明 STM32 USART1 配置、USB-TTL 连接、串口参数以及 printf 重定向均已正常工作。
RELATED

相关推荐

工业一体机选购后CAN总线通信开发实战:SocketCAN配置到报文解析全流程

工业一体机选购后CAN总线通信开发实战:SocketCAN配置到报文解析全流程

CAN总线是工业控制领域广泛使用的串行通信协议,采用差分信号传输,具备总线仲裁、错误检测和自动重传机制,在电磁干扰较强的工业现场中能够保持较高的通信可靠性和实时性。搞工控的开发者大概率绕不开这东西,今天就把我自己折腾Soc…

📅 2026/10/8 10:05:27
开关电源PCB安规距离整改:电气间隙与爬电距离实战解析

开关电源PCB安规距离整改:电气间隙与爬电距离实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/10/6 20:30:11
多智能体编排技术解析:MCP无状态化与性能优化实战

多智能体编排技术解析:MCP无状态化与性能优化实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/9/8 6:42:36
MORE NEWS

更多资讯

📰

7天AI扫盲路线图:技术人快速掌握大模型、Agent与AI应用

国庆假期,朋友圈一半人在景区排队,一半人在家刷短视频。如果你属于“收藏夹里囤了二十个AI教程、但一个都没看完”的那类技术人,这篇指南就是写给你的。我从大模型、AI Agent、AI绘画、AI视频、AI编程、AI测试一路聊到AI产品化,把…

📰

企业级问卷系统测试实战:从功能到性能的全面优化

1. 问卷系统测试报告概述在数字化调研成为主流的今天,问卷系统的稳定性和数据准确性直接影响着商业决策和学术研究的质量。最近我参与了一个企业级问卷平台的全面测试工作,从功能验证到性能压测,完整走完了整个测试生命周期。这份报告不同于简…

📰

LTC681X AFE驱动源码拆解:SPI帧结构、PEC15校验与BMS采样实现

简介:这是一份面向电池管理系统开发者的LTC681X系列AFE芯片官方驱动源码,聚焦ADI高精度多节电池监测场景,适合嵌入式软件工程师、BMS方案设计者及需要快速打通SPI通信与数据采集链路的开发者参考。压缩包共4个文件,以2个C源文件和…

📰

Vue动态组件性能优化:从渲染链路到内存治理的实战指南

1. 项目概述&#xff1a;为什么动态组件不是“写个<component :is>就完事了”Vue.js 的动态组件渲染与性能优化&#xff0c;这个标题乍看像是 Vue 官方文档里一个平平无奇的小节&#xff0c;但实际在某高校前端实验室做跨平台教学系统重构时&#xff0c;我亲眼见过团队把…

📰

MCP协议与Sealos的云原生实践指南

1. MCP协议与Sealos的完美邂逅在云原生技术快速发展的今天&#xff0c;开发者们常常面临一个困境&#xff1a;新技术层出不穷&#xff0c;是应该先花时间系统学习&#xff0c;还是直接上手实践&#xff1f;MCP&#xff08;Model Context Protocol&#xff09;协议与Sealos的结合…

📰

小米MiMo-V2.6开源大模型深度解析:K2架构如何实现长上下文与端侧AI

打工人最关心的事&#xff1a; 小米&#xff0c;一家做手机、卖电视、搞汽车的公司&#xff0c;凭什么登顶全球开源大模型&#xff1f; 2025下半年&#xff0c;Hugging Face的开源大模型榜单头部出现了一个此前没人想到的名字——小米 MiMo-V2.6 系列。它不靠参数量堆料&…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬