找回密码
 注册
关于网站域名变更的通知
查看: 123|回复: 0
打印 上一主题 下一主题

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

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-7-16 11:29 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
COCOFLY教程
——疯壳·无人机·系列
GPIO(遥控器指示灯控制)
. O/ M2 j2 U5 p6 S8 L4 A
* B+ `% I: W4 }# h8 V
/ X) u. b7 A6 ^+ J
图1+ f2 F2 J/ F/ z7 }4 J/ P
' A6 Y- f& O9 Q' |
一、GPIO 简介, @. N. j. a; r5 L; m  x- P( g* G
GPIO(General-purpose input/output),通用的输入输出的简称,单片机的引脚可以供使用者自由使用,可以配置为输出,也可以配置为输入。其中输出又可以是输出“高电平”或者“低电平”。在电子电路中“高电平”是电压高的状态, 用逻辑来表示即为 1,“低电平”是电压低的状态,用逻辑来表示即为 0。- m8 I3 C, D- j, }( j* E; k! Z2 ?
STM32F103 系列是意法半导体基于 ARM Cortex M3 内核的 32 位单片机, 遥控器上用的主核心是 48 脚的 STM32F103C8T6,其片上的资源与飞控主板上的主核心 STM32F103CBT6 基本一致,不同点在于TM32F103C8T6 的 RAM 为20kBytes、Flash 为 64kBytes,而 STM32F103CBT6 的 RAM 为 20kBytes、Flash 为 128kBytes。其引脚如下图所示。6 o: W' d- ]0 W4 i( O% @

9 K7 X" M7 g0 W) K( o
* \/ l+ a  y8 f图2
- P" W. u2 c* g" v/ l: eSTM32F103C8T6 的 GPIO 的功能较多,有 A、B、C、D 等四组 GPIO,每组每个 GPIO 口都可以作为输出输出口使用之外, 还能作为复用引脚使用, 比如串口、I2C、SPI 等特殊接口的引脚。 但是需要注意的是每个引脚的复用功能是有限制的, 所以硬件连接时需要注意每个引脚有哪些复用功能, 这个可以在STM32F103 的数据手册中查看。GPIO 口一共有 8 种模式,分别为:浮空输入, 上拉输入,下拉输入,模拟输入, 开漏输出, 推挽输出,推挽式复用功能,开漏式复用功能如下表所示。
" Q+ e, a( x1 b  zSTM32F103GPIO 工作模式
/ `+ N4 _; G) k' b8 `6 ~* _8 ]8 v4 j/ f9 y

1 Y) N- {: e# t表1) d# v7 U6 v3 J+ l0 y4 \, g
这 8 种功能我们就不一一介绍了, 有兴趣可以上网搜索了解一下,这里主要讲解一下开漏输出和推挽输出的区别。5 A4 H2 Q9 M5 V+ x
(1)开漏输出:
) L! F7 J. _0 D" I" C$ L输出端相当于三极管的集电极. 需要上拉电阻才能得到高电平, 利用外部上拉电阻的驱动能力,减少 IC 内部的驱动,驱动能力强,适合于做电流型的驱动, 可达到 20mA。) J* c& ^. X, `7 y
(2)推挽输出:8 K3 \6 T" k& ]) y4 b  O
可以输出高,低电平,连接数字器件,是由两个参数相同的三极管或MOSFET 以推挽方式连接,各负责正负半周的波形放大任务。电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高,既提高电路的负载能力, 又提高开关速度。; x( F$ C! z, e6 g& ?/ B
总结一下:推挽输出可以输出强高低电平,连接数字器件;而开漏输出只可以输出低电平,高电平得靠外部电阻拉高。输出端相当于三极管的集电极,要得到高电平状态需要上拉电阻才行,适合于做电流型的驱动,其吸收电流的能力相对强(一般 20ma 以内)。
6 h0 d; p8 x- b# n/ Q' ?5 g# u二、GPIO 相关寄存器3 F& V' Z. x2 l* D3 V* z
STM32F103 的每个 GPIO 端口有:两个 32 位配置寄存器(GPIOx_CRL 和GPIOx_CRH)、两个 32 位数据寄存器(GPIOx_IDR 和 GPIOx_ODR)、一个 32 位置位/复位寄存器(GPIOx_BSRR)、一个 16 位复位寄存器(GPIOx_BRR)、一个 32 位锁定寄存器(GPIOx_LCKR)。+ x; ]3 n' `, x- E7 R& {2 G2 p/ [* j6 K
(1)GPIOx_CRL 寄存器(x=A~G)
( K& U  T$ z, x/ J3 o  \" v' n3 x
5 M2 P0 ^& k+ w0 l & o; f) E9 {3 q3 W( r; U- `. r/ i
图3
9 I# [' b" H6 t( K+ @8 B- p! D该寄存器用于配置 IO0~7 的输入输出模式以及速率设置。* x. D* s* W% G: L8 {& m0 B
(2)GPIOx_CRH 寄存器(x=A~G)1 m- e1 }6 O5 h! \/ O2 R
& e1 I, G' K; q$ @! V

; O: C" B/ A3 h9 U  v图41 I4 {( a. s1 T' J, G* Y( Y
该寄存器用于配置 IO8~15 的输入输出模式以及速率设置。
& z# i- i" f* }) h3 g( b% O& Q(3)GPIOx_IDR 寄存器(x=A~G)
4 b. A, ?! ?9 d- V7 _" _, {8 s. D0 _, P5 J- `
! L- O1 G6 z: t1 \4 P
图5
0 T! G) @2 i# J% cIDR 是 GPIO 的输入数据寄存器。通过 IDR 寄存器可以读出 IO 的状态。需要注意的是 IDR 寄存器只能以字(16 位)的形式读出。! N4 M7 m! d! w6 C" \( z+ ]! F
(4)GPIOx_ODR 寄存器(x=A~G)
, P4 S1 p; f3 A0 b
. u* L) A( U9 _6 ^( ` ; {% v1 H3 m- s; G6 \* {
图6
7 z  D8 v! K5 \4 ?2 _ODR 是 GPIO 的输出数据寄存器。通过 ODR 寄存器可以输出高低电平。
& k+ f. W! g% W: Y+ `9 x(5)GPIOx_BSRR 寄存器(x=A~G)
% w( \) A; n; F) A: e% g, J2 X/ {9 R( |! O' [: ^
' H! E; ?; C  Q3 V6 n! O; _5 O! x
图7
. F& S5 n# t% u3 A, |BSRR 是GPIO 的端口位设置/清除寄存器。BSRR 寄存器的高 16 位是清除IO 位,低 16 位是置位 IO 位。需要注意的是 BSRR 只有在写入 1 的时候,相应的功能才有作用,写入 0 是无效的。
" z8 i' ^. ]" M' b+ e(6)GPIOx_BRR 寄存器(x=A~G)
+ U' O7 i9 w  m" Z  x5 g
! y8 I2 q# [% t1 c # |. k' p, [: P3 {/ }+ B  a1 M
图89 @# ~' a9 _, O/ T+ ?* D
BRR 是 GPIO 的端口位清除寄存器。BRR 基础只有在写入 1 的时候,相应的功能才有作用,写入 0 无效。" Q/ s$ S: h4 l* b' O2 }5 y$ A, I$ x
(7)GPIOx_LCKR 寄存器(x=A~G)
" \. E+ z, G- ]( q( b6 ^/ J  M! R" M1 C
2 u6 K( [0 E. }. U; a6 T) X0 s! `/ O & v# Y& x3 ?% ?& U( F9 ?6 i! G
图9$ `% t4 Q" H# h3 Q- ^
* m* N( u# q; K! L2 ]
LCKR 是GPIO 的端口配置锁定寄存器。LCKR 寄存器用来锁定IO 口的配置, 设置后,除了复位后不能再配置 IO 的状态。& Q3 s. S* `5 K+ R
三、GPIO 实验0 h2 P) b# q. ~: Y* F) S* _
本节实验的内容是对遥控上的指示灯进行控制,这里和在飞控实验中周期点亮航情灯一样,也是周期点亮遥控手柄上的指示灯。1 @3 Y6 c3 R1 p' d$ c) x
遥控手柄上接到 STM32F103C8T6 上的 GPIO 管脚的指示灯有四颗,分别是电源指示灯、连接无人机指示灯、cocobit 编程模式指示灯以及紧急降落指示灯, 如下图所示。
! F% [& H5 r6 B2 e5 V* m, C/ y# c. P9 N# ^" R
  a- w4 R4 n5 k2 S+ S
图10( z2 ?9 G$ Z: `/ ?, o4 Z. Y
查看原理图,可知四个 LED 指示灯分别对应 PA8、PC13、PB4、PB5。
( m/ h# @; Y+ j0 J, B, o/ i" @) d9 R' N( ~- w5 p0 |

6 R/ p! {) D. B( X% A* H图11/ t: L$ l! r* _
编写代码的思路如下表所示:
$ p+ \6 p# x" Y6 d* C2 C代码思路
  c, T4 @) M% B; Z
" K% Q. k8 _, U7 Q2 C' u , c2 u- J1 [; n; b
表2# j8 Q5 W0 h: _
按照代码思路,编写代码(通过调用官方库) 如下图所示为 GPIO 的初始化部分代码:
; q+ \! M' Y8 ~
8 T+ r% [: p/ O& M7 j$ K . F( ~: ]3 W: T4 ~7 b$ h( z
图12
+ J1 s( s$ ?3 T1 x完成配置后只需要周期点亮以及关闭 LED 即可,如下图所示。) l! E" N0 C, u6 q" N; f/ ?4 j4 w1 R# r. }
  L- P# L% v. {) A+ ^+ H$ i+ v
3 x; t+ Y( w! {2 W6 [
图13/ t3 y, J& b/ P# W7 q3 t( u
其中延时函数,如下图所示。
; _3 x$ p' @* S3 F. O3 S7 h
1 x( g3 ~' I, f9 X, i 8 j: d. p+ |; S& O
图146 T) G. ~" `# Q3 r7 E" W0 e
保存、编译、下载,就可以看到遥控手柄的四个 LED 指示灯周期性闪烁, 如下图所示。( Z1 I/ A$ J& ~9 s: C% Q
  r. n# T9 d2 _* ]/ Z5 f
& s: A6 Z( K" [5 f; k. y
图15+ b. N: K) o% h: t9 S2 E

7 U' u0 c9 c. T+ v! X# l9 u0 G$ |) F+ F8 O& R# N
, G$ F% e6 t$ p& b* z; f

1 x. w% l" J5 X8 o6 u2 h
0 u7 w, w7 X8 U) n  ]  r! \1 Y
  D' g  K( M! I! G8 o) M更多完整学习资料和对应开源套件,请登陆官网:“疯壳”' t% Q2 Z. ?8 W3 q% b4 ~
9 z% l/ e2 B/ F! U. k
文件下载请点击: 【1】GPIO(遥控器指示灯控制).pdf (855.71 KB, 下载次数: 0) * N' S# b# {6 D
3 t8 Y8 `: o# p- c/ e" {/ h4 [6 F5 g% }
/ n" U6 `8 ~, p8 s

7 W4 F3 x6 Y. C& a
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-22 06:46 , Processed in 0.125000 second(s), 27 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表