0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32的疑难杂症之一:Printf的使用

朱老师物联网大讲堂 2024-04-02 08:09 次阅读

一、Printf简介

Printf是一个标准的C库API,用来打印信息显示的。Printf的底层输出调用,在windows环境下是fputc函数,在GNUC环境下是__io_putchar函数。Printf主要做两件事:第一件是将参数字符串以及可变参数进行解析,格式化成 一串字符串。第二件事就是将格式化的字符串一个字节一个字节的输出出去(至于以什么样的方式输出那就得看底层的实现了,比如有OS的情况下就是输出在命令行下的)。52a1b8ce-f085-11ee-9118-92fbcf53809c.gif

二、Printf和串口

嵌入式设备中一般有两种调试方法,一种是硬件调试无需软件干预(利用厂商提供的仿真器和应用软件),另一种是软件调试(利用串口发送调试)。一般在系统初始阶段串口无法使用的情况下都是用的硬件进行调试但是这种方式不太灵活,限制很多,能用软件调试尽量都用软件,这种方式比较灵活。

串口设备本身只能将我们写入数据寄存器的数据发送出来,无法支持更多的功能。比如将存放十进制的数据的变量转换成字符形式再发出去,这样我们人才识别。而标准库的printf就是实现了这些功能。

printf的第一件事主要是软件实现,这个已经由C标准实现了我们不用管;而第二件事就是将printf格式化好的字符串输出到那个设备。所以我们只需要将fputc或者__io_putchar函数实现为串口的发送,然后通过USB转串口硬件发送到上位机上,上位机再通过串口助手程序显示出来。代码如下:

52b08cf0-f085-11ee-9118-92fbcf53809c.png

除此之外,我们还要再做一点配置工作—禁用半主机模式,禁用了半主机模式才能使用标准库函数printf()打印信息到串口,在程序中加入以下代码即可。

那么什么是半主机模式?为什么不用它?半主机模式是ARM单片机的一种调试机制,跟串口调试不一样的是,它需要通过仿真器来连接电脑和ARM单片机,并调用相应的指令来实现单片机向电脑显示器打印信息(或者从电脑键盘读取输入)。简而言之,这种方法比串口调试更复杂(需要进行更多的配置操作),也更不灵活(一定要用仿真器)。

5309d120-f085-11ee-9118-92fbcf53809c.png

上面的配置似乎有点麻烦,要加入这么一堆难懂的代码,难道没有更简便点的方法吗?有,但不推荐

方法是使用微库(MicroLIB),只要在Keil的“Options for Target -> Target ->Use MicroLIB”上打勾,即可使用串口打印(fputc()函数还是要实现,但上述的禁用半主机代码不用加)。

微库是区别于C标准库的另一个库,当使用微库时,就默认关闭了半主机模式,也就不用添加上面的代码。这样虽然方便,但个人建议能不用就不用,原因:

第一,微库是为小内存嵌入式设备而设计的,使用它可以减少代码所占空间,但对现在STM32等单片机来说,内存一般都够用,微库并非必需。

第二,微库相对于C标准库而言,支持的功能更少,主要体现在对操作系统的支持上。总的来说,标准的东西总是相对更可靠,所以为了不必要的掉坑,还是用C标准库,不用微库。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • STM32
    +关注

    关注

    2274

    文章

    10929

    浏览量

    357995
  • 函数
    +关注

    关注

    3

    文章

    4350

    浏览量

    63051
收藏 人收藏

    评论

    相关推荐

    解决射频电路的疑难杂症的方法分享

    射频电路板设计由于在理论上还有很多不确定因素,因此统称为“疑难杂症”。对于初入茅庐的工程师而言,缺乏实战经验,自己独立应变能力较差,本文更适合给刚刚踏入电源行业的工程师,希望有助于工程师们遇到那些“疑难杂症”时,可以从容应对。
    发表于 10-21 13:48

    二层板的射频RF信号如何控阻抗 四层板的射频RF信号如何控阻抗 射频信号是否可以不控阻抗,精选资料分享

    来自专治PCB疑难杂症主群(五大群群友突破2000人啦,添加杨老师微信号Johnnyyang206,可添加入群)的疑难杂症讨论:二层板的射频如何走线 四层板的射频如何控阻抗 射频信号是否可以不控阻抗
    发表于 07-27 07:44

    飞控疑难杂症解决方法汇总

    (pixhawk)飞控疑难杂症解决方法汇总(持续更新)by 怒飞垂云2019年11月4日APM无法解锁/飞控连不上/黄灯闪烁/起飞侧翻/定点定不住/定高不稳/电台连不上/地面站连不上……无人机调试
    发表于 08-06 06:21

    DC/DC电源输入输出要隔离吗

    DC/DC电源输入输出要隔离还是要保证短距离回路?关注微信公众号:专治pcb疑难杂症 (PCBDoctor) 解决遇到的各种PCB疑难杂症。整理:杨老师 专治PCB疑难杂症群平台简介专治PCB
    发表于 11-16 07:28

    减少DC-DC输出端纹波的方法

    来自专治PCB疑难杂症总群的疑难杂症解析(添加杨医生微信号:johnnyyang206可入群讨论): 关注杨医生微信公众号:专治pcb疑难杂症 (PCBDoctor) 解决遇到的各种PCB疑难
    发表于 11-17 06:54

    电源平面是否可以作为RF信号

    转自专治pcb疑难杂症Q:来自专治PCB疑难杂症首群:四层板,层叠走TOP-GND-POWER-BOTTOM,做共面阻抗,参考第三层的话,刚好天线下面的第三层区域走的电源3V3,有影响吗?还是天线
    发表于 12-31 08:17

    人工智能解决了许多的疑难杂症

    深度学习目前取得重大进展,解决了人工智能界的尽最大努力很多年仍没有进展的疑难杂症
    发表于 06-29 10:25 812次阅读

    3D打印康复辅具 为疑难杂症的治疗带来新的可能

    句祝你平安、愿你健康,饱含的是祝福者满满的真诚与心意。当身体遭受病痛的折磨时,人们心中怀有的心愿就是早日恢复健康,能够像往常样自由的嬉笑打闹、蹦蹦跳跳。高科技的迅速发展,正为疑难杂症的治疗带来新的可能。医生和患者,也成为了接
    的头像 发表于 03-17 14:12 1981次阅读

    在vscode上用gcc征服debug过程中遇到的各种疑难杂症

    vscode上用gcc征服debug过程中遇到的各种疑难杂症! 2. 安装MinGW MinGW是什么东西,怎么安装?这里就不详述了,随便百度出来堆。
    的头像 发表于 11-18 16:18 5163次阅读

    RF射频信号,高速信号能将电源平面作为参考平面吗?

    来自专治PCB疑难杂症主群(五大群群友突破2000人啦,添加杨老师微信号Johnnyyang206,可添加入群)的疑难杂症:Q:来自专治PCB疑难杂症首群:四层板,层叠走
    发表于 11-06 21:06 10次下载
    RF射频信号,高速信号能将电源平面作为参考平面吗?

    DC/DC电源输入输出要隔离还是要保证短距离回路?

    来自专治PCB疑难杂症主群(群友突破1200人啦,添加杨老师微信号Johnnyyang206,可添加入群)的疑难杂症:DC/DC电源输入输出要隔离还是要保证短距离回路?关注微信公众号:专治pcb
    发表于 11-09 15:51 16次下载
    DC/DC电源输入输出要隔离还是要保证短距离回路?

    如何减少DC-DC输出端的纹波?

     来自专治PCB疑难杂症总群的疑难杂症解析(添加杨医生微信号:johnnyyang206可入群讨论):    关注杨医生微信公众号:专治pcb疑难杂症 (PCBDoctor) 解决遇到的各种PCB
    发表于 11-09 19:06 2次下载
    如何减少DC-DC输出端的纹波?

    Linux问题故障定位大全

    有时候会遇到疑难杂症,并且监控插件并不能眼立马发现问题的根源。
    的头像 发表于 07-10 10:27 514次阅读
    Linux问题故障定位大全

    罗盘为什么会出现Bad Compass Health

    pixhawk飞控疑难杂症解决方案
    发表于 11-27 09:38 0次下载

    STM32编程疑难杂症

    疑难杂症
    的头像 发表于 03-28 23:29 530次阅读
    <b class='flag-5'>STM32</b>编程<b class='flag-5'>疑难杂症</b>