COCOFLY教程
——疯壳·无人机·系列
GPIO(遥控器指示灯控制)


图1

一、GPIO 简介
GPIO(General-purpose input/output),通用的输入输出的简称,单片机的引脚可以供使用者自由使用,可以配置为输出,也可以配置为输入。其中输出又可以是输出“高电平”或者“低电平”。在电子电路中“高电平”是电压高的状态, 用逻辑来表示即为 1,“低电平”是电压低的状态,用逻辑来表示即为 0。
STM32F103 系列是意法半导体基于 ARM Cortex M3 内核的 32 位单片机, 遥控器上用的主核心是 48 脚的 STM32F103C8T6,其片上的资源与飞控主板上的主核心 STM32F103CBT6 基本一致,不同点在于TM32F103C8T6 的 RAM 为20kBytes、Flash 为 64kBytes,而 STM32F103CBT6 的 RAM 为 20kBytes、Flash 为 128kBytes。其引脚如下图所示。

图2
STM32F103C8T6 的 GPIO 的功能较多,有 A、B、C、D 等四组 GPIO,每组每个 GPIO 口都可以作为输出输出口使用之外, 还能作为复用引脚使用, 比如串口、I2C、SPI 等特殊接口的引脚。 但是需要注意的是每个引脚的复用功能是有限制的, 所以硬件连接时需要注意每个引脚有哪些复用功能, 这个可以在STM32F103 的数据手册中查看。GPIO 口一共有 8 种模式,分别为:浮空输入, 上拉输入,下拉输入,模拟输入, 开漏输出, 推挽输出,推挽式复用功能,开漏式复用功能如下表所示。
STM32F103GPIO 工作模式


表1
这 8 种功能我们就不一一介绍了, 有兴趣可以上网搜索了解一下,这里主要讲解一下开漏输出和推挽输出的区别。
(1)开漏输出:
输出端相当于三极管的集电极. 需要上拉电阻才能得到高电平, 利用外部上拉电阻的驱动能力,减少 IC 内部的驱动,驱动能力强,适合于做电流型的驱动, 可达到 20mA。
(2)推挽输出:
可以输出高,低电平,连接数字器件,是由两个参数相同的三极管或MOSFET 以推挽方式连接,各负责正负半周的波形放大任务。电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高,既提高电路的负载能力, 又提高开关速度。
总结一下:推挽输出可以输出强高低电平,连接数字器件;而开漏输出只可以输出低电平,高电平得靠外部电阻拉高。输出端相当于三极管的集电极,要得到高电平状态需要上拉电阻才行,适合于做电流型的驱动,其吸收电流的能力相对强(一般 20ma 以内)。
二、GPIO 相关寄存器
STM32F103 的每个 GPIO 端口有:两个 32 位配置寄存器(GPIOx_CRL 和GPIOx_CRH)、两个 32 位数据寄存器(GPIOx_IDR 和 GPIOx_ODR)、一个 32 位置位/复位寄存器(GPIOx_BSRR)、一个 16 位复位寄存器(GPIOx_BRR)、一个 32 位锁定寄存器(GPIOx_LCKR)。
(1)GPIOx_CRL 寄存器(x=A~G)


图3
该寄存器用于配置 IO0~7 的输入输出模式以及速率设置。
(2)GPIOx_CRH 寄存器(x=A~G)


图4
该寄存器用于配置 IO8~15 的输入输出模式以及速率设置。
(3)GPIOx_IDR 寄存器(x=A~G)


图5
IDR 是 GPIO 的输入数据寄存器。通过 IDR 寄存器可以读出 IO 的状态。需要注意的是 IDR 寄存器只能以字(16 位)的形式读出。
(4)GPIOx_ODR 寄存器(x=A~G)


图6
ODR 是 GPIO 的输出数据寄存器。通过 ODR 寄存器可以输出高低电平。
(5)GPIOx_BSRR 寄存器(x=A~G)


图7
BSRR 是GPIO 的端口位设置/清除寄存器。BSRR 寄存器的高 16 位是清除IO 位,低 16 位是置位 IO 位。需要注意的是 BSRR 只有在写入 1 的时候,相应的功能才有作用,写入 0 是无效的。
(6)GPIOx_BRR 寄存器(x=A~G)


图8
BRR 是 GPIO 的端口位清除寄存器。BRR 基础只有在写入 1 的时候,相应的功能才有作用,写入 0 无效。
(7)GPIOx_LCKR 寄存器(x=A~G)


图9

LCKR 是GPIO 的端口配置锁定寄存器。LCKR 寄存器用来锁定IO 口的配置, 设置后,除了复位后不能再配置 IO 的状态。
三、GPIO 实验
本节实验的内容是对遥控上的指示灯进行控制,这里和在飞控实验中周期点亮航情灯一样,也是周期点亮遥控手柄上的指示灯。
遥控手柄上接到 STM32F103C8T6 上的 GPIO 管脚的指示灯有四颗,分别是电源指示灯、连接无人机指示灯、cocobit 编程模式指示灯以及紧急降落指示灯, 如下图所示。


图10
查看原理图,可知四个 LED 指示灯分别对应 PA8、PC13、PB4、PB5。


图11
编写代码的思路如下表所示:
代码思路


表2
按照代码思路,编写代码(通过调用官方库) 如下图所示为 GPIO 的初始化部分代码:


图12
完成配置后只需要周期点亮以及关闭 LED 即可,如下图所示。


图13
其中延时函数,如下图所示。


图14
保存、编译、下载,就可以看到遥控手柄的四个 LED 指示灯周期性闪烁, 如下图所示。


图15

更多完整学习资料和对应开源套件,请登陆官网:“疯壳”

如需定制开发,请通过官网“疯壳”网页底部的“联系我们”进行联系

【遥控器开发基础教程1】疯壳·开源编队无人机-GPIO(遥控器指示灯控制)相关推荐

  1. 【飞控开发基础教程9】疯壳·开源编队无人机-PWM(电机控制)

    COCOFLY教程 --疯壳·无人机·系列 PWM(电机控制)          图1               一.PWM 简介     脉冲宽度调制(PWM),是英文"Pulse Wi ...

  2. 【开源教程16】疯壳·开源编队无人机-PWM(电机控制)

    COCOFLY教程 --疯壳·无人机·系列 PWM(电机控制)          图1               一.PWM 简介     脉冲宽度调制(PWM),是英文"Pulse Wi ...

  3. 【开源教程1】疯壳·开源编队无人机-开机测试

    疯壳·COCOFLY教程 --开源编队无人机 开机测试 图1.1 一.开机测试 1.1前期准备   疯壳 cocofly 无人机到手后是一个高耐压防碰撞内置优质海绵泡沫防护的手提铝合金箱子,打开铝合金 ...

  4. 【快速上手教程1】疯壳·开源编队无人机-开机测试

    疯壳·COCOFLY教程 --开源编队无人机 开机测试 图1.1 一.开机测试 1.1前期准备   疯壳 cocofly 无人机到手后是一个高耐压防碰撞内置优质海绵泡沫防护的手提铝合金箱子,打开铝合金 ...

  5. 【飞控开发基础教程10】疯壳·开源编队无人机-PID 基础原理

    COCOFLY教程 --疯壳·无人机·系列 PID 基础原理          图1               一.PID 简介     PID 控制是自动控制系统中最常用的一种控制手段,它的诞生主 ...

  6. 【飞控开发基础教程6】疯壳·开源编队无人机-SPI(六轴传感器数据获取)

    COCOFLY教程 --疯壳·无人机·系列 SPI(六轴传感器数据获取)          图1               一.ICM20602 简介     六轴传感器在当今智能穿戴和定位导航产品 ...

  7. 【飞控开发高级教程7】疯壳·开源编队无人机-编队飞行

    COCOFLY教程 --疯壳·无人机·系列 编队飞行 图1                   一.编队飞行     COCOFLY 支持编队飞行,编队飞行需要依托编队的图形码地图以及COCOFLY ...

  8. 【飞控开发高级教程6】疯壳·开源编队无人机-AI语音控制

    COCOFLY教程 --疯壳·无人机·系列 AI语音控制 图1               一.AI 语音控制     cocofly 支持 AI 语音控制,具体的使用方法和<视觉追踪>中 ...

  9. 【开源教程13】疯壳·开源编队无人机-SPI(六轴传感器数据获取)

    COCOFLY教程 --疯壳·无人机·系列 SPI(六轴传感器数据获取)          图1               一.ICM20602 简介     六轴传感器在当今智能穿戴和定位导航产品 ...

  10. 【开源教程29】疯壳·开源编队无人机-编队飞行

    COCOFLY教程 --疯壳·无人机·系列 编队飞行 图1                   一.编队飞行     COCOFLY 支持编队飞行,编队飞行需要依托编队的图形码地图以及COCOFLY ...

最新文章

  1. 2022-2028年中国钢桶行业市场研究及前瞻分析报告
  2. CSS Selector 3
  3. css sprites之圆角
  4. Java AQS论文翻译
  5. DNF安装MySQL_CentOS7使用dnf安装mysql
  6. ubuntu下搭建tftp服务器
  7. 完整免授权彩虹源码(多模板+小储云商城模板)6.7.5
  8. 虚函数,虚基类 与纯虚函数 二
  9. java三角形创建子类,A派生出子类B,B派生出子类C,并且在Java源代码中有如下声明: 1.A a0=new 2.A a1 =new 3.A a2=new 问以下哪个说法是正确的?()...
  10. Linux系统日常管理1
  11. struts2 + ajax 用户名登录验证(struts2+spring+ibatis)
  12. Java Swing中键盘事件的处理
  13. 达内java晨讲案例_达内java飞机大战(完成版)
  14. 【Python】使用分隔符拆分字符串
  15. 十年前开发的平板游戏:HyllCube 三维四子棋游戏,获得了全国一等奖
  16. 杨韬的Python/Jupyter学习笔记
  17. wpa_supplicant 工具操作wifi模块
  18. 关于网页显示夏令时时区问题
  19. 单元测试技巧之PowerMock
  20. html个个代码的意思,网页HTML中各个代码意思大全

热门文章

  1. 计算机怎么格式化硬盘,电脑格式化硬盘 电脑格式化硬盘要怎么操作
  2. 自建魔兽世界sf服务器,魔兽世界80自己搭服务器,热度却持续不到一天,全部用命令!...
  3. 计算机休眠状态和关,win7系统关于睡眠和休眠这两种状态的区别
  4. 计算机网络定义记不住,win10下微软拼音输入法记不住自定义输入词语怎么办
  5. python运行代码无反应_linux执行python命令后没有反应,不打印日志信息
  6. leetcode1-5
  7. android系统分区刷机包,安卓刷机最大最专业最齐全的安卓ROM刷机包资源
  8. 三运放差分放大电路分析_三运放差动放大电路
  9. 什么是请求报文和响应报文?
  10. 虚拟机超线程性能分析深入浅出