|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
COCOFLY教程 ——疯壳·无人机·系列 GPIO(遥控器指示灯控制)
. C" d, V' E# k& x1 B' q, H. g1 c2 j, `
t9 Z$ _5 H6 `" d9 [
图1* _( d% U$ \, K4 W& e
" h6 V/ r# Z, o7 k. Z1 R( i
一、GPIO 简介
# y. p( t3 a/ o3 j" _4 e' `: ?+ RGPIO(General-purpose input/output),通用的输入输出的简称,单片机的引脚可以供使用者自由使用,可以配置为输出,也可以配置为输入。其中输出又可以是输出“高电平”或者“低电平”。在电子电路中“高电平”是电压高的状态, 用逻辑来表示即为 1,“低电平”是电压低的状态,用逻辑来表示即为 0。
7 c g: |& e5 u$ E J& m: U, v5 n- NSTM32F103 系列是意法半导体基于 ARM Cortex M3 内核的 32 位单片机, 遥控器上用的主核心是 48 脚的 STM32F103C8T6,其片上的资源与飞控主板上的主核心 STM32F103CBT6 基本一致,不同点在于TM32F103C8T6 的 RAM 为20kBytes、Flash 为 64kBytes,而 STM32F103CBT6 的 RAM 为 20kBytes、Flash 为 128kBytes。其引脚如下图所示。# M3 g! P9 c& [% o
8 _. ^, ~+ o, c, \! \3 a# _: `0 T
: G7 V8 U! R1 v% Q) R! m
图2! r- A% a% s5 H3 C
STM32F103C8T6 的 GPIO 的功能较多,有 A、B、C、D 等四组 GPIO,每组每个 GPIO 口都可以作为输出输出口使用之外, 还能作为复用引脚使用, 比如串口、I2C、SPI 等特殊接口的引脚。 但是需要注意的是每个引脚的复用功能是有限制的, 所以硬件连接时需要注意每个引脚有哪些复用功能, 这个可以在STM32F103 的数据手册中查看。GPIO 口一共有 8 种模式,分别为:浮空输入, 上拉输入,下拉输入,模拟输入, 开漏输出, 推挽输出,推挽式复用功能,开漏式复用功能如下表所示。( ~' K5 X& c7 Z- W3 [/ A
STM32F103GPIO 工作模式# r$ ]. X/ K; |/ a2 d# H
" p0 A6 j! H3 C1 @, s% }: c
' @+ a) y% U' `. p; S/ v
表14 U7 D2 u G" Z: T; L T; T8 O C
这 8 种功能我们就不一一介绍了, 有兴趣可以上网搜索了解一下,这里主要讲解一下开漏输出和推挽输出的区别。
- X2 ]9 J9 ?9 A. ~' M! p(1)开漏输出:* V$ [, }7 g$ u
输出端相当于三极管的集电极. 需要上拉电阻才能得到高电平, 利用外部上拉电阻的驱动能力,减少 IC 内部的驱动,驱动能力强,适合于做电流型的驱动, 可达到 20mA。
7 N( y2 H2 M# e(2)推挽输出:
6 W3 g$ M0 i4 o+ R6 t可以输出高,低电平,连接数字器件,是由两个参数相同的三极管或MOSFET 以推挽方式连接,各负责正负半周的波形放大任务。电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高,既提高电路的负载能力, 又提高开关速度。8 z* v+ H0 r9 }) t6 `
总结一下:推挽输出可以输出强高低电平,连接数字器件;而开漏输出只可以输出低电平,高电平得靠外部电阻拉高。输出端相当于三极管的集电极,要得到高电平状态需要上拉电阻才行,适合于做电流型的驱动,其吸收电流的能力相对强(一般 20ma 以内)。9 B d+ T* O6 m) @9 w
二、GPIO 相关寄存器
, \6 N$ Z9 {, G( u) sSTM32F103 的每个 GPIO 端口有:两个 32 位配置寄存器(GPIOx_CRL 和GPIOx_CRH)、两个 32 位数据寄存器(GPIOx_IDR 和 GPIOx_ODR)、一个 32 位置位/复位寄存器(GPIOx_BSRR)、一个 16 位复位寄存器(GPIOx_BRR)、一个 32 位锁定寄存器(GPIOx_LCKR)。
' K+ n2 a9 B+ [( s( I$ }' `6 i( H$ u3 e(1)GPIOx_CRL 寄存器(x=A~G)( ^# y, O: r# R' G
. Q! M" Z& l8 E, k7 c0 b
. ]! x2 e2 G& I- v图31 T/ P# q4 M, V; W
该寄存器用于配置 IO0~7 的输入输出模式以及速率设置。$ |; t& C M; F- c9 s
(2)GPIOx_CRH 寄存器(x=A~G)/ x" g9 V1 N0 e2 r% `7 p) L: S
5 s3 Z Q0 i2 a2 H1 ]5 y5 c; s, ]/ @
/ N0 d, s5 o; |: k2 e1 F+ S& @6 j图4
" G% X; `4 B9 N, X0 h( N该寄存器用于配置 IO8~15 的输入输出模式以及速率设置。
5 j7 \ n0 G( U1 l(3)GPIOx_IDR 寄存器(x=A~G)' }/ L2 a5 v8 B* \; _
- y7 f, r# `6 f- Y7 Z `
# `) \# x$ \6 y4 G图5
" S3 c3 j* ]# D. ^IDR 是 GPIO 的输入数据寄存器。通过 IDR 寄存器可以读出 IO 的状态。需要注意的是 IDR 寄存器只能以字(16 位)的形式读出。
- W5 _* v- V) x0 @! A# o Z9 K( P(4)GPIOx_ODR 寄存器(x=A~G)0 v8 \6 z' q, T! p
* v& G6 w/ W8 C
- z8 W0 i+ G9 k( z, h, L+ b图6
1 m& V* i- J( JODR 是 GPIO 的输出数据寄存器。通过 ODR 寄存器可以输出高低电平。
* f" n" z ~4 M(5)GPIOx_BSRR 寄存器(x=A~G)
8 V' @9 h. X! s9 v% E1 C3 L+ |( ~0 g \# }' Y
# E% o, {) v2 ^1 H. F' |3 V4 l图75 Z5 @: P5 g# l
BSRR 是GPIO 的端口位设置/清除寄存器。BSRR 寄存器的高 16 位是清除IO 位,低 16 位是置位 IO 位。需要注意的是 BSRR 只有在写入 1 的时候,相应的功能才有作用,写入 0 是无效的。
3 D, j; L2 a5 R+ |4 N$ z(6)GPIOx_BRR 寄存器(x=A~G)
, _" h+ S# }0 y- G% o6 F$ i2 e- ~& \, D
+ ]+ R6 @3 u1 p3 O5 I2 u
图8* Z8 l6 @& h. Y0 Z+ c# ?) Q
BRR 是 GPIO 的端口位清除寄存器。BRR 基础只有在写入 1 的时候,相应的功能才有作用,写入 0 无效。" L3 N/ y+ D$ F+ y; j0 Y9 t
(7)GPIOx_LCKR 寄存器(x=A~G)3 B* x; Q+ Y O- a# n! S& s
' | }4 _* r) Q: F" k$ s
- {+ s! G* V6 e- c- i7 |图9
5 {5 E! {7 ` r, ]; Z3 D
5 W0 h9 g- D! ~/ W, D7 I- F" g2 PLCKR 是GPIO 的端口配置锁定寄存器。LCKR 寄存器用来锁定IO 口的配置, 设置后,除了复位后不能再配置 IO 的状态。
, a8 V2 v8 j) z4 A% n" n三、GPIO 实验
* F0 y. V* Q$ a% j% v U本节实验的内容是对遥控上的指示灯进行控制,这里和在飞控实验中周期点亮航情灯一样,也是周期点亮遥控手柄上的指示灯。
" S. _+ Z3 Y$ m- U# A遥控手柄上接到 STM32F103C8T6 上的 GPIO 管脚的指示灯有四颗,分别是电源指示灯、连接无人机指示灯、cocobit 编程模式指示灯以及紧急降落指示灯, 如下图所示。
' }) [. o- h8 {) O. S1 h) Y6 g$ v8 W( [5 k9 l0 H% D5 d: ^1 \4 z" W
% I, G) k( S! K
图10
( ~0 }( S8 X: s2 R. z( \* O- Q查看原理图,可知四个 LED 指示灯分别对应 PA8、PC13、PB4、PB5。
+ m b; T8 [2 r! N& v; ~; l, g$ ]. ^
9 V% H6 s/ X2 k* ^" t( s$ f图11
$ V' n3 q, i: W3 J编写代码的思路如下表所示:
! V* I( B2 a; n0 ]代码思路 T- l1 T' y" h+ T; v
$ a4 m! P" e4 p3 I ^* ~, ]) h' O
! f- I3 ^$ v/ A) s$ m表2& i0 O1 p! n1 u _8 j5 I
按照代码思路,编写代码(通过调用官方库) 如下图所示为 GPIO 的初始化部分代码:: Z8 W) V c8 W' {; m
: E, E4 y; A& t3 x7 i+ y
% u3 w3 U9 O$ m图12' B, ]$ x) l1 ?0 N7 t' U
完成配置后只需要周期点亮以及关闭 LED 即可,如下图所示。. ^' A( k3 p# a
" d- A6 z! c, G& s: y! C8 z4 S
3 c* {$ D3 {; `3 @" l" N图13
& W+ v9 ?$ _( l7 v6 H' m其中延时函数,如下图所示。
& z, R: Y0 L- `# Z' D2 ^
- q0 g; }" R2 a0 {$ q, s
7 W$ W! @" o, y0 m" V f3 ~图143 `) w* g; w* ^, I! q7 v
保存、编译、下载,就可以看到遥控手柄的四个 LED 指示灯周期性闪烁, 如下图所示。
+ |; R r* u* n* \8 Y: D4 W& h: m
$ B3 [3 q j! s2 v
, I+ U8 y6 _/ x" [# J
图15" x) I2 V5 Z: o
, S! v' L; V+ I& g0 L% y
% t) t' z0 ~+ j4 @ `- s6 E
R: C+ p1 ~( d$ f; q
6 ^. A- X$ p% m2 \: y( o# B% I8 ]' ]8 p- O4 o. [
. i+ U3 F9 q6 x4 j( j
更多完整学习资料和对应开源套件,请登陆官网:“疯壳”
' [: j N7 s; K
# }5 o+ m) l( y5 d, \文件下载请点击:
【1】GPIO(遥控器指示灯控制).pdf
(855.71 KB, 下载次数: 0)
4 X$ R, e: j! f% f' w( U5 d* [% `
- U |* a5 i% p, j$ D7 Z* u. T4 H2 P( S6 d6 ^! k
! V+ K+ f" ]6 F6 I% ` |
|