[STM32H7R/S]测评 ③串口printf输出日志
<div class='showpostmsg'> 本帖最后由 不爱胡萝卜的仓鼠 于 2024-10-12 00:40 编辑<p> 在日常调试中日志输出是一个非常重要的功能,今天我们就在上一篇文章工程的基础上增加串口功能。本来这种基础的功能我想跳过,但是调试过程中发现了一个很有意思的事情,想写出来与大家分享</p>
<p> </p>
<p><strong><span style="font-size:24px;">一.配置CubeMX</span></strong></p>
<p> 在配置cubemx前,我们需要知道开发板上ST-Link虚拟串口与H7的那个uart连接,并使用的是哪两个引脚。这个信息可以在《DM01038846_ENV2.0》这个文档中找到,如下图所示</p>
<div style="text-align: center;"></div>
<div style="text-align: center;"></div>
<p> 使用的是PD0、PD1</p>
<p> 接下来我们双击打开cubemx的ioc文件</p>
<div style="text-align: center;"></div>
<p> 在Connectivity中打开UART4,选择“App”的那个框。mode选择“Asynchronous”。接下来还要改一下右边的引脚图,RX默认是PB8,我们要改成PD0(虽然我们待会儿只用于打印日子,暂时用不到RX,不过还是给他配置正确)</p>
<div style="text-align: center;"></div>
<p> 然后点击右上角的生成代码即可</p>
<p> 因为上一篇中ld的那个问题,每次cubemx生成后,都要记得回去把那个文件给变回去</p>
<p> </p>
<p><strong><span style="font-size:24px;">二.CubeIDE中代码修改</span></strong></p>
<p><strong><span style="font-size:20px;">2.1 发送测试</span></strong></p>
<p> 首先我们现在测试一下数据能不能发出去,我们直接调用HAL_UART_Transmit函数即可发送数据。我在while1中放了以下测试代码</p>
<pre>
<code class="language-cpp"> unsigned char data[] = "123";
HAL_UART_Transmit(&huart4, data, sizeof(data), 0xFFFF);
</code></pre>
<div style="text-align: center;"></div>
<p> 串口日志正常输出,说明配置没问题</p>
<div style="text-align: center;"></div>
<p><strong><span style="font-size:20px;">2.2 printf</span></strong></p>
<p> 想要使用printf函数,需要做一下重定向,首先需要增加以下头文件,否则编译会报错</p>
<pre>
<code class="language-cpp">#include "stdio.h"</code></pre>
<p> </p>
<div style="text-align: center;"></div>
<p> 然后写一下printf重定向函数</p>
<pre>
<code class="language-cpp">int __io_putchar(int ch)
{
HAL_UART_Transmit(&huart4 , (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}</code></pre>
<div style="text-align: center;"></div>
<p> 然后针对float类型的数据,还需要额外再做一个操作</p>
<div style="text-align: center;"></div>
<p> </p>
<div style="text-align: center;"></div>
<p>把这两个勾上即可</p>
<p> </p>
<p>然后我们替换刚才的测试函数,换上printf来试试</p>
<pre>
<code class="language-cpp"> printf("666\r\n");
float a = 3.14;
printf("a = %.2f\r\n", a);</code></pre>
<p> </p>
<div style="text-align: center;"></div>
<p>结果如下</p>
<div style="text-align: center;"></div>
<p> </p>
<p><strong><span style="font-size:24px;">三.有意思的事情</span></strong></p>
<p> 我今天调试一开始使用的串口工具是正点原子的XCOM,平时我默认打开的是sscom,不知道咋了,今天鬼使神差的点了XCOM,既然都打开了,就用他吧。然后这个软件我之前还打开了时间戳</p>
<div style="text-align: center;"></div>
<p>结果发现他一直不出数据,我以为是我的代码有问题,给我一顿好找。最终发现下方的R:的数字是一直在上涨的,但是界面不显示。那我的程序应该没问题,串口是有东西输出的</p>
<p>接下来我换了SSCOM,就正常了(SSCOM我也勾选了时间戳)</p>
<p> </p>
<p>经过我反复的尝试,我发现XCOM的时间戳功能可能有点小问题,当向XCOM定时发送数据时,我的发送频率超过某个值后(这个值的边界是多少我没测试),他就会一直接收,不打印出来。</p>
<p>我猜测他是接收完数据后,要多少时间没有新的数据,他就认为接收完毕,然后把它打印出来,但是这个时间他写的比较大(我代码里400ms的delay发送一次数据,他这个至少是大于400ms的),就导致了这个问题。</p>
<p> </p>
<p>解决策略:</p>
<p>1.关闭时间戳功能</p>
<p>2.一定要时间戳的,要么换软件,要么保证不要很快的定时发送</p>
<p>3.XCOM开发人员修改一下代码,当RX buffer到达一定值后,例如50字节,就强制输出一次,不要一直收</p>
<p> </p>
<p> </p>
</div><script> var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;" style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
if(parseInt(discuz_uid)==0){
(function($){
var postHeight = getTextHeight(400);
$(".showpostmsg").html($(".showpostmsg").html());
$(".showpostmsg").after(loginstr);
$(".showpostmsg").css({height:postHeight,overflow:"hidden"});
})(jQuery);
} </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script> <p>CubeIDE中代码修改是技术活哈</p>
页:
[1]