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

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

[复制链接]

该用户从未签到

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

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
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-25 20:35 , Processed in 0.125000 second(s), 27 queries , Gzip On.

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

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

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