疯壳AI开源无人机遥控整机代码走读、编译与烧写
<div class='showpostmsg'><h2>一、代码架构</h2><p>遥控的整体代码工程由7个工作组组成,分别是Remoter、show、Driver、STM32_LIB、USB、USB/Lib以及Drv_Point,如下图所示。</p>
<p><img alt="" height="238" src="https://img-blog.csdnimg.cn/20200520100748762.jpg" width="253" /></p>
<p> </p>
<p>各个组的具体的代码功能如下表所示。</p>
<table align="center" border="1" cellspacing="0">
<tbody>
<tr>
<td>
<p>组</p>
</td>
<td>
<p>功能</p>
</td>
</tr>
<tr>
<td>
<p>Remoter</p>
</td>
<td>
<p>包含遥控器数据数据、摇杆按键处理等。</p>
</td>
</tr>
<tr>
<td>
<p>show</p>
</td>
<td>
<p>负责遥控器整体的显示菜单UI等代码实现</p>
</td>
</tr>
<tr>
<td>
<p>Driver</p>
</td>
<td>
<p>各个模块的底层驱动</p>
</td>
</tr>
<tr>
<td>
<p>STM32_LIB</p>
</td>
<td>
<p>STM32标准库</p>
</td>
</tr>
<tr>
<td>
<p>USB</p>
</td>
<td>
<p>USB相关</p>
</td>
</tr>
<tr>
<td>
<p>USB/Lib</p>
</td>
<td>
<p>USB库</p>
</td>
</tr>
<tr>
<td>
<p>Drv_Point</p>
</td>
<td>
<p>系统关键库</p>
</td>
</tr>
</tbody>
</table>
<p> </p>
<h2><a name="t1"></a><a name="t1"></a>二、代码走读</h2>
<p>系统的主函数部分是整个代码的起始运行位置,在主函数内主要做三个事情:1、初始化外设及参数,2、轮询线程函数,3、菜单显示逻辑,其代码如下图所示。</p>
<p><img alt="" height="553" src="https://img-blog.csdnimg.cn/20200520100752859.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZlbmdrZXN6,size_16,color_FFFFFF,t_70" width="874" /></p>
<p><img alt="" height="607" src="https://img-blog.csdnimg.cn/20200520100756395.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZlbmdrZXN6,size_16,color_FFFFFF,t_70" width="787" /><img alt="" height="593" src="https://img-blog.csdnimg.cn/20200520100759973.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZlbmdrZXN6,size_16,color_FFFFFF,t_70" width="554" /></p>
<p>系统的每一个线程函数都已经分配好了运行周期,在不同的线程里执行不同的事情,线程的切换通过简单的逻辑处理形式切换,而系统的运行时间由sysTick提供,即系统的“滴答”时钟。各个线程的入口如下。</p>
<p> </p>
<p><img alt="" height="525" src="https://img-blog.csdnimg.cn/20200520100804917.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZlbmdrZXN6,size_16,color_FFFFFF,t_70" width="606" /></p>
<p>分别有1000ms周期的函数、50ms周期的函数、10ms周期的函数、4ms周期的函数以及2ms周期的函数。</p>
<p>整个遥控器的逻辑处理、数据交换的核心部分均在Remoter工作组内,该组内的代码框架如下图所示。</p>
<p><img alt="" height="179" src="https://img-blog.csdnimg.cn/20200520100812688.jpg" width="230" /></p>
<p>其中的DT.c负责和飞控、上位机等的通信数据处理,即拆解包、封装包、提取关键数据等,如下图所示为对飞控传输过来的数据进行处理。</p>
<p><img alt="" height="579" src="https://img-blog.csdnimg.cn/20200520100816525.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZlbmdrZXN6,size_16,color_FFFFFF,t_70" width="973" /></p>
<p><img alt="" height="630" src="https://img-blog.csdnimg.cn/20200520100822250.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZlbmdrZXN6,size_16,color_FFFFFF,t_70" width="922" /></p>
<p><img alt="" height="581" src="https://img-blog.csdnimg.cn/2020052010082770.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZlbmdrZXN6,size_16,color_FFFFFF,t_70" width="896" /><img alt="" height="166" src="https://img-blog.csdnimg.cn/20200520100831274.jpg" width="769" /></p>
<p>其中Stick.c为摇杆逻辑处理,主要对摇杆采集到ADC值进行分析,判断需要执行的逻辑。最后的cocobit.c是负责和cocobit编程板之间的通信。</p>
<p>工作组“show”主要负责了整体的菜单UI显示,这里已经做了封装处理。</p>
<p>工作组“Driver”负责各个模块的底层驱动,例如摇杆ADC配置、NRF24L01的SPI驱动等。</p>
<p>工作组“USB”以及“USB/Lib”,负责通过STM32自带的USB,虚拟出串口,方便与上位机进行通信。</p>
<p>保存、编译最后把代码烧写的遥控中,配合飞控就可以正常使用了。如下图所示1为保存、2为编译、3为下载烧写。</p>
<p><img alt="" height="106" src="https://img-blog.csdnimg.cn/20200520100835737.jpg" width="1090" /></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>分享了代码,还有介绍解释,点赞</p>
<p>保存、编译最后把代码烧写的遥控中,配合飞控就可以正常使用了。如下图所示1为保存、2为编译、3为下载烧写</p>
页:
[1]