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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
COCOFLY教程
——疯壳·无人机·系列
GPIO(遥控器指示灯控制)

  u2 N" W; ]  p8 p% P( z, R, U% @
2 m; g, _5 E( R) I4 b 0 w( ?7 S$ h- N' m/ L, K1 Z/ h
图1
2 m3 T6 V( S2 K$ S: |
+ c' v) S" S* Q+ v( n  _# N一、GPIO 简介
2 S$ J5 U9 ~' C9 OGPIO(General-purpose input/output),通用的输入输出的简称,单片机的引脚可以供使用者自由使用,可以配置为输出,也可以配置为输入。其中输出又可以是输出“高电平”或者“低电平”。在电子电路中“高电平”是电压高的状态, 用逻辑来表示即为 1,“低电平”是电压低的状态,用逻辑来表示即为 0。  x! g6 X8 e. D0 o3 r
STM32F103 系列是意法半导体基于 ARM Cortex M3 内核的 32 位单片机, 遥控器上用的主核心是 48 脚的 STM32F103C8T6,其片上的资源与飞控主板上的主核心 STM32F103CBT6 基本一致,不同点在于TM32F103C8T6 的 RAM 为20kBytes、Flash 为 64kBytes,而 STM32F103CBT6 的 RAM 为 20kBytes、Flash 为 128kBytes。其引脚如下图所示。
4 P0 Z: M( {9 @. T& {. C* v6 Q) U) k( k! J  p7 P

! e* Z) K1 F' ~; O图2
8 P' }8 B7 d# H* m: rSTM32F103C8T6 的 GPIO 的功能较多,有 A、B、C、D 等四组 GPIO,每组每个 GPIO 口都可以作为输出输出口使用之外, 还能作为复用引脚使用, 比如串口、I2C、SPI 等特殊接口的引脚。 但是需要注意的是每个引脚的复用功能是有限制的, 所以硬件连接时需要注意每个引脚有哪些复用功能, 这个可以在STM32F103 的数据手册中查看。GPIO 口一共有 8 种模式,分别为:浮空输入, 上拉输入,下拉输入,模拟输入, 开漏输出, 推挽输出,推挽式复用功能,开漏式复用功能如下表所示。
' z, B& ?1 R5 K( _/ w3 QSTM32F103GPIO 工作模式, V# x; o  J% N
  }: F  [& L! X" e
9 t: X0 a5 h9 F, i
表1- V3 i9 y/ O' Z
这 8 种功能我们就不一一介绍了, 有兴趣可以上网搜索了解一下,这里主要讲解一下开漏输出和推挽输出的区别。
6 I# i5 P1 g, n" _8 J/ [(1)开漏输出:" V1 y- N. l) B3 d% e. c
输出端相当于三极管的集电极. 需要上拉电阻才能得到高电平, 利用外部上拉电阻的驱动能力,减少 IC 内部的驱动,驱动能力强,适合于做电流型的驱动, 可达到 20mA。
4 [% ]+ z$ ?! T(2)推挽输出:" e% ?) g9 b& p+ ?1 c
可以输出高,低电平,连接数字器件,是由两个参数相同的三极管或MOSFET 以推挽方式连接,各负责正负半周的波形放大任务。电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高,既提高电路的负载能力, 又提高开关速度。2 M, i/ U6 S  _
总结一下:推挽输出可以输出强高低电平,连接数字器件;而开漏输出只可以输出低电平,高电平得靠外部电阻拉高。输出端相当于三极管的集电极,要得到高电平状态需要上拉电阻才行,适合于做电流型的驱动,其吸收电流的能力相对强(一般 20ma 以内)。$ k4 ~( p/ T% q2 S9 I$ H! b
二、GPIO 相关寄存器
, P" o. W' T# R' [STM32F103 的每个 GPIO 端口有:两个 32 位配置寄存器(GPIOx_CRL 和GPIOx_CRH)、两个 32 位数据寄存器(GPIOx_IDR 和 GPIOx_ODR)、一个 32 位置位/复位寄存器(GPIOx_BSRR)、一个 16 位复位寄存器(GPIOx_BRR)、一个 32 位锁定寄存器(GPIOx_LCKR)。
1 A0 B6 v, T0 |! v; L  T(1)GPIOx_CRL 寄存器(x=A~G)/ j' L# F% H' T! E$ {6 V9 _4 P6 v

; O' C% r* q6 U: v' Z6 f+ C  N
4 i5 m3 _7 D: N1 W图37 _  C2 P7 {: Y" o
该寄存器用于配置 IO0~7 的输入输出模式以及速率设置。) m- }5 g* S0 Y3 B
(2)GPIOx_CRH 寄存器(x=A~G)
" K- l2 S& n" y8 O
6 u3 k# ^- s& H; M 2 t' q# o! ^+ D) g- g& R( i, t& T  g
图44 {' q7 m7 K- O7 s+ o  `
该寄存器用于配置 IO8~15 的输入输出模式以及速率设置。
0 ~1 M/ j" ~5 h(3)GPIOx_IDR 寄存器(x=A~G)
: A  i* H+ \! m1 R: ]; W8 h- ^" a( }' X: R9 V! l

2 L. l: T9 I& y' }图5
, S+ m3 r- X& I# l+ |2 N, XIDR 是 GPIO 的输入数据寄存器。通过 IDR 寄存器可以读出 IO 的状态。需要注意的是 IDR 寄存器只能以字(16 位)的形式读出。
/ U  g$ @  g; W/ W$ J(4)GPIOx_ODR 寄存器(x=A~G)/ r0 j6 Y( Q) h* _& q7 h
) O2 i) I! {, a+ k! [1 h- j
; A8 k8 G, r: L) E
图6* ]; H3 L  ]0 i! s& n! T
ODR 是 GPIO 的输出数据寄存器。通过 ODR 寄存器可以输出高低电平。# P; r% F0 e. {, N5 c% }2 |
(5)GPIOx_BSRR 寄存器(x=A~G)8 b: r6 o' J8 F
& Y9 E  u2 @% |1 n, u# B

8 W) k! R8 p+ S3 L, h# {图7
: v7 W$ h; M8 PBSRR 是GPIO 的端口位设置/清除寄存器。BSRR 寄存器的高 16 位是清除IO 位,低 16 位是置位 IO 位。需要注意的是 BSRR 只有在写入 1 的时候,相应的功能才有作用,写入 0 是无效的。8 H, {0 }$ M3 o/ U' S
(6)GPIOx_BRR 寄存器(x=A~G)
4 C$ D, G# n# R; c( l
; r2 _* w: C$ P3 Y4 k$ k8 @/ d + L0 B. E" @. M- I7 u6 D' c
图8
( B+ C6 d% J2 x6 P! J" H! H" x% ^BRR 是 GPIO 的端口位清除寄存器。BRR 基础只有在写入 1 的时候,相应的功能才有作用,写入 0 无效。; u' ^. E4 y% B8 G8 \
(7)GPIOx_LCKR 寄存器(x=A~G)# f% d9 N8 w8 A' h6 n2 Y& ?, l

* ]8 c2 s' V; B# P
7 q/ O& V% ]9 h: [3 f# n图9
& v$ g! D8 l8 x5 ^3 k3 k8 X
& |! C- B9 ]7 _. X1 }- o: nLCKR 是GPIO 的端口配置锁定寄存器。LCKR 寄存器用来锁定IO 口的配置, 设置后,除了复位后不能再配置 IO 的状态。4 L. a) E* K5 n+ E+ h; o/ m
三、GPIO 实验0 i  ^  W3 A2 H9 }. T) o
本节实验的内容是对遥控上的指示灯进行控制,这里和在飞控实验中周期点亮航情灯一样,也是周期点亮遥控手柄上的指示灯。
3 V- |- I( Z; h( F遥控手柄上接到 STM32F103C8T6 上的 GPIO 管脚的指示灯有四颗,分别是电源指示灯、连接无人机指示灯、cocobit 编程模式指示灯以及紧急降落指示灯, 如下图所示。
) j' [- o4 v3 m2 y0 \' M4 N1 ~' S) Q2 L$ V( i
! P- y9 ~% b& `, ]6 P* d
图10
" e# I  o, V8 c! }* D2 d' R3 N( g3 x查看原理图,可知四个 LED 指示灯分别对应 PA8、PC13、PB4、PB5。3 O  `( D2 H& q% |! a- a
+ F/ i4 `5 k. I+ Q* _

! p7 h0 A: b$ C) d7 j( E- _图11
- E- s" l7 u! t' S' m/ V编写代码的思路如下表所示:
2 Q. q& k. U9 z) L0 K代码思路3 t9 ]( G7 A% l) D2 W2 t; n$ |5 X

/ U9 J2 y1 i$ f) w& k# V
4 o& K: g. l' D7 f9 T表2; x  m6 i* V4 j8 m! p9 _
按照代码思路,编写代码(通过调用官方库) 如下图所示为 GPIO 的初始化部分代码:
5 F+ A: b, T$ O) o. y+ j4 l0 S- ~& k( y$ H4 o# g5 `& b- j

% P  M1 j# z& B2 r6 F* G0 F4 L: L8 q图12
5 k; G7 [" @# L/ [; b5 r. n完成配置后只需要周期点亮以及关闭 LED 即可,如下图所示。. b) e! E5 [: `% G1 `' G0 p  c
3 ~& x' S( Z2 q' w

; P* w8 N) Q. W- u/ j; H2 [图130 S7 s- H4 x* K) r1 B2 X/ z' j
其中延时函数,如下图所示。$ z$ h) r  S5 c

1 R& E% t" u9 {$ s* j! ?' B7 e / f, W: l( V! l8 t3 ^6 f. K0 H- i
图140 ?9 v4 P( s# c1 P% H) D
保存、编译、下载,就可以看到遥控手柄的四个 LED 指示灯周期性闪烁, 如下图所示。
) k8 I, ?! X$ b& W% [5 u2 g
4 Q" H' X* H2 k1 i& {2 h
- h; Z3 ?) `7 O! S9 q# ?' l. Z图15: u5 M, w- O3 n+ q0 `& B; X9 R
6 I9 x) W. t1 ], h% ~' @

/ d' f2 \% ?9 J% H* H2 E
- x% k. {  o! L  ~7 P
# h6 R* b8 g4 d$ {6 p- B8 I/ E# \  X& }" T* Y4 {, `4 M

: a5 r3 U  m! T3 z更多完整学习资料和对应开源套件,请登陆官网:“疯壳”6 c. ^1 M1 L# l

8 n& m( D1 }) E) ]8 E# q文件下载请点击: 【1】GPIO(遥控器指示灯控制).pdf (855.71 KB, 下载次数: 0) " T8 @% i$ z. S+ l( d/ C. b! [

5 n- w3 e/ b5 W. w% d
% C  e! d+ Y$ W* I! w6 ?" t( Z( l' p( m' n- ^% Y, K# T
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-29 06:13 , Processed in 0.156250 second(s), 27 queries , Gzip On.

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

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

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