杂记:STM32 调试信息打印实现方式
杂记:STM32 调试信息打印实现方式
- 一、引言
- 二、使用 USART 串口打印
- 原理
- (二)实现步骤
- 硬件连接
- 代码实现
- 使用 ST - LINK 调试器 ITM 打印
- (一)原理
- (二)实现步骤
- 硬件连接
- 代码实现
- 四、使用 Semihosting 打印
- (一)原理
- (二)实现步骤
- 硬件连接
- 代码实现
- 五、对比USART1与STLINK调试器输出打印
- 5.1 硬件依赖性
- 5.2 适用场景
- 5.3 性能
- 5.4 使用方便性
一、引言
在 STM32 开发过程中,调试信息打印是一种非常实用的调试手段。通过打印关键信息,开发者可以实时了解程序的运行状态,快速定位和解决问题。本文将介绍几种常见的 STM32 调试信息打印实现方式,并给出相应的代码示例和图文说明。
二、使用 USART 串口打印
原理
USART(通用同步异步收发传输器)是 STM32 常用的通信接口,通过配置 USART 并将调试信息以字符形式发送出去,上位机(如电脑)使用串口调试助手接收并显示这些信息。
(二)实现步骤
硬件连接
将 STM32 开发板的 USART 引脚(TX、RX)通过 USB 转串口模块连接到电脑的 USB 接口。例如,使用 STM32F103 系列,通常 USART1 的 TX 为 PA9,RX 为 PA10。
代码实现
#include "stm32f1xx_hal.h"
#include <stdio.h>UART_HandleTypeDef huart1;// 重定向 fputc 函数
int fputc(int ch, FILE *f)
{HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY);return ch;
}void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART1_UART_Init(void);int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_USART1_UART_Init();while (1){printf("Hello, USART!\r\n");HAL_Delay(1000);}
}
使用 ST - LINK 调试器 ITM 打印
(一)原理
ITM(Instrumentation Trace Macrocell)是 ARM Cortex - M 内核提供的一种调试功能,通过 ST - LINK 调试器将调试信息从芯片传输到开发环境(如 Keil MDK)中显示。
(二)实现步骤
硬件连接
使用 ST - LINK 调试器通过 SWD 或 JTAG 接口连接 STM32 开发板。
代码实现
#include "stm32f1xx_hal.h"
#include <stdio.h>// 使能 ITM
#define ITM_Port8(n) (*((volatile unsigned char *)(0xE0000000+4*n)))
#define ITM_Port16(n) (*((volatile unsigned short*)(0xE0000000+4*n)))
#define ITM_Port32(n) (*((volatile unsigned long *)(0xE0000000+4*n)))
#define DEMCR (*((volatile unsigned long *)(0xE000EDFC)))
#define TRCENA 0x01000000int fputc(int ch, FILE *f)
{if (DEMCR & TRCENA){while (ITM_Port32(0) == 0);ITM_Port8(0) = ch;}return(ch);
}void SystemClock_Config(void);
static void MX_GPIO_Init(void);int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();while (1){printf("Hello, ITM!\r\n");HAL_Delay(1000);}
}
四、使用 Semihosting 打印
(一)原理
Semihosting 是 ARM 提供的一种机制,允许运行在目标芯片上的代码与主机(开发环境)进行交互,通过主机的标准输入输出设备进行调试信息的打印。
(二)实现步骤
硬件连接
使用 ST - LINK 调试器通过 SWD 或 JTAG 接口连接 STM32 开发板。
代码实现
配置半主机模式在Keil中,可以通过以下步骤启用半主机模式:
- 打开项目选项(Project -> Options for Target)。
- 在“Debug”选项卡中,选择“Settings”。
- 在“Semihosting”部分,启用“Semihosting”选项。

#include "stm32f1xx_hal.h"
#include <stdio.h>// 重定向 fputc 函数
extern int __io_putchar(int ch);
int fputc(int ch, FILE *f)
{return __io_putchar(ch);
}void SystemClock_Config(void);
static void MX_GPIO_Init(void);int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();while (1){printf("Hello, Semihosting!\r\n");HAL_Delay(1000);}
}
五、对比USART1与STLINK调试器输出打印
5.1 硬件依赖性
• USART1:需要硬件串口支持,需要连接串口线或USB转串口模块。
• STLINK:不需要硬件串口,但需要调试器支持半主机模式。
5.2 适用场景
• USART1:适用于需要在目标硬件上直接查看调试信息的场景,如嵌入式系统开发。• STLINK:适用于需要在开发环境中查看调试信息的场景,如调试阶段。
5.3 性能
• USART1:性能较高,适合大量数据输出。
• STLINK:性能较低,适合少量调试信息输出。
5.4 使用方便性
• USART1:需要配置串口和重定向 printf 函数。
• STLINK:配置简单,直接使用 printf 函数即可。
相关文章:
杂记:STM32 调试信息打印实现方式
杂记:STM32 调试信息打印实现方式 一、引言二、使用 USART 串口打印原理(二)实现步骤硬件连接代码实现 使用 ST - LINK 调试器 ITM 打印(一)原理(二)实现步骤硬件连接代码实现 四、使用 Semihos…...
python+unity落地方案实现AI 换脸融合
先上效果再说技术结论,使用的是自行搭建的AI人脸融合库,可以离线不受限制无限次生成,有需要的可以后台私信python ai换脸融合。 TODO 未来的方向:3D人脸融合和AI数据训练 这个技术使用的是openvcinsighface,openvc…...
ComfyUI流程图生图原理详解
一、引言 ComfyUI 是一款功能强大的工具,在图像生成等领域有着广泛应用。本文补充一点ComfyUI 的安装与配置过程遇到的问题,并深入剖析图生图过程及相关参数,帮助读者快速入门并深入理解其原理。 二、ComfyUI 的安装与配置中遇到的问题 &a…...
【C++ 真题】P1824 进击的奶牛
P1824 进击的奶牛 题目描述 Farmer John 建造了一个有 N N N( 2 ≤ N ≤ 1 0 5 2 \leq N \leq 10 ^ 5 2≤N≤105) 个隔间的牛棚,这些隔间分布在一条直线上,坐标是 x 1 , x 2 , ⋯ , x N x _ 1, x _ 2, \cdots, x _ N x1,x2,⋯,xN&a…...
26、深度学习-自学之路-NLP自然语言处理-理解加程序,怎么把现实的词翻译给机器识别。
一、怎么能让机器能够理解我们的语言呢,我们可以利用神经网络干很多的事情,那么我们是不是也可以用神经元做自然语言处理呢,现在很多的实际应用已经说明了这个问题,可以这么做。 那我们考虑一下该怎么做,首先我们应该…...
24电子信息类研究生复试面试问题汇总 电子信息类专业知识问题最全!电子信息复试全流程攻略 电子信息考研复试真题汇总
你是不是在为电子信息考研复试焦虑?害怕被老师问到刁钻问题、担心专业面答不上来?别慌!作为复试面试92分逆袭上岸的学姐,今天手把手教你拆解电子信息类复试通关密码!看完这篇,让你面试现场直接开大…...
leetcode25. K 个一组翻转链表
代码如图所示:下面还有一个跑代码的流程图,结合两个图片理解起来就好,感觉已经解释的很清晰了!! 一定要记住return dummy.next;这表示伪节点的下一个节点才是反转完的整个链表的头结点 补一个最后的,有点纰…...
工厂方法模式详解(Java)
一、工厂方法模式基础 1.1 定义与角色 工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它提供了一种创建对象的接口,但允许子类决定实例化哪一个类。这种模式的核心在于定义一个创建产品对象的工厂接口,将实际创建产品的过程延迟到子类中实现。这样做的主要…...
SpringBoot+Dubbo+zookeeper 急速入门案例
项目目录结构: 第一步:创建一个SpringBoot项目,这里选择Maven项目或者Spring Initializer都可以,这里创建了一个Maven项目(SpringBoot-Dubbo),pom.xml文件如下: <?xml versio…...
pdf.js默认显示侧边栏和默认手形工具
文章目录 默认显示侧边栏(切换侧栏)默认手形工具(手型工具) 大部分的都是在viewer.mjs中的const defaultOptions 变量设置默认值,可以使用数字也可以使用他们对应的变量枚举值 默认显示侧边栏(切换侧栏) 在viewer.mjs中找到defaultOptions,大概在732行,或则搜索sidebarViewOn…...
数据库第三次作业
第一题: 学生表:Student (Sno, Sname, Ssex , Sage, Sdept) 学号,姓名,性别,年龄,所在系 Sno为主键 课程表:Course (Cno, Cname,) 课程号,课程名 Cno为主键 学生选课表:S…...
渗透利器:YAKIT 工具-基础实战教程.
YAKIT 工具-基础实战教程. YAKIT(Yak Integrated Toolkit)是一款基于Yak语言开发的集成化网络安全单兵工具,旨在覆盖渗透测试全流程,提供从信息收集、漏洞扫描到攻击实施的自动化支持。其核心目标是通过GUI界面降低Yak语言的使用…...
变分边界详解
起因 当时看VAE论文时有这么一段,但是看完直接一头雾水,这都那跟哪,第一个公式咋做的变换就变出那么一堆。网上搜了很多博客都语焉不详,只好自己来写一篇,希望能解答后来人的疑惑。 公式1 参考文章:证据…...
计算机毕业设计——Springboot餐厅点餐系统
🎉**欢迎来到琛哥的技术世界!**🎉 📘 博主小档案: 琛哥,一名来自世界500强的资深程序猿,毕业于国内知名985高校。 🔧 技术专长: 琛哥在深度学习任务中展现出卓越的能力&a…...
Dav_笔记14:优化程序提示 HINTs -3
查询转换的提示 以下每个提示都指示优化程序使用特定的SQL查询转换: ■NO_QUERY_TRANSFORMATION ■USE_CONCAT ■NO_EXPAND ■REWRITE和NO_REWRITE ■MERGE和NO_MERGE ■STAR_TRANSFORMATION和NO_STAR_TRANSFORMATION ■事实和NO_FACT ■UNNEST和NO_UNNEST…...
Makefile的用法及算法应用
编译的过程 算法:解决特定问题的求解步骤 算法的设计 1.正确性 语法正确合法的输入能得到合理的结果对非法的输入,给出满足要求的规格说明对精心选择,甚至刁难的测试都能正常运行,结果正确 2.可读性,便于交流&…...
伯克利 CS61A 课堂笔记 08 —— Strings and Dictionaries
本系列为加州伯克利大学著名 Python 基础课程 CS61A 的课堂笔记整理,全英文内容,文末附词汇解释。 目录 01 Strings 字符串 Ⅰ Strings are An Abstraction. Ⅱ Strings Literals have Three Forms Ⅲ String are Sequences 02 Dictionaries 字典 …...
机器学习 - 理解偏差-方差分解
为了避免过拟合,我们经常会在模型的拟合能力和复杂度之间进行权衡。拟合能力强的模型一般复杂度会比较高,容易导致过拟合。相反,如果限制模型的复杂度,降低其拟合能力,又可能会导致欠拟合。因此,如何在模型…...
Springboot引入(集成)Mybatis-plus
1、添加依赖 <!--mysql数据库--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.49</version></dependency><!--mybatis-plus--><dependency><groupI…...
stm32 lwip tcp服务端频繁接收连接失效问题解决(tcp_recved)
一、问题描述 最近用stmf429单片机作为TCP服务端遇到一个问题,就是客户端特别频繁的发送消息,过一段时间以后,客户端的请求不再被客户端接收到,而且服务器端监控的掉线回调函数也不会被调用,好像这个连接就凭空的消失…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...
ubuntu系统文件误删(/lib/x86_64-linux-gnu/libc.so.6)修复方案 [成功解决]
报错信息:libc.so.6: cannot open shared object file: No such file or directory: #ls, ln, sudo...命令都不能用 error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory重启后报错信息&…...
ubuntu22.04 安装docker 和docker-compose
首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...
Python的__call__ 方法
在 Python 中,__call__ 是一个特殊的魔术方法(magic method),它允许一个类的实例像函数一样被调用。当你在一个对象后面加上 () 并执行时(例如 obj()),Python 会自动调用该对象的 __call__ 方法…...
C++11 constexpr和字面类型:从入门到精通
文章目录 引言一、constexpr的基本概念与使用1.1 constexpr的定义与作用1.2 constexpr变量1.3 constexpr函数1.4 constexpr在类构造函数中的应用1.5 constexpr的优势 二、字面类型的基本概念与使用2.1 字面类型的定义与作用2.2 字面类型的应用场景2.2.1 常量定义2.2.2 模板参数…...
