|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
COCOFLY教程 ——疯壳·无人机·系列 GPIO(遥控器指示灯控制) " V ^% W. a/ |5 ~* Y
3 P' v/ W) s3 @6 _$ u
# X# m# j+ ]5 L$ x
图1' r7 P6 @; D7 F4 P7 K W
9 s8 A; ^) o3 ^% X- z j7 u$ B
一、GPIO 简介& K5 i/ I/ D; a( g2 T% o4 x/ [
GPIO(General-purpose input/output),通用的输入输出的简称,单片机的引脚可以供使用者自由使用,可以配置为输出,也可以配置为输入。其中输出又可以是输出“高电平”或者“低电平”。在电子电路中“高电平”是电压高的状态, 用逻辑来表示即为 1,“低电平”是电压低的状态,用逻辑来表示即为 0。
: n+ V# m$ X+ d4 F' H2 wSTM32F103 系列是意法半导体基于 ARM Cortex M3 内核的 32 位单片机, 遥控器上用的主核心是 48 脚的 STM32F103C8T6,其片上的资源与飞控主板上的主核心 STM32F103CBT6 基本一致,不同点在于TM32F103C8T6 的 RAM 为20kBytes、Flash 为 64kBytes,而 STM32F103CBT6 的 RAM 为 20kBytes、Flash 为 128kBytes。其引脚如下图所示。
4 N8 T/ `3 o! f9 V
! L% v, m8 P8 { @
$ O; ~; |& N4 a) s图2
% q7 X) J9 b- H8 Q7 e4 u, ?0 wSTM32F103C8T6 的 GPIO 的功能较多,有 A、B、C、D 等四组 GPIO,每组每个 GPIO 口都可以作为输出输出口使用之外, 还能作为复用引脚使用, 比如串口、I2C、SPI 等特殊接口的引脚。 但是需要注意的是每个引脚的复用功能是有限制的, 所以硬件连接时需要注意每个引脚有哪些复用功能, 这个可以在STM32F103 的数据手册中查看。GPIO 口一共有 8 种模式,分别为:浮空输入, 上拉输入,下拉输入,模拟输入, 开漏输出, 推挽输出,推挽式复用功能,开漏式复用功能如下表所示。9 u# A- _& Q8 A/ @2 H
STM32F103GPIO 工作模式: ]) u. i9 F3 u
" J) C# }8 W! |$ x2 S
# d, O' ]/ X. R6 N) n表1, ?1 `6 ?. H0 r; o5 b8 n) W
这 8 种功能我们就不一一介绍了, 有兴趣可以上网搜索了解一下,这里主要讲解一下开漏输出和推挽输出的区别。# i- U9 H5 G b! J/ ], X
(1)开漏输出: v, A" N- L( E/ Y2 I( b
输出端相当于三极管的集电极. 需要上拉电阻才能得到高电平, 利用外部上拉电阻的驱动能力,减少 IC 内部的驱动,驱动能力强,适合于做电流型的驱动, 可达到 20mA。 @2 K( _) n( B+ Y3 u
(2)推挽输出:
1 t/ X* g/ ?6 n# X l可以输出高,低电平,连接数字器件,是由两个参数相同的三极管或MOSFET 以推挽方式连接,各负责正负半周的波形放大任务。电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高,既提高电路的负载能力, 又提高开关速度。
/ ?6 K# K: B* N总结一下:推挽输出可以输出强高低电平,连接数字器件;而开漏输出只可以输出低电平,高电平得靠外部电阻拉高。输出端相当于三极管的集电极,要得到高电平状态需要上拉电阻才行,适合于做电流型的驱动,其吸收电流的能力相对强(一般 20ma 以内)。( A: u4 O( ?2 _9 K$ G6 b
二、GPIO 相关寄存器$ ?, \) I4 h" Z" N# x; X) P9 ]6 E
STM32F103 的每个 GPIO 端口有:两个 32 位配置寄存器(GPIOx_CRL 和GPIOx_CRH)、两个 32 位数据寄存器(GPIOx_IDR 和 GPIOx_ODR)、一个 32 位置位/复位寄存器(GPIOx_BSRR)、一个 16 位复位寄存器(GPIOx_BRR)、一个 32 位锁定寄存器(GPIOx_LCKR)。
3 ]+ K5 \7 N& ?4 j(1)GPIOx_CRL 寄存器(x=A~G)
- N: h) {8 T, G& i$ B: C: I
1 V. E y' _( v6 s
. D4 h" O9 u5 p+ h/ \* P
图30 g* V& v( G4 s) C/ W9 R
该寄存器用于配置 IO0~7 的输入输出模式以及速率设置。
( u% u3 d5 h, M7 I6 o; r(2)GPIOx_CRH 寄存器(x=A~G)& K! T/ r+ J' R+ z, ~0 f
! W+ h+ B) ^3 N
; L: [6 u" Y% X
图4
* t& H1 Z. U; s该寄存器用于配置 IO8~15 的输入输出模式以及速率设置。
* K: ^- W0 n4 g6 r: f2 ^(3)GPIOx_IDR 寄存器(x=A~G)
( @$ p0 V- S* w6 i* W& y9 p2 k) ?4 Y, J
% S2 Q: V6 Y- m$ B图5
' a% R& c2 W9 v+ P( Q' k$ kIDR 是 GPIO 的输入数据寄存器。通过 IDR 寄存器可以读出 IO 的状态。需要注意的是 IDR 寄存器只能以字(16 位)的形式读出。, P& \2 |+ q0 P+ L0 A: h
(4)GPIOx_ODR 寄存器(x=A~G)& i8 V7 A8 H' `+ w7 h* |) m
) ]2 l3 C; X# v5 B0 \4 F' R5 S
. N F4 v- ]- G9 z, g( Y9 O( z图6& ~* V& X0 e# l7 T8 s" ^/ t
ODR 是 GPIO 的输出数据寄存器。通过 ODR 寄存器可以输出高低电平。0 S) H5 t# |' ^* d7 O( C
(5)GPIOx_BSRR 寄存器(x=A~G)7 F i) n8 I5 ?* B/ l) b/ v
' I7 I7 {) y9 j) ?1 C& ~! X7 g
F0 _8 r9 P% A! h( L1 l图72 h) r! C& O6 s- ^+ k
BSRR 是GPIO 的端口位设置/清除寄存器。BSRR 寄存器的高 16 位是清除IO 位,低 16 位是置位 IO 位。需要注意的是 BSRR 只有在写入 1 的时候,相应的功能才有作用,写入 0 是无效的。
2 Z* M4 n& J7 y8 u' T2 u(6)GPIOx_BRR 寄存器(x=A~G)8 s& ^1 M. W! n& }. f7 ^) B
3 E- m2 F( Y1 g% x
9 I& {, `1 G6 E1 S6 i2 e. q$ a
图8( `9 V, q' y3 b5 R% Z
BRR 是 GPIO 的端口位清除寄存器。BRR 基础只有在写入 1 的时候,相应的功能才有作用,写入 0 无效。
+ p- g6 d" `4 F4 U8 f7 U# B/ o' ^(7)GPIOx_LCKR 寄存器(x=A~G); ?) ?. E }7 k
6 v. X1 z; s) v5 M. u
[4 ~: p D8 r- E2 |% G图97 r0 l) m" L4 }6 H$ y
, T% L$ m% K) x/ v9 MLCKR 是GPIO 的端口配置锁定寄存器。LCKR 寄存器用来锁定IO 口的配置, 设置后,除了复位后不能再配置 IO 的状态。/ T( w% _3 y) y# W; w6 {
三、GPIO 实验% D) p1 B' S4 H+ l
本节实验的内容是对遥控上的指示灯进行控制,这里和在飞控实验中周期点亮航情灯一样,也是周期点亮遥控手柄上的指示灯。) L N& x0 S& D8 a( T% D+ f
遥控手柄上接到 STM32F103C8T6 上的 GPIO 管脚的指示灯有四颗,分别是电源指示灯、连接无人机指示灯、cocobit 编程模式指示灯以及紧急降落指示灯, 如下图所示。& n4 K- X2 u' r. i
4 o, H3 @. H* p( Y/ f4 @
( z Y4 s. `4 n( x
图104 N7 y2 O* \+ W
查看原理图,可知四个 LED 指示灯分别对应 PA8、PC13、PB4、PB5。
$ T% M- Z$ B, p2 Y: `
5 k+ R; ]# M/ l& J# O
2 g4 ?$ S8 U5 M- |& _+ R1 a1 D5 ~
图11 Q5 T. U- g9 r' a
编写代码的思路如下表所示:
. u/ F9 Z* K9 i+ C3 M, w4 p" _代码思路
& U/ H6 @* S3 i) u0 V, E. G1 a0 k" _! D
/ r8 Q; O% {. ~2 T表2- \0 q$ E) n4 x# i
按照代码思路,编写代码(通过调用官方库) 如下图所示为 GPIO 的初始化部分代码:
; L% U& t- a# c6 ^& O7 `7 P, Z9 y+ y, D6 f4 T
& o; K+ G7 K6 @) H图12: u$ X3 V$ }- V. `5 g3 `3 B
完成配置后只需要周期点亮以及关闭 LED 即可,如下图所示。4 ]/ G& U1 ^/ Y( Q4 g1 ]- P3 D3 m( @6 w
* E/ D7 t) L3 c; U* k1 \
, Y7 W" J! v2 Z; p& v图13( y9 }+ ]) x3 r" d7 ^: [; s
其中延时函数,如下图所示。/ l. {. X% L1 i0 [6 h" M$ f8 o% ?
/ I8 i) }9 o, F g
, U. B: \5 p" b" q
图14
! j; `- T- n2 J9 {4 g保存、编译、下载,就可以看到遥控手柄的四个 LED 指示灯周期性闪烁, 如下图所示。* z" b: c3 D+ n/ Q, j
' {, K: H) C4 Q1 G1 g' I
0 u3 T- y' F: G* o$ ^
图158 H, }* d4 U5 x! R1 n S1 j
4 o4 e8 @# W! }7 N: J. W* T7 N
3 V+ t1 |# C) _
1 R' F6 i" Z) a- _, t( m6 j
9 [9 H4 b5 `& `# P' `# e
4 \. y8 K6 b: H9 \% k$ {
$ O( U6 B. c, H% w; z# c4 L更多完整学习资料和对应开源套件,请登陆官网:“疯壳” a1 P2 ]) E& }5 m
2 y2 U5 X6 X5 [& J7 ~+ q. G
文件下载请点击:
【1】GPIO(遥控器指示灯控制).pdf
(855.71 KB, 下载次数: 0)
# |/ y9 X6 P8 K6 r) N( f, V6 Z4 x- N7 z
- S6 Z" J' W! f) E2 o. o$ S# I1 o* J6 J: x! U( o
|
|