|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
COCOFLY教程 ——疯壳·无人机·系列 GPIO(遥控器指示灯控制)
& o- s+ S& L# b4 x# @0 g) `
9 j/ X3 L9 ~% {3 u0 u9 j9 B
6 k9 @; u' |7 H' w3 f; A
图1
. x$ \# \# {) K7 E- k. f. M& v3 x+ a
一、GPIO 简介
% P! U d0 q6 h/ V1 M$ oGPIO(General-purpose input/output),通用的输入输出的简称,单片机的引脚可以供使用者自由使用,可以配置为输出,也可以配置为输入。其中输出又可以是输出“高电平”或者“低电平”。在电子电路中“高电平”是电压高的状态, 用逻辑来表示即为 1,“低电平”是电压低的状态,用逻辑来表示即为 0。0 z/ z4 h5 ^1 ]- y' W0 S" m
STM32F103 系列是意法半导体基于 ARM Cortex M3 内核的 32 位单片机, 遥控器上用的主核心是 48 脚的 STM32F103C8T6,其片上的资源与飞控主板上的主核心 STM32F103CBT6 基本一致,不同点在于TM32F103C8T6 的 RAM 为20kBytes、Flash 为 64kBytes,而 STM32F103CBT6 的 RAM 为 20kBytes、Flash 为 128kBytes。其引脚如下图所示。$ A, [9 L8 R/ U6 A
* s4 |4 H: j$ y, [8 b
* z. J& s) x0 l: R
图2& ]$ I$ S# d) ]0 X0 C
STM32F103C8T6 的 GPIO 的功能较多,有 A、B、C、D 等四组 GPIO,每组每个 GPIO 口都可以作为输出输出口使用之外, 还能作为复用引脚使用, 比如串口、I2C、SPI 等特殊接口的引脚。 但是需要注意的是每个引脚的复用功能是有限制的, 所以硬件连接时需要注意每个引脚有哪些复用功能, 这个可以在STM32F103 的数据手册中查看。GPIO 口一共有 8 种模式,分别为:浮空输入, 上拉输入,下拉输入,模拟输入, 开漏输出, 推挽输出,推挽式复用功能,开漏式复用功能如下表所示。
6 y; E7 ?7 t) ]STM32F103GPIO 工作模式
/ s, X8 v; o: C0 q' E: M) F# f2 N2 f3 J) L% g* f: C
" C3 [5 D% {% J% z% y" `
表1; r9 @( ^7 D2 u7 Q1 t+ E( L6 B' r
这 8 种功能我们就不一一介绍了, 有兴趣可以上网搜索了解一下,这里主要讲解一下开漏输出和推挽输出的区别。" J; @' k. W$ F2 P$ @+ n
(1)开漏输出:
1 z( v/ X5 ^2 Q Z) u/ B输出端相当于三极管的集电极. 需要上拉电阻才能得到高电平, 利用外部上拉电阻的驱动能力,减少 IC 内部的驱动,驱动能力强,适合于做电流型的驱动, 可达到 20mA。
' W/ R1 f2 |* h& Z- y7 }& Z(2)推挽输出:* `8 }/ j& {: B
可以输出高,低电平,连接数字器件,是由两个参数相同的三极管或MOSFET 以推挽方式连接,各负责正负半周的波形放大任务。电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高,既提高电路的负载能力, 又提高开关速度。4 I9 p5 h! s( _% Z! V t( {* i
总结一下:推挽输出可以输出强高低电平,连接数字器件;而开漏输出只可以输出低电平,高电平得靠外部电阻拉高。输出端相当于三极管的集电极,要得到高电平状态需要上拉电阻才行,适合于做电流型的驱动,其吸收电流的能力相对强(一般 20ma 以内)。+ W+ }5 S6 D; J1 `
二、GPIO 相关寄存器
5 Q; _9 W' t1 y! V6 aSTM32F103 的每个 GPIO 端口有:两个 32 位配置寄存器(GPIOx_CRL 和GPIOx_CRH)、两个 32 位数据寄存器(GPIOx_IDR 和 GPIOx_ODR)、一个 32 位置位/复位寄存器(GPIOx_BSRR)、一个 16 位复位寄存器(GPIOx_BRR)、一个 32 位锁定寄存器(GPIOx_LCKR)。
! I' L% D4 N6 _8 t5 n* c' U2 P(1)GPIOx_CRL 寄存器(x=A~G)
) }2 H4 ^6 ~& I& S
. d1 T8 y+ X& s: l7 ^! ]; v m
. B% Q2 s6 [9 y3 M2 ~$ {7 u4 Q0 s) u% T
图3% U- c; l- m* F# ` Z
该寄存器用于配置 IO0~7 的输入输出模式以及速率设置。
. O) i0 n, E- S) z6 ]4 E(2)GPIOx_CRH 寄存器(x=A~G)' L# [6 j8 _" T, w6 A; X) B( l
0 U4 m$ M3 k, H' R J3 m
- C! s. G4 D. g1 ?. e图4
- L) c5 i/ I9 x: |* J0 f! N' v该寄存器用于配置 IO8~15 的输入输出模式以及速率设置。
6 I) |% N" W& Z- w6 X& Y {& e$ \(3)GPIOx_IDR 寄存器(x=A~G)
0 A$ G) h8 d _0 h5 O( C: ~+ J, G( a o/ M$ I3 ]
' V( {3 K% n- V( U5 T" T0 Q图5
m) h+ d- q4 O: w* ?' z: ?IDR 是 GPIO 的输入数据寄存器。通过 IDR 寄存器可以读出 IO 的状态。需要注意的是 IDR 寄存器只能以字(16 位)的形式读出。
, V3 w3 @; p% e5 H(4)GPIOx_ODR 寄存器(x=A~G)
2 u6 Y0 O' |% c" i! W8 _4 F7 `/ l% r- q
& D* m2 H1 M8 v3 {3 E7 t8 D9 s
图6) [) a# G' G2 P2 A$ G c# ?
ODR 是 GPIO 的输出数据寄存器。通过 ODR 寄存器可以输出高低电平。6 _& H. _* K; |
(5)GPIOx_BSRR 寄存器(x=A~G)" u7 X' n! Y& j4 l. S# H
: Y6 e9 ~$ |* a, ]
0 C4 N9 h2 Q5 F* m" @图7
! V0 y- k) A$ U' z; ?BSRR 是GPIO 的端口位设置/清除寄存器。BSRR 寄存器的高 16 位是清除IO 位,低 16 位是置位 IO 位。需要注意的是 BSRR 只有在写入 1 的时候,相应的功能才有作用,写入 0 是无效的。
0 v( `& B" v+ t(6)GPIOx_BRR 寄存器(x=A~G)
, F; i& ^* S( \6 c6 C8 H8 D; [- m1 g4 S
7 b/ ~) w" q" Y9 Z- b' H X
图8. u9 ~3 z; \$ ? n6 E0 [% q" F5 l
BRR 是 GPIO 的端口位清除寄存器。BRR 基础只有在写入 1 的时候,相应的功能才有作用,写入 0 无效。- Q: ~, j7 y4 T# R5 d
(7)GPIOx_LCKR 寄存器(x=A~G)
7 O- i# Z/ K4 `" m' j% i {. C2 a$ J. X! O, m
. D) h: s% r9 F( o! f% H& u' w
图9; t0 W) v6 h8 ^( j
2 Q; j' i0 j8 gLCKR 是GPIO 的端口配置锁定寄存器。LCKR 寄存器用来锁定IO 口的配置, 设置后,除了复位后不能再配置 IO 的状态。
) h% f+ ?- B* I" z+ Z$ p三、GPIO 实验 D' B. {" N$ R
本节实验的内容是对遥控上的指示灯进行控制,这里和在飞控实验中周期点亮航情灯一样,也是周期点亮遥控手柄上的指示灯。# s8 R( z* _$ i$ w9 @! \6 Q
遥控手柄上接到 STM32F103C8T6 上的 GPIO 管脚的指示灯有四颗,分别是电源指示灯、连接无人机指示灯、cocobit 编程模式指示灯以及紧急降落指示灯, 如下图所示。# `9 Y# k) L- t
7 W: O P3 M; j( T& j/ k* F
' L1 |0 J0 B4 k9 @
图10
. M: q5 I7 o' i# B查看原理图,可知四个 LED 指示灯分别对应 PA8、PC13、PB4、PB5。
5 M2 j% [: G0 Y& d- \8 C$ k1 n3 h# J' |3 F+ e& f$ R
1 y8 t1 v- e- a1 q4 G图11+ l4 n: d0 J3 ]; P. t
编写代码的思路如下表所示:# P1 k R$ U; M1 R
代码思路
8 ~, ]0 K/ a+ Z) g' ?' \# G
7 N4 [- `9 X+ `: j8 U; f# W
& h$ U1 @+ M/ }; u: R& Y9 I2 b: g( N
表2
6 w1 r& z' Z, X# V- F按照代码思路,编写代码(通过调用官方库) 如下图所示为 GPIO 的初始化部分代码: d7 M5 t3 w5 V0 y" |
8 p( m* E7 d1 h, R" `) x& l
2 F' g$ ~( s1 F0 j ]; P
图12
1 I9 ]8 Q3 N, z+ C$ g0 e, e& {! M完成配置后只需要周期点亮以及关闭 LED 即可,如下图所示。 E4 ]$ S" W: M% z2 Q( M, [
/ ? a. i# a6 m1 c7 V7 j
1 Y: a: o. i2 [0 p
图135 q+ q3 g [0 I# M, z4 _
其中延时函数,如下图所示。
# C3 R1 y1 Z2 }( X# z4 K" x
: T, |) \; k- C3 I: X3 I* u
; [" u; t+ p+ ], |8 z9 I8 G6 n图146 |" A: |* h6 Y: A2 C
保存、编译、下载,就可以看到遥控手柄的四个 LED 指示灯周期性闪烁, 如下图所示。% _3 e. V6 G" r* {" n( W' I n
. }* I& P' p. U6 L
8 V! y0 @8 s* L1 W0 y& c8 m9 c& n图15
0 c2 U: l3 V8 ]" A% h6 \5 n3 J2 {+ D1 {# f& ?
' P8 W, I- H& N& F5 ~0 ` y$ d, Z8 b% L6 Q- U4 Z
( Z) S5 u6 [9 x: o' I" Z4 x5 d% J5 \. C) u1 ]0 B
+ x! Z: b9 J* j) [) _2 \6 O更多完整学习资料和对应开源套件,请登陆官网:“疯壳”# h% Z- t# ?8 X, I& J
" \. d1 c4 J% ]- N5 V7 s文件下载请点击:
【1】GPIO(遥控器指示灯控制).pdf
(855.71 KB, 下载次数: 0)
0 E1 Y) ?6 I* Y6 r6 ^* z7 G! E0 ]/ }1 u
! C0 M, o) L6 i5 ?8 L d& Y& B2 c- {7 u* Z
. E9 [: Q2 c1 Q# _2 S) M% z
|
|