【Microchip WBZ451 Curiosity】4.串口使用及printf重定向
<div class='showpostmsg'><ol><li>前言<br />
经过开箱、环境搭建 ,以及初体验之后,本次我们来到第一个真正做的外设使用了。在挑选哪个外设的问题上,想了想最终选择了在使用,甚至调试上使用非常多,也非常有用的一个,就是串口usart。本次参考官方的demo方法,采用mcc进行开发。</li>
<li>准备</li>
</ol>
<ol>
<li>硬件:开发板,PC<br />
研究了下硬件,从系统框图中,发现板子上不仅有一颗USB转串口,竟然还放了一颗USB HUB芯片和附带的一颗晶振。为的就是让模块和仿真芯片都能用上一个USB座子。microchip还真是敢在开发板上堆料啊,前面还提到有一颗自家的加密芯片,真的,诚意足足。<br />
</li>
<li>软件:MPLAB X,MCC,Harmony及对应的组件</li>
</ol>
<ol>
<li>编写代码</li>
</ol>
<ol>
<li>创建项目<br />
可以参考环境搭建时创建Harmony项目的方法创建一个usart项目。<br />
<br />
如下就是创建之后的项目<br />
</li>
<li>串口选择<br />
从原理图看,结合前面提到的系统框图,USART经过了USB转串口,再通过USB HUB芯片,接到电脑端去。<br />
<br />
<br />
而从图中也可以看到WBZ451的串口正好使用的是SERCOM0<br />
</li>
<li>加入usart<br />
从左侧的Device Resource中打开Peripherals,再点开SERCOM,选中SERCOM1双击或者点击其先放的加号即可在右侧Project Graph中看到SERCOM0了。<br />
<br />
</li>
<li>配置串口<br />
选中Project Graph中的SERCOM0之后,右侧的Configuration Options就可以看到它的具体配置项了。<br />
</li>
<li>生成代码</li>
</ol>
<p>按照上图配置完之后,即可点击下面Project Resources中的Generate生成源代码了</p>
<p></p>
<p>可以在输出信息中看到代码生成成功</p>
<p></p>
<p>此时点开左侧Projects展开,即可看到具体的代码。</p>
<p></p>
<ol>
<li>编译下载和运行<br />
点击Production下的编译主项目即可编译代码<br />
<br />
点击绿色 Run按钮即可下载并运行<br />
<br />
如果板子首次链接,则会跳出如下所示提示,选择正确板子即可<br />
<br />
下载成功提示<br />
<br />
然后我们打开串口调试软件并从电脑设备管理器中找到对应的串口号,按照初始化参数配置。<br />
<br />
运行之后发现并没有任何串口数据发送出来,按复位键也没有数据。这时候我们就要改一下代码了。</li>
<li>代码分析<br />
在修改代码之前,我们线分析一下生成的代码。<br />
首先找到main文件打开并找到main函数<br />
<br />
从 SYS_Initialize 函数进入,可以看到做了GPIO以及主角SERCOM在内的初始化。<br />
<br />
发现代码仅仅调用 SYS_Initialize 函数做了初始化,没有做其它业务了。<br />
我们从 SERCOM0_USART_Initialize 跳转,就可以找到串口相关的操作代码了。<br />
</li>
<li>修改代码并运行<br />
接下来我们就增加一个初始化之后,发送一串数据的代码<br />
从上述 SERCOM0_USART_Initialize所在文件中可以找到<br />
bool SERCOM0_USART_Write( void *buffer, const size_t size )<br />
其功能就是发送指定长度的数据,下面我们就定义一串字符“Hello,Microchip”,并调用该函数发送。<br />
<br />
按照前述方法编译并下载运行<br />
发现还是不行,串口调试工具上仍旧没有任何数据发出。此时再回到官方资料,发现还是少了一步,就是我们要将usart的pin模式改为Direct Mode。如下图,选中system,并依次展开相应的内容项,并修改箭头对应配置。<br />
重新Generate生成代码,按照前述方法编译下载并运行<br />
<br />
然后就可以看到串口助手接收到开发板发出的数据了<br />
</li>
<li>printf打印函数的实现<br />
Printf函数在调试打log时非常有用。<br />
起初尝试了实现putchar和fputc这两个函数,但后来发现没有任何效果,最终发现MPLAB X的printf时重映射到xc32_monitor.c文件中的write函数了,默认该函数不做任何操作,直接返回-1,难怪无法printf打印了。<br />
<br />
<br />
如此以来就好解决了,讲该函数重新在main文件实现,或者直接在该文件下添加头文件"peripheral/sercom/usart/plib_sercom0_usart.h",并修改函数实现如下<br />
<br />
然后在main函数中添加printf测试语句<br />
<br />
然后就可以在串口助手收到打印内容了。<br />
</li>
<li>小结</li>
</ol>
<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><img height="48" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/puzzle.gif" width="53" /></p>
页:
[1]