STM32保姆级入门教程|第7章:串口通信(USART)收发数据 + printf重定向打印调试(功能超详细+CubeIDE手把手)

STM32保姆级入门教程|第7章:串口通信(USART)收发数据 + printf重定向打印调试🔥(功能超详细+CubeIDE 1.19.0手把手)

原创 ✍️ | 新手零门槛,全程新建工程,手把手不踩坑!

文章标签:#stm32 #stm32cubeide #串口通信 #USART #printf重定向 #嵌入式调试 #中断接收 #新手入门 #单片机实战 #HAL库串口

系列前置博客(必看!否则跟不上哦😜):

  1. STM32保姆级入门教程|第1章:零基础必看,从认知到实战全解析

  2. STM32保姆级入门教程|第2章:STM32CubeIDE 使用+STM32F103RCT6 + J-Link 实现 PA0 引脚 LED 点亮

  3. STM32保姆级入门教程|第3章:从新建工程到LED闪烁点灯(Hex生成+ST-Link/J-Link切换全攻略)

  4. STM32保姆级入门教程|第4章:GPIO输入+外部中断 实现按键控制LED(手把手全流程)

  5. STM32保姆级入门教程|第5章:GPIO内部结构 + 8种模式 + 功能详解(CubeIDE实战版)

  6. STM32保姆级入门教程|第6章:定时器中断原理 + 精准LED闪烁(1s/2s/3s)实战🔥(本章续篇)

📚 本章目录(点击可跳转,懒人福音✨)

  1. 前言(串口有多重要?新手必须拿下!)
  2. 本章核心功能目标(学完能搞定啥?一目了然)
  3. 串口通信是什么?大白话讲透(再也不用死记硬背)
  4. USART硬件接口与接线(必须接对,否则白干!)
  5. printf重定向原理(为什么能像C语言一样打印?)
  6. 实战目标:串口收发 + printf打印调试信息
  7. CubeIDE 1.19.0 新建工程+手把手配置(全程截图,零踩坑)
  8. 代码功能详解(逐行拆解,新手也能懂)
  9. 下载验证(见证奇迹的时刻🤩)
  10. 中断接收实战(收到什么回什么,串口助手互动)
  11. 关键功能总结(新手必背,避免踩坑)
  12. 常见问题排查(遇到问题不用慌,速查解决)
  13. 下篇预告 + 免费资料包

💡 前言(串口到底有多重要?必看!)

大家好,我是BackCatK Chen😎!

前面我们用定时器中断实现了LED精准闪烁,单片机终于能"一心二用"了。但接下来问题来了:程序跑起来后,我们怎么知道它运行得对不对?变量值是多少?卡在哪个环节了? 总不能靠LED闪几下来判断吧?那样效率太低,纯属"盲调",新手调bug能调到怀疑人生!

今天咱们就学嵌入式开发的"眼睛和嘴巴"------串口通信(USART) 。它能让单片机通过两根线(TX/RX)和电脑"聊天",把程序运行状态、变量值、错误信息实时打印到电脑屏幕上。学会这一招,调试效率直接起飞🚀,再也不用瞎猜程序跑没跑、数据对不对了!

重点说明💥:本章不沿用任何前序工程 ,全程从0新建工程,手把手教你配置USART1、实现printf重定向、串口收发数据。本章基于 STM32CubeIDE 1.19.0 版本编写(2025年7月发布的正式版本,芯片列表与STM32CubeMX v6.15.0对齐),哪怕你没保存前序工程,也能轻松跟上,彻底杜绝"工程找不到、配置乱套"的问题!

本章我把串口原理、接线细节、CubeIDE配置、printf重定向代码、中断接收流程全部讲到最细,全程用"大白话+表情包+一步一截图",新手看完不仅能学会,还能直接用串口调试自己的项目,爽到飞起!

🎯 本章核心功能目标(清晰明确,学完不迷茫)

  1. 搞懂 ✅ 串口通信的本质和USART硬件接口(再也不会接错线)
  2. 掌握 ✅ CubeIDE 1.19.0 配置USART1的方法(波特率、数据位、停止位全搞定)
  3. 学会 ✅ printf重定向到串口(像C语言一样用printf打印,调试神器)
  4. 掌握 ✅ HAL库串口发送函数(HAL_UART_Transmit,想发什么发什么)
  5. 学会 ✅ 串口中断接收数据(收到电脑发的数据立刻处理,不丢包)
  6. 实现 ✅ :
    • 单片机每秒向电脑发送一次 "Hello STM32!" 字符串
    • 单片机收到电脑发来的任何数据,立刻原样返回(回显功能)
    • 用printf打印变量值、程序运行状态(调试利器)
  7. 理解 ✅ 为什么printf重定向是嵌入式调试的"标配"(项目开发必懂)

📡 串口通信是什么?大白话讲透(通俗不烧脑)

3.1 串口通信本质(一句话讲懂,记牢不踩坑)

串口通信 = 单片机与电脑之间的"专属对讲机" 📞

它通过两根线(一根发送TX,一根接收RX),把数据一位一位地顺序传送出去。就像两个人打电话,你说一句我回一句,简单、稳定、成本低,是嵌入式开发中最常用的调试和通信手段,没有之一!

3.2 串口通信关键参数(新手重点记这4个,够用一辈子!)

想让单片机与电脑正常"聊天",双方的"语速"和"说话方式"必须一致,这就需要配置以下4个参数:

参数名称 功能解释 常用值(新手直接抄)
波特率(Baud Rate) 通信速度,单位bps(每秒传送多少位) 115200(最常用,又快又稳)
数据位(Data Bits) 一次传送多少位有效数据 8位(固定标配)
停止位(Stop Bits) 数据结束标志,表示一个数据包传完了 1位(固定标配)
校验位(Parity) 用于检测数据传输是否出错 无校验(None)(最常用)

💡 口诀:波特率115200,8位数据1位停,无校验。新手直接背下来,以后配串口就是这组参数,90%的场景都适用!

3.3 串口 vs 其他调试方式(功能大比拼,一眼看清差距)

调试方式 优点 缺点 适用场景
LED闪烁 简单,不占资源 信息量极少,只能表示几种状态 最简单的状态指示
仿真器单步调试 功能强大,可看所有变量 需要硬件仿真器,打断点影响实时性 深度调试,找复杂bug
串口打印(printf) 信息量大,实时性好,成本低 占用一个串口和两个引脚 日常调试首选,项目标配

💡 结论:串口打印是嵌入式工程师最常用的调试手段,没有之一!学会它,调试效率提升10倍,新手必须拿下!

3.4 USART硬件接口与接线(必须接对,否则白干!)

STM32F103RCT6的USART1引脚定义(新手最常用):

  • PA9 → USART1_TX(发送引脚) ,接串口模块的 RX
  • PA10 → USART1_RX(接收引脚) ,接串口模块的 TX

接线示意图(重中之重!接错就通信失败):

复制代码
STM32F103RCT6          USB转TTL模块(CH340/CP2102等)
     PA9 (TX)  --------->  RX
     PA10 (RX) <---------  TX
     GND       --------->  GND   (必须共地,否则电平基准不同,通信失败!)

⚠️ 新手最容易踩的坑:

  1. TX接TX,RX接RX(错!必须交叉连接:TX→RX,RX→TX)
  2. 忘记共地(GND)(错!不共地,信号电平没有参考基准,数据全是乱码)
  3. 用了错误的串口模块(一定要用USB转TTL模块,不能用RS232模块,电平不兼容会烧芯片!)

🖨️ printf重定向原理(为什么能像C语言一样打印?)

4.1 什么是printf重定向?

C语言标准库中的printf函数,默认是把数据打印到屏幕(标准输出) 。但在单片机里,没有操作系统,也没有屏幕,printf不知道该往哪里输出数据,一用就卡死。

printf重定向 就是告诉单片机:"printf打印的东西,统统通过串口1 发送出去!"这样一来,我们在代码里写printf("Hello World!"),数据就会通过PA9引脚发送到电脑的串口助手上显示出来。

4.2 重定向核心操作(两步搞定,新手直接抄)

  1. 包含头文件#include "stdio.h"(使用printf必须包含)
  2. 重写底层发送函数 :在STM32CubeIDE(GCC编译器)下,需要重写 __io_putchar() 函数。这是GCC标准库中printf底层调用的字符输出函数,重写它就能把printf的输出"拐"到串口上去。

🎯 实战目标:串口收发 + printf打印调试信息

本次实战从零新建工程,不依赖任何前序工程,硬件只需一个USB转TTL模块,实现以下功能:

✅ 效果1:单片机每隔1秒向电脑发送 "Hello STM32!\r\n"(串口助手能收到)

✅ 效果2:用printf打印变量值和程序运行状态(例如打印 "System Init OK!"、"Count = xxx")

✅ 效果3:单片机收到电脑发来的任何数据,立刻原样返回(回显功能,证明接收正常)

✅ 效果4:中断方式接收,不丢数据,不占用CPU

硬件基础:PA9(USART1_TX)→ 串口模块RX,PA10(USART1_RX)→ 串口模块TX,GND → GND。

🛠️ CubeIDE 1.19.0 新建工程+手把手配置(一步一截图,零踩坑,新手直接照搬)

重点🔥:全程从0新建工程,不沿用任何前序工程,每一步都有截图,哪怕你是纯新手,跟着做也能搞定!

💡 本章基于 STM32CubeIDE 1.19.0 版本编写。如果你使用的是其他版本(如1.18.0、1.17.0等),界面和操作流程基本一致,可以直接照搬,不用担心版本差异。

步骤1:新建CubeIDE工程(核心第一步,从零开始)

操作步骤(全程截图,直接照搬):

  1. 打开STM32CubeIDE,点击首页 Start a new STM32 project(新建工程)
  2. 在弹出的窗口中,搜索芯片型号 STM32F103RCT6,选中后点击 Next
  3. 填写工程名称(例如 USART1_Printf_Demo),选择工程保存路径,点击 Finish,等待工程创建完成

📌 小提醒:工程名称不要有中文、空格,否则可能报错;保存路径尽量简单,避免深层文件夹,方便后续查找工程文件。

步骤2:配置USART1(串口核心配置,新手直接抄)

操作步骤:

  1. 点击左侧 Pinout & ConfigurationConnectivity → 选择 USART1

  2. Mode 栏中,选择 Asynchronous (异步通信模式,最常用)

  3. 此时右侧芯片引脚图会自动将 PA9 设为 USART1_TXPA10 设为 USART1_RX (不用手动配引脚,CubeIDE自动搞定,太贴心了!)

  4. 切换到 Parameter Settings 界面,配置如下参数(直接照抄):

    • Baud Rate:115200 (波特率)
    • Word Length:8 Bits (including Parity) (数据位8位)
    • Parity:None (无校验)
    • Stop Bits:1 (停止位1位)

📌 功能解释:这一步配置了串口通信的基础参数,必须与电脑端串口助手设置的参数完全一致,否则会出现乱码或收不到数据。新手直接用115200-8-N-1这个组合,全球通用!

步骤3:开启USART1全局中断(实现接收中断必须做!)

操作步骤:

  1. 切换到 NVIC Settings 界面
  2. 找到 USART1 global interrupt,勾选 Enable(开启USART1中断总开关)
  3. 优先级(Priority)默认即可

📌 功能解释:只有开启中断,单片机才能在收到数据时自动触发中断服务函数,不用CPU一直傻傻查询串口状态。不开启的话,接收函数只能轮询,效率极低,容易丢数据!

步骤4:配置一个LED引脚(可选,用于指示程序运行状态)

为了让效果更直观,我们可以配置PA0作为LED指示灯(和前几章一样),每收到一次数据就翻转一次LED状态。

操作步骤:

  1. 在引脚图中找到 PA0,设置为 GPIO_Output
  2. 配置参数:推挽输出、无上下拉、低速、别名设为 LED

步骤5:生成代码

点击右上角的GENERATE CODE 按钮,等待代码生成完成。

💻 代码功能详解 + 实战编写(逐行拆解,新手也能懂)

生成代码后,我们需要添加4部分代码,实现printf重定向、串口发送、中断接收和LED翻转。

7.1 包含头文件(第一步,必须做)

打开 main.c,在文件开头 /* USER CODE BEGIN Includes *//* USER CODE END Includes */ 之间添加:

c 复制代码
/* USER CODE BEGIN Includes */
#include "stdio.h"   // 使用printf必须包含的头文件
#include "string.h"  // 使用字符串处理函数(后面会用到)
/* USER CODE END Includes */

7.2 printf重定向代码(核心!新手直接复制)

main.c 文件上 USER CODE BEGIN 0 方,/* USER CODE BEGIN 0 *//* USER CODE END 0 */ 之间添加以下代码:

c 复制代码
/* USER CODE BEGIN 0 */

// printf重定向到底层串口发送函数(新手必加,直接复制)
// 功能:把printf要打印的字符,通过USART1一个一个发送出去
int __io_putchar(int ch)
{
    // HAL_UART_Transmit:HAL库串口发送函数
    // 参数1:&huart1(指定用USART1发送)
    // 参数2:(uint8_t *)&ch(要发送的数据,取ch的地址)
    // 参数3:1(只发送1个字节)
    // 参数4:0xFFFF(超时时间,设大一点避免发送失败)
    HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
    return ch;
}

/* USER CODE END 0 */

📌 逐行功能解释(新手必看):

  • __io_putchar:这是GCC编译器(STM32CubeIDE使用的编译器)中printf底层调用的字符输出函数,它是一个弱定义函数,我们重写它,让每个字符都通过串口发出去。
  • HAL_UART_Transmit:HAL库提供的阻塞式串口发送函数,会一直等待数据发送完毕才返回。因为printf打印的数据量通常不大,阻塞发送完全够用。

💡 小提醒:添加完这段代码后,就可以在程序的任何地方使用printf了,和C语言一模一样,是不是很爽!

7.3 声明外部变量和缓冲区(用于中断接收)

main.c 文件开头,/* USER CODE BEGIN PV *//* USER CODE END PV */ 之间添加:

c 复制代码
/* USER CODE BEGIN PV */

// 串口接收数据缓冲区(存放收到的数据)
uint8_t rx_buffer[1];  // 每次只接收1个字节(中断方式下,一字节一中断)

// 接收完成标志(1表示收到数据,0表示没有)
volatile uint8_t rx_complete = 0;

/* USER CODE END PV */

7.4 启动串口中断接收(让串口开始"监听")

main 函数中,/* USER CODE BEGIN 2 *//* USER CODE END 2 */ 之间添加:

c 复制代码
/* USER CODE BEGIN 2 */

// 启动串口中断接收(核心!一行代码让串口开始监听)
// 参数1:&huart1(指定USART1)
// 参数2:rx_buffer(接收数据存放的数组)
// 参数3:1(每次接收1个字节,收到后立即触发中断)
HAL_UART_Receive_IT(&huart1, rx_buffer, 1);

// 用printf打印系统启动信息(测试重定向是否成功)
printf("\r\n=====================================\r\n");
printf("STM32 USART1 Printf Demo Start!\r\n");
printf("System Clock: %d MHz\r\n", HAL_RCC_GetSysClockFreq()/1000000);
printf("USART1 Baud Rate: 115200\r\n");
printf("Ready to receive data...\r\n");
printf("=====================================\r\n\r\n");

/* USER CODE END 2 */

📌 功能解释:

  • HAL_UART_Receive_IT:启动中断方式接收,只调用一次,之后每次收到指定数量的数据,就会自动进入中断回调函数。非阻塞,不占用CPU。
  • 后面的printf语句用来验证重定向是否成功,同时打印系统时钟频率等调试信息。

⚠️ 特别注意 :在STM32CubeIDE 1.19.0版本中,使用printf时有一个隐藏的坑 ------如果打印的字符串末尾没有\n,printf的缓冲区不会自动刷新,数据可能不会立即发送出去,导致串口助手收不到或延迟收到。所以新手一定要记住:每个printf语句结尾都要加上\r\n

7.5 主循环中添加定时发送(每秒发送一次)

while(1) 循环中,/* USER CODE BEGIN 3 *//* USER CODE END 3 */ 之间添加:

c 复制代码
/* USER CODE BEGIN 3 */

// 每隔1秒发送一次 "Hello STM32!" (用HAL_Delay简单实现,后续可用定时器优化)
HAL_Delay(1000);  // 延时1秒
printf("Hello STM32!\r\n");  // 通过串口发送字符串

// 如果收到了数据,处理接收到的数据(回显并翻转LED)
if(rx_complete == 1)
{
    rx_complete = 0;  // 清除标志
    
    // 把收到的数据原样发送回去(回显功能)
    HAL_UART_Transmit(&huart1, rx_buffer, 1, 0xFFFF);
    
    // 翻转LED,指示收到数据
    HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
    
    // 打印调试信息(可选)
    printf("[RX] Received: 0x%02X ('%c')\r\n", rx_buffer[0], rx_buffer[0]);
    
    // 重新启动中断接收(必须!否则只能接收一次)
    HAL_UART_Receive_IT(&huart1, rx_buffer, 1);
}

/* USER CODE END 3 */

📌 逐行功能拆解(新手必看,搞懂每一句):

  1. HAL_Delay(1000):延时1秒,让单片机每隔1秒发送一次 "Hello STM32!"。这里用HAL_Delay是为了演示简单,实际项目中建议用定时器中断实现非阻塞延时(参考第6章)。
  2. printf("Hello STM32!\r\n"):通过串口发送字符串。\r\n是回车换行,让串口助手显示时自动换行。
  3. if(rx_complete == 1):检查是否收到了数据。rx_complete会在中断回调函数中被置1。
  4. HAL_UART_Transmit:阻塞式发送函数,把收到的数据原样发回电脑(回显)。
  5. HAL_GPIO_TogglePin:翻转LED,直观提示收到了数据。
  6. 重点 :处理完数据后,必须再次调用 HAL_UART_Receive_IT 重新开启中断接收,否则只能收到第一个字节,之后就收不到了!

7.6 编写串口中断回调函数(处理接收完成事件)

main.c 文件最下方(main 函数之后),/* USER CODE BEGIN 4 *//* USER CODE END 4 */ 之间添加:

c 复制代码
/* USER CODE BEGIN 4 */

// 串口接收完成回调函数(HAL库中断机制自动调用)
// 功能:当HAL_UART_Receive_IT设定的接收数量达到时,自动执行此函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    // 判断是不是USART1产生的中断(防止其他串口干扰)
    if(huart->Instance == USART1)
    {
        // 设置接收完成标志,告诉主循环有数据到了
        rx_complete = 1;
        
        // 注意:这里不要调用 HAL_UART_Receive_IT 重新开启接收!
        // 应该由主循环处理完数据后再重新开启,否则会覆盖数据。
    }
}

/* USER CODE END 4 */

📌 功能解释:

  • HAL_UART_RxCpltCallback:这是HAL库定义的串口接收完成回调函数,名字固定,不能改!当HAL_UART_Receive_IT设定的接收数量(本例是1字节)完成时,硬件自动触发中断,HAL库处理后调用这个回调函数。
  • 我们在回调里只做最简单的事:置标志位。不要在回调里做复杂处理(比如printf打印),否则可能导致中断嵌套或其他问题。把数据处理放到主循环里,这是良好的编程习惯。

✨ 下载验证(见证奇迹的时刻!新手必看)

代码编写完成后,就可以下载到单片机,看看串口助手是不是能收到数据了!

操作步骤:

  1. 连接J-Link/ST-Link到单片机和电脑(下载程序用)
  2. 连接USB转TTL模块到电脑USB口,并确保接线正确(PA9→RX, PA10→TX, GND→GND)
  3. 打开电脑上的串口调试助手软件(推荐使用SSCOM、XCOM或VOFA+)
  4. 设置串口参数:端口号 选USB转TTL模块对应的COM口,波特率115200,数据位8,停止位1,无校验,无流控
  5. 点击 打开串口
  6. 回到CubeIDE,点击右上角的"下载"按钮,下载程序到单片机
  7. 下载完成后,单片机自动运行,观察串口助手窗口

【截图17:下载程序界面(标注下载按钮、下载完成)】

【截图18:串口助手参数设置(标注端口号、115200、8N1、打开串口)】

✅ 预期现象:

  1. 串口助手启动信息 :一上电就会收到类似以下信息:

    复制代码
    =====================================
    STM32 USART1 Printf Demo Start!
    System Clock: 72 MHz
    USART1 Baud Rate: 115200
    Ready to receive data...
    =====================================
  2. 每秒收到一次:"Hello STM32!" 字符串,说明定时发送成功。

  3. 回显功能测试 :在串口助手的发送区输入任意字符(比如 A),点击发送,会立刻在接收区看到收到的字符 A,同时LED状态翻转,并且会打印类似 [RX] Received: 0x41 ('A') 的调试信息。

🎉 恭喜!你已经学会了STM32的串口通信,并掌握了printf重定向这个调试神器!以后写代码再也不用瞎猜了,printf一下,变量值、程序流程一目了然!

📝 关键功能总结(新手必背,避免踩坑!)

  1. 📡 串口接线:TX接RX,RX接TX,必须共地(GND),否则通信失败。
  2. ⚙️ 串口参数:波特率115200,8位数据,1位停止,无校验(115200-8-N-1),必须与串口助手一致。
  3. 🖨️ printf重定向 :重写 __io_putchar,调用 HAL_UART_Transmit 发送字符。在CubeIDE(GCC编译器)下只需要这一个函数即可。
  4. 🔔 中断接收启动HAL_UART_Receive_IT(&huart1, rx_buffer, 1); 只调用一次,收到指定字节数后触发回调。
  5. 📌 接收回调函数HAL_UART_RxCpltCallback,名字固定,内部只做标志位置位,不处理复杂逻辑。
  6. 🔄 重新开启接收 :在主循环处理完数据后,必须再次调用 HAL_UART_Receive_IT,否则接收中断只触发一次。
  7. 🚀 阻塞发送 vs 中断发送HAL_UART_Transmit 是阻塞发送,适合少量数据;大量数据发送建议用 HAL_UART_Transmit_IT 或DMA(后续章节)。
  8. 📊 调试利器:printf可以打印变量值、程序流程、错误信息,比LED闪烁强大100倍!
  9. ⚠️ 换行符陷阱 :在STM32CubeIDE 1.19.0中,printf语句结尾必须加\r\n,否则数据可能不会立即发送到串口。

❌ 常见问题排查(遇到问题不用慌,对照排查!新手必看)

新手最容易踩的7个坑,全部整理好了,遇到问题直接对照,快速解决!

  1. 🚫 串口助手收不到任何数据

    • 原因1:接线错误(TX接TX,RX接RX,或者忘了共地)。检查:万用表测一下GND是否连通。
    • 原因2:串口模块驱动未安装(CH340/CP2102需要装驱动)。
    • 原因3:串口助手端口选错(选成其他COM口了)。
    • 原因4:程序未启动串口(没调用 HAL_UART_Receive_IT 或发送函数)。
  2. ⏱️ 串口助手收到乱码

    • 原因1:波特率设置不一致(最常见!检查CubeIDE配置和串口助手是否都是115200)。
    • 原因2:晶振频率配置错误(STM32F103默认使用外部8MHz晶振,若板子没有外部晶振需改为内部HSI,否则系统时钟不准)。
  3. 🔇 printf打印不显示或卡死

    • 原因1:没有重定向 __io_putchar 函数。
    • 原因2:重定向函数中使用了 HAL_UART_Transmit,但串口未初始化完成(确保在 MX_USART1_UART_Init() 之后调用printf)。
    • 原因3:printf语句末尾忘记加\r\n,缓冲区未刷新。解决 :每个printf结尾都加上\r\n
  4. 💡 只能收到第一个字节,后续收不到

    • 原因1:在主循环处理完数据后,忘记重新调用 HAL_UART_Receive_IT
    • 原因2:在回调函数里直接调用了 HAL_UART_Receive_IT,导致数据覆盖或标志紊乱。正确做法:回调里只置标志,主循环处理完后重新开启接收。
  5. 编译报错 "undefined reference to __io_putchar"

    • 原因:可能编译器未链接标准库。解决:项目属性 → C/C++ Build → Settings → Tool Settings → MCU GCC Linker → 勾选 Use nano.specs(使用精简标准库)。
  6. 🚨 接收数据时程序跑飞或死机

    • 原因1:接收缓冲区溢出(数组定义太小)。确保缓冲区大小足够容纳可能收到的最大数据量。
    • 原因2:中断优先级设置不当导致嵌套问题。新手保持默认优先级即可。
  7. 🖥️ 串口助手显示正常,但printf没有输出浮点数

    • 原因:STM32CubeIDE 1.19.0 默认未启用浮点数printf支持。解决:项目属性 → C/C++ Build → Settings → MCU GCC Linker → Miscellaneuos → 在 "Linker flags" 中添加 -u _printf_float

💡 小提醒:如果还是解决不了,评论区留言,我会一一回复,帮你排查问题~ 新手遇到问题很正常,多试几次,慢慢就不会踩坑了!

📢 下篇预告(精彩不容错过!新手必追)

STM32保姆级入门教程|第8章:PT100高精度测温实战 + ADS1232驱动 + 24位ADC数据解析

手把手教你:从0配置SPI接口、驱动24位高精度ADC芯片ADS1232、处理PT100采样数据、用串口打印实时温度曲线。搞懂工业级测温的完整信号链,为你的项目加上"专业范儿"!

原创不易,创作花费大量时间和精力💦,如果本文对你有帮助,欢迎 点赞👍、收藏⭐、关注➕,有任何问题,评论区留言,我会一一回复!你的支持,就是我持续更新的动力~


🎁欢迎关注公众号,获取更多技术干货!

博主准备到这份资料包涵盖了从硬件电路设计STM32单片机开发 ,再到Linux系统学习的全链路内容,适合不同阶段的学习者:

  • 硬件基础:包含硬件电路合集、硬件设计开发工具包,帮你打牢底层基础。
  • STM32专项:从环境搭建、开发工具、传感器模块到项目实战,还有书籍和芯片手册,一站式搞定STM32学习。
  • C语言进阶:C语言学习资料包,助你掌握嵌入式开发的核心语言。
  • 面试求职:嵌入式面试题合集,提前备战技术面试。
  • Linux拓展 :Linux相关学习资料包,拓宽技术视野。
📂资料包目录
  • 00-STM32单片机环境搭建
  • 01-硬件电路合集
  • 02-硬件设计开发工具包
  • 03-C语言学习资料包
  • 04-STM32单片机开发工具包
  • 05-STM32传感器模块合集
  • 06-STM32项目合集
  • 07-STM32单片机书籍&芯片手册
  • 08-Linux相关学习资料包
相关推荐
12.=0.4 小时前
【stm32_5】Systick嘀嗒定时器、解析时钟源、分析时钟树、应用Systick设计延时
c语言·stm32·单片机·嵌入式硬件
达不溜的日记5 小时前
CAN总线网络传输层CanTp详解
网络·stm32·嵌入式硬件·网络协议·网络安全·信息与通信·信号处理
沈跃泉7 小时前
C++串口类实现
c++·windows·串口通信·串口类
冷凝雨8 小时前
复旦微FM33 MCU 底层开发指南——UART
stm32·单片机·串口·uart·fm33lc0·复旦微电子
ting_zh9 小时前
基于 STM32F407 Discovery 向 W25Q16 SPI Flash 烧录固件
stm32·spi flash
白掰虾9 小时前
STM32CubeMX2教程——STM32C5 UART
stm32·单片机·嵌入式硬件·mcu·usart·stm32cubemx2·stm32c542
我不是程序猿儿10 小时前
【嵌入式】面向 STM32 的 ADC 与 DMA 学习路线
linux·stm32·单片机·嵌入式硬件·学习
一支闲人10 小时前
研究STM32库函数 如何操作寄存器
stm32·单片机
rit843249910 小时前
基于STM32的触控USB鼠标设计
stm32·嵌入式硬件·计算机外设