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
    +关注

    关注

    2240

    文章

    10675

    浏览量

    348866
  • 函数
    +关注

    关注

    3

    文章

    3904

    浏览量

    61311
收藏 人收藏

    评论

    相关推荐

    [1.1]--直面JavaScript中的30个疑难杂症

    javascript
    jf_90840116
    发布于 :2023年02月21日 00:07:21

    三台疑难杂症 焊机维修

    电工基础
    YS YYDS
    发布于 :2023年06月21日 22:41:31

    求电子称方面的工艺资料

    本帖最后由 eehome 于 2013-1-5 09:59 编辑 如题,本人初入门此行业,想了解包括工艺流程,疑难杂症,设备等方面的技术,请知道的前辈指点。谢谢!!!!
    发表于 03-30 15:56

    疑难杂症,求高手解决

    我安装了Keil 2 以前还是好好的,后来不知道什么问题,不能编译了,编译键直是灰色的不能点,卸载掉2 安装3 也不能解决问题,重装了系统还是不行,本人现在用的是XP,求高人指点
    发表于 06-07 18:23

    数码科技交流

    `来福利来福利交流群!!欢迎大家前来参团吹牛皮,从这里躁动起来,本群目的:手机各种疑难杂症交流解决。第手资源共享及关于数码科技交流。搭建数码行业创业机会。打造数码市场!欢迎大家进群讨论!!!`[attach]***[/attach]
    发表于 07-27 23:27

    疑难杂症】9.03周STM32问答小结

    收录当天阅读量高且有学习意义的问答帖子,将每月评选出最好学者和最佳回答者赠送积分奖励1.STM32串口发送数据给PC机数据不致 https://bbs.elecfans.com
    发表于 09-03 18:08

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

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

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

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

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

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

    三极管8550疑难杂症

    各位大神baba,求教个问题,8550三极管,集电级前端我串了个33欧姆电阻,电阻阻值和精度都没问题,可是经过段时间33欧姆电阻老是被击穿,控制高低电平的40106,求教是不是8550出现问题了
    发表于 09-27 17:25

    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 655次阅读

    STM32编程疑难杂症

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