串口是MCU最重要的一个通信端口,几乎所有的嵌入式产品都会用到串口,可能是产品预研的时候用来调试,可能是与某一个外设连接收发数据,还可能用来对产品进行固件升级。这篇文章主要给大家介绍一下如何用串口进行调试,也就是打印log。
打印log最常用的方法是printf,所以要解决的问题是将printf的输出重定向到串口,然后通过串口将数据发送出去。
首先要配置串口,串口的配置包括:
1、 开启串口和GPIO时钟
2、 GPIO引脚模式配置
3、 串口波特率、数据位、停止位、校验位的配置
4、 使能串口
代码如下(使用stm32 LL库):
此时,已经可以通过串口来收发数据了,但是只能通过库函数一个一个从数据寄存器读写单个字符,非常的不方便。
下面说一下如何重定向printf。这里我在Ubuntu下用make编译源码,所以重定向的方式与用keil有所区别。
首先要在源码文件开头包含头文件#include ,然后在串口初始化时调用setvbuf(stdout, NULL, _IONBF, 0),设置buffer缓存为0,这样一有数据就发送,不然会等到缓存满或有回车换行符才发送。如果没有这句,你的printf又没n,log就会打不出来。
接下来是重定向的代码
这里有两个地方需要注意,第一,用gcc编译需要加_write()函数,然后在函数内部调用__io_putchar()函数将字符串一个一个发送出去。第二,使用LL库发送数据,要查看发送寄存器是否为空或者发送是否完成标志,否则发的太快会导致前面的数据还没发完,后边的数据又来了,后边的覆盖掉前面的,导致发送错误。
到此,就可以尽情使用printf调试了。
全部0条评论
快来发表一下你的评论吧 !