|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
COCOFLY教程 ——疯壳·无人机·系列 GPIO(遥控器指示灯控制)
* s B4 J6 ?5 Y
7 \7 p* p, f! h' J5 W
: ]' {7 g% l# j2 N% A7 m5 Q
图18 q& g, {1 o" M4 B" J
, U% a/ A+ T3 S# o3 G2 l2 C3 `
一、GPIO 简介6 F. S4 n5 K7 i
GPIO(General-purpose input/output),通用的输入输出的简称,单片机的引脚可以供使用者自由使用,可以配置为输出,也可以配置为输入。其中输出又可以是输出“高电平”或者“低电平”。在电子电路中“高电平”是电压高的状态, 用逻辑来表示即为 1,“低电平”是电压低的状态,用逻辑来表示即为 0。
" ]% }. K8 w& F9 `STM32F103 系列是意法半导体基于 ARM Cortex M3 内核的 32 位单片机, 遥控器上用的主核心是 48 脚的 STM32F103C8T6,其片上的资源与飞控主板上的主核心 STM32F103CBT6 基本一致,不同点在于TM32F103C8T6 的 RAM 为20kBytes、Flash 为 64kBytes,而 STM32F103CBT6 的 RAM 为 20kBytes、Flash 为 128kBytes。其引脚如下图所示。
! ]8 M" ~. ? }/ f! @" q
: K- Y) k W: Z6 ]
( |- J1 W% m7 U1 G- [; K9 w图21 o, L W, V1 \9 O/ T7 N. g2 U
STM32F103C8T6 的 GPIO 的功能较多,有 A、B、C、D 等四组 GPIO,每组每个 GPIO 口都可以作为输出输出口使用之外, 还能作为复用引脚使用, 比如串口、I2C、SPI 等特殊接口的引脚。 但是需要注意的是每个引脚的复用功能是有限制的, 所以硬件连接时需要注意每个引脚有哪些复用功能, 这个可以在STM32F103 的数据手册中查看。GPIO 口一共有 8 种模式,分别为:浮空输入, 上拉输入,下拉输入,模拟输入, 开漏输出, 推挽输出,推挽式复用功能,开漏式复用功能如下表所示。3 W% `" R! R" }. k0 X
STM32F103GPIO 工作模式
1 C2 f! E5 S6 ^3 t: s8 b x' o+ q4 Y! p6 v
2 q6 w& I0 k& m; S- G+ O& Y表1
0 u$ ?* D+ o9 W这 8 种功能我们就不一一介绍了, 有兴趣可以上网搜索了解一下,这里主要讲解一下开漏输出和推挽输出的区别。" E( P" @4 b8 Y* G
(1)开漏输出:
$ |* x' S/ Y$ t* T$ D0 f输出端相当于三极管的集电极. 需要上拉电阻才能得到高电平, 利用外部上拉电阻的驱动能力,减少 IC 内部的驱动,驱动能力强,适合于做电流型的驱动, 可达到 20mA。9 ^1 \7 h$ E- o1 Y
(2)推挽输出:3 x' A8 u; [) ^& E' L: x2 f$ E
可以输出高,低电平,连接数字器件,是由两个参数相同的三极管或MOSFET 以推挽方式连接,各负责正负半周的波形放大任务。电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高,既提高电路的负载能力, 又提高开关速度。% s! s9 a# ^; {# T4 t9 g! e
总结一下:推挽输出可以输出强高低电平,连接数字器件;而开漏输出只可以输出低电平,高电平得靠外部电阻拉高。输出端相当于三极管的集电极,要得到高电平状态需要上拉电阻才行,适合于做电流型的驱动,其吸收电流的能力相对强(一般 20ma 以内)。2 q! ^: R' ^9 j% m. D& b
二、GPIO 相关寄存器
% E0 P7 [$ N$ @1 i" wSTM32F103 的每个 GPIO 端口有:两个 32 位配置寄存器(GPIOx_CRL 和GPIOx_CRH)、两个 32 位数据寄存器(GPIOx_IDR 和 GPIOx_ODR)、一个 32 位置位/复位寄存器(GPIOx_BSRR)、一个 16 位复位寄存器(GPIOx_BRR)、一个 32 位锁定寄存器(GPIOx_LCKR)。
3 O8 A# S7 n' C, ?2 C(1)GPIOx_CRL 寄存器(x=A~G)8 |3 b0 T- g; M
6 |5 R6 Z7 E, z5 a
( p& x8 g" J/ A( S* l1 L图3
: A; i7 o# }0 c8 K. x# [该寄存器用于配置 IO0~7 的输入输出模式以及速率设置。
3 }$ M' ?+ B( k* O- S(2)GPIOx_CRH 寄存器(x=A~G)6 v3 `: X2 R1 W. [. z7 H
7 J% E& B" Y( j9 J l4 T/ |
. J/ ]* L' i3 k! i# c2 s: H图4
9 }' i) l! y& ~) i* z该寄存器用于配置 IO8~15 的输入输出模式以及速率设置。
4 F( q( ?; N: @2 e(3)GPIOx_IDR 寄存器(x=A~G)$ ]; u8 T$ {$ M3 h- O6 Y3 [2 g
' T- V( K: c% @8 C/ ~" |
! e- P1 y3 T1 S9 G. S2 L! b
图59 J' w# z1 ^: N: T7 s2 S
IDR 是 GPIO 的输入数据寄存器。通过 IDR 寄存器可以读出 IO 的状态。需要注意的是 IDR 寄存器只能以字(16 位)的形式读出。
% I1 h3 Y# |& }2 i4 z( D3 c(4)GPIOx_ODR 寄存器(x=A~G)
' g C% M8 o8 }5 ~, G$ V) q/ V$ R& k' g4 B+ [) S/ m! l3 F+ m
5 f: q& M& W; r' ~图61 A1 ]8 W$ ^& _: {% F1 ?4 U7 L
ODR 是 GPIO 的输出数据寄存器。通过 ODR 寄存器可以输出高低电平。
- A) Q9 t. R8 z(5)GPIOx_BSRR 寄存器(x=A~G)" h: A9 ~/ ]* y9 d" n8 R
6 N8 m! [7 @1 ?3 }
/ o3 J# E) @, p8 [( x& j
图7& M" N0 Y2 {& K0 Y- b
BSRR 是GPIO 的端口位设置/清除寄存器。BSRR 寄存器的高 16 位是清除IO 位,低 16 位是置位 IO 位。需要注意的是 BSRR 只有在写入 1 的时候,相应的功能才有作用,写入 0 是无效的。0 O+ U% \* x" B0 l7 d# E
(6)GPIOx_BRR 寄存器(x=A~G)
* A2 y! r1 m, ^8 i! @& ?' e
: Q) C4 a+ s0 R; y- K" y
: g4 t C3 L+ W图8
: C, Y7 A4 F( @BRR 是 GPIO 的端口位清除寄存器。BRR 基础只有在写入 1 的时候,相应的功能才有作用,写入 0 无效。# D) K" I, r1 D# {! v* [! S; n+ s
(7)GPIOx_LCKR 寄存器(x=A~G)
0 [6 @# X J2 U) {$ }# A1 n$ [ N1 |( l
! z1 {& y, d* R3 l
) a( j+ Z# v) j; c6 B9 l$ c& W图99 x# T3 o6 v) i+ a9 f$ p' t1 M
8 J% ?, `: U2 c% [0 v
LCKR 是GPIO 的端口配置锁定寄存器。LCKR 寄存器用来锁定IO 口的配置, 设置后,除了复位后不能再配置 IO 的状态。
: }# ^; V" l4 g三、GPIO 实验
- [0 a/ Q( x: _9 m- s) x本节实验的内容是对遥控上的指示灯进行控制,这里和在飞控实验中周期点亮航情灯一样,也是周期点亮遥控手柄上的指示灯。+ v( C7 d6 m- j# l/ Z6 k
遥控手柄上接到 STM32F103C8T6 上的 GPIO 管脚的指示灯有四颗,分别是电源指示灯、连接无人机指示灯、cocobit 编程模式指示灯以及紧急降落指示灯, 如下图所示。
# i u' g/ m* f- ~- r- ~# p) L! O/ C
+ L" H6 f% r0 t a c图10
+ {3 [$ }9 p6 i3 z" e查看原理图,可知四个 LED 指示灯分别对应 PA8、PC13、PB4、PB5。/ n6 c# b8 N: o! Q, o: V: A
- A) `! Q# R, u1 G+ A
; d( n, A1 A; g图11
. r9 W4 Q+ r9 L0 p7 R+ O: e编写代码的思路如下表所示:" V5 n- @" ~- z% s
代码思路
* |+ h$ ^( Z* j$ W4 t
8 S/ V3 E7 f7 n' r2 D
4 N" v g5 K6 }+ W表2
4 l* O7 A5 R$ S" P# k按照代码思路,编写代码(通过调用官方库) 如下图所示为 GPIO 的初始化部分代码:
4 ]' \( ^/ e# ]6 k8 x5 o5 H+ |* s& {
4 C% q# k( K; p( |0 T
图12; `, h. v, V8 w# a1 a1 f& x
完成配置后只需要周期点亮以及关闭 LED 即可,如下图所示。
! S% d7 D- a- Q4 n0 O( B4 z/ Z
- y5 w# H4 A) G/ M5 `: |
3 k8 Z. R }9 E* A. w3 q图137 o$ s& L( w: X' i/ Q
其中延时函数,如下图所示。
7 Z! l. ^2 c R$ j* f5 Z$ ]* o% y$ F9 {' W# R9 I3 ^6 O
. e+ n* I( D: \. E1 Q图14 _- s a6 |9 V$ h7 F% p$ P
保存、编译、下载,就可以看到遥控手柄的四个 LED 指示灯周期性闪烁, 如下图所示。- M0 I) R( L+ t5 b" z* c9 B
! P& u4 H8 x. y- X6 D0 ~
3 J: j# M C1 r, E4 ]* S7 r图15; F6 Z5 U1 H% o( {; | P
: c7 [" s. W4 ?9 Z0 o1 k
' K T% b: l( A. r4 p" j U$ ~5 ?0 }/ S# o
+ ^- @8 E5 A+ {1 f
4 B: v* E4 u4 N/ {$ M
# E. r4 p0 T; x& n% j& R0 Q$ X更多完整学习资料和对应开源套件,请登陆官网:“疯壳”1 X; l- ?0 T) @* t
0 w- O3 W8 A) t) p' A5 D3 d8 z
文件下载请点击:
【1】GPIO(遥控器指示灯控制).pdf
(855.71 KB, 下载次数: 0)
! @9 O" p# w* w8 x# t( j5 q" d' E
: b4 \1 O) S& j: K& j* a3 m% ?# d) c7 }; \
2 K0 p! r6 s2 [# M0 \' w- b$ N
2 s2 p* j# `6 N- Y3 x5 T J |
|