单片机没有串口,你会如何打印调试信息?

2023-11-09

摘要:输出调试信息是软件开发中必不可少的调试利器,在出现bug时如果没有调试信息将会是一件令人头痛的事。本文主要介绍在嵌入式开发中用来输出log的方法,这些方法都是在实际开发过程中使用过的。

嵌入式开发的一个特点是很多时候没有操作系统,或者没有文件系统,常规的打印log到文件的方法基本不适用。最常用的是通过串口输出uart log,例如51单片机,只要实现串口驱动,然后通过串口输出就可以了。

这种方法实现简单,大部分嵌入式芯片都有串口功能。但是这样简单的功能有时候却不是那么好用,比如:

一款新拿到的芯片,没有串口驱动时如何打印log

某些应用下对时序要求比较高,串口输出log占用时间太长怎么办?比如usb枚举。

某些bug正常运行时会出现,当打开串口log时又不再复现怎么办?

一些封装中没有串口,或者串口已经被用作其他用途,要如何输出log?

一、输出log信息到SRAM

准确来说这里并不是输出log,而是以一种方式不使用串口就可以看到log。在芯片开发阶段都可以连接仿真器调试,可以使用打断点的方法调试,但是有些操作如果不能被打断就没法使用断点调试了。这时候可以考虑将log打印到SRAM中,整个操作结束后再通过仿真器查看SRAM中的log buffer,这样就实现了间接的log输出。

本文使用的测试平台是,基于usb host实验代码,对于其他嵌入式平台原理也是通用的。

首先定义一个结构体用于打印log,如下:

定义一段SRAM空间作为

log buffer是环形缓冲区,在小的buffer就可以无限打印log,缺点也很明显,如果log没有及时输出就会被新的覆盖。Buffer大小根据SRAM大小分配,这里使用1kB。

为了方便输出参数,使用printf函数来格式化输出,需要做如下配置

并包含头文件, 在代码中实现函数

写入数据到Sram:

为了方便控制log打印格式,在头文件中再添加自定义的打印函数:

在需要打印log的地方直接调用DEBUG()即可,最终效果如下,从Memory窗口可以看到打印的log:

二、通过SWO输出log

通过打印log到SRAM的方式可以看到log,但是数据量多的时候可能来不及查看就被覆盖了。为了解决这个问题,可以使用St-link的SWO输出log,这样就不用担心log被覆盖。

在log结构体中添加SWO的操作函数集:

SWO只需要print操作函数,实现如下:

使用SWO输出log同样先输出到log buffer,然后在系统空闲时再输出,当然也可以直接输出。log延迟输出会影响log的实时性,而直接输出会影响到对时间敏感的代码运行,所以如何取舍取决于需要输出log的情形。在while循环中调用output_ch()函数,就可以实现在系统空闲时输出log。

2.1 通过IDE输出

使用IDE中SWO输出功能需要做如下配置(Keil):

在窗口可以看到输出的log:

2.2 通过STM32 ST-LINK Utility输出

使用STM32 ST-LINK Utility不需要做特别的设置,直接打开ST-LINK菜单下的Printf via SWO viewer,然后按start:

三、通过串口输出log

以上都是在串口log暂时无法使用,或者只是临时用一下的方法,而适合长期使用的还是需要通过串口输出log,毕竟大部分时候没法连接仿真器。

添加串口输出log只需要添加串口的操作函数集即可:

实现串口驱动函数:

添加串口输出log与通过SWO过程类似,不再多叙述。而下面要讨论的问题是,串口的速率较低,输出数据需要较长时间,严重影响系统运行。虽然可以通过先打印到SRAM再延时输出的办法来减轻影响,但是如果系统中断频繁,或者需要做耗时运算,则可能会丢失log。要解决这个问题,就是要解决CPU与输出数据到串口同时进行的问题,嵌入式工程师立马可以想到DMA正是好的解决途径。

使用DMA搬运log数据到串口输出,同时又不影响CPU运行,这样就可以解决输出串口log耗时影响系统的问题。串口及DMA初始化函数如下:

DMA输出到串口的函数如下:

这里为了方便直接使用了查询DMA状态寄存器,有需要可以修改为DMA中断方式,查Datasheet可以找到串口2使用DMA1 channel4的stream6:

最后在PC端串口助手可以看到log输出:

使用DMA搬运log buffer中数据到串口,同时CPU可以处理其他事情,这种方式对系统影响最小,并且输出log及时,是实际使用中用的最多的方式。并且不仅可以用串口,其他可以用DMA操作的接口(如SPI、USB)都可以使用这种方法来打印log。

四、使用IO模拟串口输出log

最后要讨论的是在一些封装中没有串口,或者串口已经被用作其他用途时如何输出log,这时可以找一个空闲的普通IO,模拟UART协议输出log到上位机的串口工具。

常用的UART协议如下:

只要在确定的时间在IO上输出高低电平就可以模拟出波形,这个确定的时间就是串口波特率。

为了得到精确延时,这里使用TIM4定时器产生1us的延时。注意:定时器不能重复用,在测试工程中TIM2、3都被用了,如果重复用就错乱了。

初始化函数如下:

使用定时器的delay函数为:

最后是模拟输出函数,注意:输出前必须要关闭中断,一个byte输出完再打开,否则会出现乱码:

介绍了几种开发中使用过的打印调试信息的方法,方法总是死的,关键在于能灵活使用;通过打印有效的调试信息,可以帮助解决开发及后期维护中遇到的问题,少走弯路。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单片机没有串口,你会如何打印调试信息? 的相关文章

  • OVP电路应用(一)_12V电源_DIO1280

    目录 前言 一 基本信息 二 基本电气特性 1 PIN定义 2 电气特性 3 OVP值的设置 4 时序 5 其他 三 实际设计案例 1 电路原理图 PCB Layout 2 测试 3 问题与对策 四 USB的VBUS应用 其他举例 1 电路
  • 基于STM32的智能电子药盒设计

    1 前言 据报告显示中国有2 3亿的60岁以上老人 占全国总人口的六分之一 在老年人中 有65 以上的老年人都是慢性病患者 其中失能和半失能老人将近四千万 并且人口还在以加速度增长 老年人的身体健康成为社会密切关注的问题 大部分的老年人都患
  • 恒流源电路简介

    一 NPN三极管恒流源 如上图 假设D1 D2正向导通压降Vf为0 7V 那么三极管Q1基级电压Ub 2Vf 1 4V 假设三极管Q1基级和发射级之间压降Ube为0 7V 那么Q1发射级的电压Ue则为Ub Ube 1 4 0 7 0 7V
  • 硬件十万个为什么

    1 电源类 1 1 电源基础 各种 地 各种 GND 板载电源设计规范 电源环路稳定性评价方法 深入芯片内部 理解去耦电容的作用 减小DC DC变换器中的接 地反弹 一些接地要点 开关电源中的小启示 电源相关的测试 去耦电容的选择 容值计算
  • 模拟电路设计(11)--- 运算放大器实际使用注意事项

    判断是否负反馈状态 我们先来说下什么是负反馈 凡是将放大电路输出量 电压或电流 直流或交流 的一部分或全部 通过一定的电路 称为反馈电路 以一定的方式 串联或并联 反送到放大电路的输入电路 减小净输入量 从而使输出量比无反馈时也随之减小的反
  • MS5543单通道、16位、串行通信、高速ADC转换芯片

    产品简述 MS5543 是一款单通道 16 位 串行输入 电压输出的数模 转换器 采用 2 7V 至 5 5V 单电源供电 输出范围为 0V 至 V REF 在输出范围内保证单调性 在温度范围为 40 C 至 85 C 能够提供 1LSB
  • 【详解】指令系统中跳转指令与OF,SF,CF,ZF的关系

    目录 无符号跳转表示法 有符号跳转表示法 无符号跳转表示法详解 有符号跳转表示法详解 无符号跳转表示法 小于 大于等于 小于等于 大于 有符号跳转表示法 小于 大于等于 小于等于 大于 无符号跳转表示法详解 我在学习这部分的最大的困惑点就是
  • 芯片手册中的英文的表示含义

    芯片手册中的英文的表示含义 在读芯片的数据手册的时候 会有一些英文表示不知道是什么含义 现在整理了一些在下面 1 ppm 在一些电压芯片数据手册里 有一个描述基准性能的直流参数 称为温度漂移 也称温度系数 或简称TC Temperature
  • 数字万用表的使用

    参考 连3岁小孩子都能看懂的万用表使用方法 地址 https www bilibili com video BV1Gx411z7x2 p 1 vd source cc0e43b449de7e8663ca1f89dd5fea7d 目录 万用表
  • 关键元器件选型设计指引--通用逻辑器件(逻辑IC)

    1 物料分类 标准逻辑器件 标准数字逻辑IC集成电路可以从工艺 功能和电平三个方面划分 列表所示 注 常见的逻辑电路有54军用系列和74商用系列 两者电路功能一致 本文仅讨论74系列 按照制造工艺特点分类 工艺 逻辑器件产品族 优点 不足
  • Allegro输出带等长规则的Excel操作指导

    Allegro输出带等长规则的Excel操作指导 Allegro可以输出带等长规则的Excel文件 方便检查和查阅 具体操作如下 打开规则管理器 选择Relative Propagation Delay 选择需要输出的match group
  • DC/DC:闭环控制的隔离型反激变换电路设计及实验仿真(文章底部含仿真程序获取方式)

    反激变换电路在开关管导通时电源将电能转为磁场能储存在变压器中 当开关管关断时再将磁能转变为电能传送到负载 单端反激变换电路是由升降压 Buck Boost 变换电路派生而来的 电路图如图所示 反激变换电路的原理设计可参考文章 DC DC 单
  • AD20/Altium designer——如何对PCB添加图片丝印、自定义LOGO、专属图案

    本篇介绍如何在PCB添加图案丝印并调节大小 主要步骤 图片转单色图 bmp格式 复制粘贴进word文档 再次复制到AD 1 选择图片用电脑自带的画图软件打开 2 将图片另存为 bmp格式 3 查看图片效果是否理想 图片是否需要取反色 选做
  • 【模电】0017 开关电源的原理及分析

    开关电源一般简称为DCDC 比我们前两节分析的线性电源复杂一些 它与线性电源最大的不同在于其调整管的工作状态 开关电源中的调整管工作在开关状态 即只工作在饱和区和截止区 1 典型开关电源的原理 一个典型的降压型开关电源原理如下图 首先 我们
  • 西门子300系列基本逻辑编程:手自动选择程序及自定义脉冲模块的使用

    西门子内置脉冲发生器 M0 0 0 1S M0 1 0 2S M0 2 0 4S M0 3 0 5S M0 4 0 8S M0 5 1 0S M0 6 1 6S M0 7 2 0S 案例 手自动选择程序 控制要求 I0 0是手自动选择开关
  • CTLE均衡器的使用问题

    CTLE是一种高速数字通信中很常见的均衡器 有别于其他常用的FFE和DFE等数字滤波器 它是一种模拟滤波器 一般通过传递函数的方式表征 以USB3 1 Gen2的公式举例 在其峰值增益 第一极点和第二极点均为定值的前提下 幅频响应曲线将通过
  • 学习区分dB、dBm、dBuV、dBi

    dB 对于分贝的概念 很多朋友最早接触这个概念 是用 分贝 评估声音的大小 声音的大小用分贝 dB 表示 是一种对数单位 用来描述声音的强度或功率比例 如果P是我们需要测试的声压级或声功率级 P0是参考值 通常取为标准听觉阈限的声压级 X
  • 1.69寸SPI接口240*280TFT液晶显示模块使用中碰到的问题

    1 69寸SPI接口240 280TFT液晶显示模块使用中碰到的问题说明并记录一下 在网上买了1 69寸液晶显示模块 使用spi接口 分辨率240 280 给的参考程序是GPIO模拟的SPI接口 打算先移植到FreeRtos测试 再慢慢使用
  • allegro画PCB如何更新元件的PCB封装

    allegro画PCB如何更新元件的PCB封装 一 更新单个器件的PCB封装 首先菜单栏选择Place gt Update Symbols 如下图 注意此案例是更新了C0805封装 中更新封装 就将上图第二个红色方框中的勾选即可 二 更新某
  • 48V转12V的DC-DC稳压电路推荐

    项目或学习过程中好用且稳定的DC DC的电路将是一个成功硬件项目的基础 主芯片 MP9486 MP9486A 是一款高压降压型开关稳压器 可输 出高达 1A 的持续电流至负载 它集成了一个高 压高端 MOSFET 提供 3 5A 的典型峰值

随机推荐

  • 【vue2+element ui】添加修改共用表单的下拉框回显问题分析以及解决方案(附共用表单代码)

    目录 简介 问题复原 问题分析 共用表单代码分享 简介 本人前端水平不佳 本文分享在编写个人项目前端代码的时候遇到的回显问题的解决办法 仅供参考 问题复原 首先展示表单中的问题代码 本次前端的设计是添加和修改操作共用表单 但是其中有一个下拉
  • 陀螺产业区块链第三季

    2020年4月 国家发改委在例行新闻发布会上宣布区块链被正式列为新型基础设施中的信息基础设施 自此区块链正式搭上新基建的 风口 与传统基础设施建设相比 新型基础设施建设更加侧重于突出产业转型升级的新方向 无论是5G还是区块链 都体现出加快推
  • 网站服务器停止服务,DDoS攻击是如何让网站停止服务的?

    DDoS攻击 是一种耗尽攻击目标的系统资源 导致攻击目标无法响应正常的服务请求的网络攻击方式 虽然 大规模的DDoS攻击占据了大部分的头条新闻 但实际上 较小的DDoS攻击在网络安全环境中更为常见 在没有做好充分的防护之下 较小规模的DDo
  • 电动汽车移动充电站Mobi Charger问世

    12月26日 电动和混合动力汽车新闻网站Ecomento报道称 初创公司FreeWire针对电动汽车推出了移到充电设备Mobi Charger 目前 社会尚未认同在办公场所为电动汽车充电 举例而言 当你已经开始工作 而电动汽车正在外面充电
  • 微信小程序实现商品列表跳转详情页

    实验要求 模仿京东小程序 实现下列功能 首页包含了手机图片 手机的描述 手机的价格 购物车图标 首页显示两行文字 多余的文字隐藏 以3个点代替 点击页面不同的地方 能够跳转到不同的手机详情页面 手机详情页包含手机图片 上架日期 价格 手机描
  • centos 8 编译安装hyperscan

    一 编译安装环境配置 官方文档 http intel github io hyperscan dev reference getting started html 1 1硬件配置 配置 参数 CPU Intel Xeon Gold 5218
  • 统计学 相关性 因果_为什么相关性不表示因果关系-这种在统计中的常用说法的含义...

    统计学 相关性 因果 You might remember this simple mantra from your statistics class 您可能还记得统计课上的这个简单口头禅 Correlation does not impl
  • phpMyAdmin报错 in ./libraries/config/FormDisplay.php#661 continue targeting switch is equivalent to

    phpMyAdmin报错 in libraries config FormDisplay php 661 continue targeting switch is equivalent to break Did you mean to us
  • Android 13 媒体权限适配指南

    在 Android 系统最近的几个大版本里 更新方向有很大一部分都集中在了隐私安全这一方面 每个版本都会新增隐私安全限制 或者是对之前的隐私项进行进一步的升级 Android 10 分区存储 限制访问不可重置的硬件标识符 限制对剪贴板数据的
  • uView1.0 indexList索引列表遇到的坑

    在使用uView索引列表做通讯录的时候遇到了几个问题 先上图片 问题1 右侧的abcd首字母按钮点击错乱 比如点了f 弹出显示的是a开头的人 应该是f开头的人才对 通过排查 发现传入这个右侧组件参数的时候 后端并没有返回完整的A Z 而是有
  • C++适配器模式

    适配器模式 1 适配器模式简介 适配器模式其实是实现了两个互不兼容的已有系统之间的桥梁效果 所以适配器模式可以说是为了实现功能的一种补救措施 最好的方式是将系统重构使用工厂模式即可 但是对已有系统的重构代价过大 所以一般情况下我们都会通过适
  • 日志语义异常检测

    日志记录了软件系统运行时的详细信息 系统开发与运维人员可以根据日志监控系统剖析系统的异常行为与错误 日志异常检测可以分为语义异常 执行结果 执行异常 执行日志序列 与性能异常 执行时间 1 日志异常类型 日志记录系统在某个时间点执行了某些操
  • 设计模式-适配器模式

    文章目录 前言 介绍 实例 使用场景 优缺点 前言 当我们需要使用一个已存在的类 但其接口不符合我们的需求时 适配器模式 Adapter Pattern 可以派上用场 适配器模式是一种结构型设计模式 它允许我们创建一个中间层 将一个类的接口
  • 自己制作证件照回执

    今天身份证过期 去办理身份证 照个像回执收了30 给个6张一寸小图片 照的还不好看 因此我觉得是不是可以自己弄个回执 照片也是浪费 没有什么用 于是自己摸索了教程 1 拍一张纯色背景正面照 按照证件要求拍 手机拍照片尽量清晰 最好是相机那种
  • ReadProcessMemory Types of actual and formal var parameters must be identical

    转自 https www cnblogs com cb168 p 5884673 html delphi XE Berlin ReadProcessMemory WriteProcessMemory delphi XE Berlin dcc
  • 变长参数表va_list,模板template,打造通用函数

    假设我想写一个支持变长参数的max函数 template
  • 还在找数据库日期如何格式化嘛?看这一篇文章就够了

    目录 1 MySQL数据库 2 PostgreSQL Oracle 人大金仓 1 MySQL数据库 DATE FORMAT 函数 示例 SELECT DATE FORMAT NOW Y m d H i S 食用方法如下 DATE FORMA
  • vue中nextTick使用引起的一个小问题

    问题描述 两个页面之间进行快速切换会报错元素找不到 问题原因 该方法的调用是在nextTick中 也就是放在微任务队列中 当切换到该页面后主任务开始执行 主任务执行完成后 更新dom元素 然后才是下一个tick 然后快速切出该页面 组件销毁
  • 量产国产服务器cpu芯片,中国第一!百度自研芯片量产:配国产CPU

    目前 三星电子与百度联合宣布 昆仑芯片已经完成所有研发工作 将在明年初投入规模量产 采用三星14nm工艺 这也是两家巨头的第一次代工合作 2018年7月份 百度发布了自主研发的中国首款云端AI全功能AI芯片 昆仑 号称业内设计算力最高的AI
  • 单片机没有串口,你会如何打印调试信息?

    摘要 输出调试信息是软件开发中必不可少的调试利器 在出现bug时如果没有调试信息将会是一件令人头痛的事 本文主要介绍在嵌入式开发中用来输出log的方法 这些方法都是在实际开发过程中使用过的 嵌入式开发的一个特点是很多时候没有操作系统 或者没