疯壳AI开源无人机GPIO(遥控器指示灯控制)
<div class='showpostmsg'> 本帖最后由 fengke 于 2021-3-31 16:20 编辑<h2>一、GPIO简介</h2>
<p>GPIO(General-purpose input/output),通用的输入输出的简称,单片机的引脚可以供使用者自由使用,可以配置为输出,也可以配置为输入。其中输出又可以是输出“高电平”或者“低电平”。在电子电路中“高电平”是电压高的状态,用逻辑来表示即为1,“低电平”是电压低的状态,用逻辑来表示即为0。</p>
<p>STM32F103系列是意法半导体基于ARM Cortex M3内核的32位单片机,遥控器上用的主核心是48脚的STM32F103C8T6,其片上的资源与飞控主板上的主核心STM32F103CBT6基本一致,不同点在于STM32F103C8T6的RAM为20kBytes、Flash为64kBytes,而STM32F103CBT6的RAM为20kBytes、Flash为128kBytes。其引脚如下图所示。</p>
<p><img height="358" src="https://oscimg.oschina.net/oscnet/up-cafae8002b0f0b6f1b9b7d691adca8bd2e6.JPEG" width="449" /></p>
<p>STM32F103C8T6的GPIO的功能较多,有A、B、C、D等四组GPIO,每组每个GPIO口都可以作为输出输出口使用之外, 还能作为复用引脚使用, 比如串口、I2C、SPI 等特殊接口的引脚。 但是需要注意的是每个引脚的复用功能是有限制的, 所以硬件连接时需要注意每个引脚有哪些复用功能, 这个可以在 STM32F103的数据手册中查看。GPIO 口一共有 8 种模式,分别为:浮空输入,上拉输入,下拉输入,模拟输入, 开漏输出, 推挽输出,推挽式复用功能,开漏式复用功能如下表所示。</p>
<p>STM32F103GPIO工作模式</p>
<table border="1" cellspacing="0">
<tbody>
<tr>
<td>
<p>GPIO的工作模式</p>
</td>
</tr>
<tr>
<td>
<p>输入模式</p>
</td>
<td>
<p>输出模式</p>
</td>
<td>
<p>最大输出速度</p>
</td>
</tr>
<tr>
<td>
<p>(1)GPIO_Mode_IN_FLOATING 浮空输入<br />
(2)GPIO_Mode_IPU 上拉输入<br />
(3)GPIO_Mode_IPD 下拉输入<br />
(4)GPIO_Mode_AIN 模拟输入</p>
</td>
<td>
<p>(1)GPIO_Mode_Out_OD 开漏输出(带上拉或者下拉)<br />
(2)GPIO_Mode_AF_OD 复用开漏输出(带上拉或者下拉)<br />
(3)GPIO_Mode_Out_PP 推挽输出(带上拉或者下拉)<br />
(4)GPIO_Mode_AF_PP 复用推挽输出(带上拉或者下拉)</p>
</td>
<td>
<p>(1)10MHZ<br />
(2)2MHZ<br />
(3)50MHZ</p>
</td>
</tr>
</tbody>
</table>
<p>这8种功能我们就不一一介绍了, 有兴趣可以上网搜索了解一下,这里主要讲解一下开漏输出和推挽输出的区别。<br />
(1)开漏输出:<br />
输出端相当于三极管的集电极. 需要上拉电阻才能得到高电平, 利用外部上拉电阻的驱动能力,减少IC内部的驱动,驱动能力强,适合于做电流型的驱动,可达到20mA。<br />
(2)推挽输出:<br />
可以输出高,低电平,连接数字器件,是由两个参数相同的三极管或 MOSFET以推挽方式连接,各负责正负半周的波形放大任务。电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高,既提高电路的负载能力,又提高开关速度。</p>
<p>总结一下:推挽输出可以输出强高低电平,连接数字器件;而开漏输出只可以输出低电平,高电平得靠外部电阻拉高。输出端相当于三极管的集电极,要得到高电平状态需要上拉电阻才行,适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内)。</p>
<h2>二、GPIO相关寄存器</h2>
<p>STM32F103的每个GPIO端口有:两个32位配置寄存器(GPIOx_CRL和GPIOx_CRH)、两个32位数据寄存器(GPIOx_IDR和GPIOx_ODR)、一个32位置位/复位寄存器(GPIOx_BSRR)、一个16位复位寄存器(GPIOx_BRR)、一个32位锁定寄存器(GPIOx_LCKR)。</p>
<ol>
<li>GPIOx_CRL寄存器(x=A~G)</li>
</ol>
<p><img height="98" src="https://oscimg.oschina.net/oscnet/up-f4596c7ed537917809ce7e9f0eb4e3c3472.JPEG" width="524" /></p>
<p>该寄存器用于配置IO0~7的输入输出模式以及速率设置。</p>
<ol>
<li>GPIOx_CRH寄存器(x=A~G)</li>
</ol>
<p><img height="96" src="https://oscimg.oschina.net/oscnet/up-0081e49cef35ecf9b3a77c1cb25d058a799.JPEG" width="546" /></p>
<p>该寄存器用于配置IO8~15的输入输出模式以及速率设置。</p>
<p>(3)GPIOx_IDR寄存器(x=A~G)</p>
<p><img height="92" src="https://oscimg.oschina.net/oscnet/up-8e16fbd74a1dba35172481114a6b53b26c0.JPEG" width="554" /></p>
<p>IDR是GPIO的输入数据寄存器。通过IDR寄存器可以读出IO的状态。需要注意的是IDR寄存器只能以字(16位)的形式读出。</p>
<p>(4)GPIOx_ODR寄存器(x=A~G)</p>
<p><img height="95" src="https://oscimg.oschina.net/oscnet/up-08a981650707914ff7b436b6361740285af.JPEG" width="554" /></p>
<p>ODR是GPIO的输出数据寄存器。通过ODR寄存器可以输出高低电平。</p>
<p>(5)GPIOx_BSRR寄存器(x=A~G)</p>
<p><img height="108" src="https://oscimg.oschina.net/oscnet/up-7907f062f17b8561d64d4a1d2ea87a0dd68.JPEG" width="550" /></p>
<p>BSRR是GPIO的端口位设置/清除寄存器。BSRR寄存器的高16位是清除IO位,低16位是置位IO位。需要注意的是BSRR只有在写入1的时候,相应的功能才有作用,写入0是无效的。</p>
<p>(6)GPIOx_BRR寄存器(x=A~G)</p>
<p><img height="104" src="https://oscimg.oschina.net/oscnet/up-8805a6f025c1459e8957d732efdc3f23644.JPEG" width="566" /></p>
<p>BRR是GPIO的端口位清除寄存器。BRR基础只有在写入1的时候,相应的功能才有作用,写入0无效。</p>
<p>(7)GPIOx_LCKR寄存器(x=A~G)</p>
<p><img height="110" src="https://oscimg.oschina.net/oscnet/up-26e88e60608483f6549c611dd0dbbf44a05.JPEG" width="566" /></p>
<p>LCKR是GPIO的端口配置锁定寄存器。LCKR寄存器用来锁定IO口的配置,设置后,除了复位后不能再配置IO的状态。</p>
<h2>三、GPIO实验</h2>
<p>本节实验的内容是对遥控上的指示灯进行控制,这里和在飞控实验中周期点亮航情灯一样,也是周期点亮遥控手柄上的指示灯。</p>
<p>遥控手柄上接到STM32F103C8T6上的GPIO管脚的指示灯有四颗,分别是电源指示灯、连接无人机指示灯、cocobit编程模式指示灯以及紧急降落指示灯,如下图所示。</p>
<p><img height="278" src="https://oscimg.oschina.net/oscnet/up-29921e5f3213448f5886afec540075bb0d9.JPEG" width="421" /></p>
<p>查看原理图,可知四个LED指示灯分别对应PA8、PC13、PB4、PB5。</p>
<p><img height="265" src="https://oscimg.oschina.net/oscnet/up-4f937fb8c9df3b643da0d6d7ac7db7ce9c5.JPEG" width="133" /><img height="252" src="https://oscimg.oschina.net/oscnet/up-a7fdb55a0a20e24ea914cd40a4c77ea06a2.JPEG" width="378" /></p>
<p>编写代码的思路如下表所示:</p>
<p>代码思路</p>
<table border="1" cellspacing="0">
<tbody>
<tr>
<td>
<p>1</p>
</td>
<td>
<p>管脚配置</p>
</td>
<td>
<p>1、定义结构体;</p>
<p>2、使能时钟;</p>
<p>3、填充结构体;</p>
<p>4、装载结构体。</p>
</td>
</tr>
<tr>
<td>
<p>2</p>
</td>
<td>
<p>逻辑处理</p>
</td>
<td>
<p>1、周期点亮LED。</p>
</td>
</tr>
</tbody>
</table>
<p>按照代码思路,编写代码(通过调用官方库) 如下图所示为GPIO的初始化部分代码:</p>
<p><img height="173" src="https://oscimg.oschina.net/oscnet/up-d19bb87f7bd78a324547e7f159dc6509b77.JPEG" width="301" /><img height="201" src="https://oscimg.oschina.net/oscnet/up-339b5d0c3e22540d9278e8c70595a5be3ae.JPEG" width="508" /></p>
<p>完成配置后只需要周期点亮以及关闭LED即可,如下图所示。</p>
<p><img height="187" src="https://oscimg.oschina.net/oscnet/up-f34fe93941f8347182fa8eed99985effa66.JPEG" width="481" /></p>
<p>其中延时函数,如下图所示。</p>
<p><img height="156" src="https://oscimg.oschina.net/oscnet/up-e8a138241fa1d6e304f5242a1154601867e.JPEG" width="471" /></p>
<p>保存、编译、下载,就可以看到遥控手柄的四个LED指示灯周期性闪烁,如下图所示。</p>
<p><img height="272" src="https://oscimg.oschina.net/oscnet/up-9efcd09472ea95aefe6f3125030bc8fd0d2.JPEG" width="416" /></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>STM32F103C8T6最近涨的够狠的,,</p>
<p>楼主可以考虑移植到国产芯片上</p>
<p>疯壳AI开源无人机 感谢楼主的整个xi整个系列系统性分享 谢谢</p>
页:
[1]