
一、GPIO介绍 GPIO:General Purpose Input Output通用用途输入输出 核心功能:输入、输出和高级外设的复用功能 & E* d! @. b% G) U ![]() ; `8 l0 O, y) ^0 l& k0 m/ p! [+ R 注:使用时一定要配置好各引脚是用作普通I/O(输出0和1)还是用作复用功能 STM32G431数据手册:查看STM32G4引脚复用功能* a! | c& ~. b. B4 j6 r4 _+ _ ![]() 查看对应引脚对应的复用功能:; z1 ]/ _1 h. o4 Z , ^$ k3 Q: R# }0 p8 y% q$ j ![]() 封装LQFP64 前5行 “ - ” 表示 “ 无 ” ,第1引脚从第6行开始7 Y7 ~& q$ M/ c P3 n 既然有多种复用功能选择,如何指定一种相应的复用功能? ==控制复用功能的选择某个引脚选择第二个功能: ==9 j* S1 q+ G q8 _; M/ i ![]() 将某一个引脚设置为一种复用功能可根据上图来看,每一行对应着不同的复用功能,将对应引脚设置为AFX对应功能所在列(将PA9设置为串口功能,只要将PA9设置为AF7即可),这里就要用使用到复用功能寄存器/ h7 d; `0 b, L ( X8 Q: m$ l0 c! B; [. } STM32G4系列控制器参考手册:7 T5 o' g/ N, v2 m& _# c( S : o. N; n: U- q$ I- Q ![]() - M, k6 e; y% H ![]() 这个是低位寄存器对应PA0-PA7, 还有一个高位寄存器对应PA8-PA15 9 @" m; |; H- {' z! \ ![]() * |2 |0 N/ t$ Y- } [ 所以,将PAx引脚设置为AFx引脚只需要像AFRL/AFRH寄存器写入相应的值 . J+ K. X/ \0 W( Q/ [/ o 将PA9设置为串口功能,只需要将GPIO A_AFRH 写入0111( PA9 对应 GPIO A_AFRH 中的 AFSEL9[3:0] ) : G4 q4 }9 [% ?7 ?. M5 Z 二、GPIO的基本结构 1.IO口内部电路结构 ![]() 0 X/ E& k4 k4 R, |+ J, j& u# L* y I/O口的基本结构可分为上下两部分,下半部分为输出驱动器 ,上半部分为输入驱动器 2.IO输入输出 1.普通IO输出8 W- U8 b" a4 f i" U% n( {; [2 o9 o , g" o5 T) I- e ![]() 5 d1 ^: M* G7 u, X# G% I" v- K (1)通过置位/复位寄存器和 输出数据寄存器的共同作用输出0或1 (2)在选择器处选择普通I/O输出( 或复用功能输出) (3)通过反相器将前面输出的0或1转换为1或0 * A7 Q! W# F+ S+ v% _6 k3 q (4)通过P-MOS管和N-MOS管两个MOS管决定输出逻辑0还是逻辑1! C' i( c4 ]6 I+ [) S/ E 7 x$ w( a5 y( M P-MOS管 为低电平导通,导通后输出逻辑1: M7 I$ F1 u( N% d0 m N-MOS管 为高电平导通,导通后输出逻辑0 : Q. \1 v6 H8 _/ o8 X3 p 2.复用功能功能输出# v' M, @8 H5 @! W ![]() 与普通IO输出相比,选择器选择复用功能输出 ) m& A, j* l/ p. X. { D: ?8 ? 3.普通IO输入 输入为低电平0时,上下拉电阻处于关闭状态,施密特触发器为打开状态+ q; u5 u) h( k/ V$ _$ F $ m# H1 Z x8 I ![]() 但是,若输入为高电平时要考虑输入电压的大小,如果电压过大必须进行稳压,否则会烧坏电路,这就是包含二极管的作用 % p( f. V+ O& T1 J) o5 i (1)输入的高电平为3.3V:能够直接通过I/O引脚进入内部电路 (2)输入的高电平为5V: 要用到 5V容错I/O端口 其中 VDD_FT(3.3V) 当输入为+5V时,上面的二极管导通,连接 VDD_FT(3.3V),将输入的5V稳压到3.3V,从而保护了电路 ![]() (3)当输入为-5V时(和5V方向相反),下面二极管导通,连接VSS(0V),将输入的-5V稳压到0V,从而保护电路 ![]() * ?( {2 a: q; C$ v1 ?" ?- B. P# z 上下拉电阻 当某个引脚处于悬空时,其输入电平不能确定,既不是高电平也不是低电平$ R9 n' h, x# e9 ^9 m: A8 T0 r1 c / `/ u; p4 K* v" F. ?* R 上拉下拉电阻用于处理IO口不确定的电平状态,强制性的将电平拉上或拉下' w( }+ ]# ~4 E3 i 2 ~0 T6 F% S3 v' K% c 注:当输入为确定的高电平或低电平时,上拉下拉电阻将不起作用 v9 \/ `; x e1 U8 i6 v " S; Q3 U# Q/ _7 o2 f 上拉和下拉都各有一个开关,当输入电平不确定时且上拉或下拉开关闭合时,不确定的电平就被强制性的转换为高电平(上拉开关闭合)或低电平(下拉开关闭合) 上拉电阻:将上拉开关闭合,输入的不确定电平被强制上拉为高电平0 W: _* w) l1 Z M) y . A" b* [' l* N1 S 下拉电阻:将下拉开关闭合,输入的不确定电平被强制下拉为低电平 ![]() , A+ \5 g3 U8 b* v5 q$ W 小结:( _& `' {: q d! o# t! S ; ^6 x; i; Z! x2 G2 d! X ![]() 三、GPIO工作模式 为实现不同的工作要求,GPIO有8种工作模式。每个I/O口可以自由编程,但I/O寄存器必须按32位字被访问。2 m9 P# F( d" }- S ![]() , t1 }% S9 ?+ Q: B: s0 r6 B 1.浮空输入 浮空输入:复位上电的时,引脚不确定电平的高低(既不接电源,也不接地 $ _9 v# O) d0 j S2 c% N ![]() : U- ~( {5 a. v+ p9 y (1)外部通过IO口输入电平(上下拉电阻处于关闭状态)+ V0 @ G1 l2 p: Y U1 ~7 H (2)传输到施密特触发器(此时施密特触发器为打开状态)" J0 j' Z& l8 u7 | (3)继续传输到输入数据寄存器IDR (4)CPU通过读输入数据寄存器IDR实现读取外部输入电平值7 V' ~( n8 b7 b7 v/ }) B) f- y h 2.输入上拉模式 输入上拉模式:与输入浮空模式相比较,不同之处在于内部有一个上拉电阻连接到 VDD(输入上拉模式下,上拉电阻开关接通,阻值约 30-50K)) M3 m4 N t: t; ] 9 d1 s, L+ L9 d/ a7 W. X' g. g% a ![]() 外部输入通过上拉电阻,施密特触发器存入输入数据寄存器 IDR,被 CPU 读取,当输入管脚悬空时不受外部噪声信号干扰。6 d. [" O3 ~2 k$ Y 9 d! K- e' Q+ V6 L) J( `- g" T 无论输入管脚悬空或者被高电平驱动时,读取的都是1. 只有在输入端为0的时,读取到的值才是0。因此采取的是非0输入模式。即若读取非0,即为1,若读取为0,即为0。强制上拉,一般是为了输入强高电平$ E E, S8 f& |4 ?6 `2 F& u! O 0 n* Z9 y; V# j! o2 K; d 3.输入下拉模式 输入下拉模式: 与输入浮空模式相比较,不同之处在于内部有一个下拉电阻连接到 VSS(输入下拉模式下,下拉电阻开关接通,阻值约 30-50K) ![]() ' T, V* L. V: d8 t, O Y. z" } 外部输入通过下拉电阻,施密特触发器存入输入数据寄存器 IDR,被 CPU 读取,强制下拉,一般是为了输入强低电平 4.模拟输入模式1 I3 c9 _5 |3 K/ _2 m ![]() 上拉和下拉部分均为关闭状态,施密特触发器为截止状态,通过模拟输入通道输入到 CPU,IO 口外部电压为模拟量(电压形式非电平形式), 作为模拟输入范围一般为 0~3.3V5 j, p" {7 Y- ?0 S" G- [0 O 将IO口作为模拟输入接口,输入的可能是变化的值,接收外部的模拟信号输入5 t- k9 D# f- i- j/ w2 P$ k 5.开漏输出模式9 h" D& z$ k0 W7 ^ l& h! [ 开漏输出即三极管的集电极或者MOS管的漏极进行输出 开漏输出可以实现线与功能。开漏输出只能输出强低电平,高电平需要依靠外部上拉电子拉高,适合做电流型驱动,吸收电流能力较强" z/ F" W v! y) g* C- Y. }; J 注: 在输出模式下TTL施密特触发器为开启状态,所以输出模式下仍存在输入 0 W, p ?1 O6 R* F! Q" W. D+ d) z ![]() (1)CPU写入位设置/清除寄存器BSRR,映射到输出数据寄存器ODR" \9 Y$ C! y8 p/ M% d (2)联通到输出控制电路(也就是ODR的电平) (3)ODR电平通过输出控制电路进入N-MOS管+ H6 U% {- d7 D6 g0 l, ~ : z( l9 G; I0 k0 H0 B' e, r 开漏不使用 P-MOS(输出1) ,故输出不为 “0” 或 “1”,而是 “0” 或 “浮空” , ]: j6 H# q$ X T+ O (1)写0传输到MOS管处,N-MOS 导通,输出为0 (2)写1传输到MOS管处,P-MOS 和 N-MOS 都不导通,输出浮空7 M+ p y$ D9 N. f' | (1)ODR输出0: t" r; z; e; E& m6 n N-MOS截止,IO端口电平不会由ODR输出决定,而由外部上拉/下拉决定 , x; n3 \( y8 M0 \) C; K# U 在输出状态下,输出的电平可以被读取,数据存入输入数据寄存器,由CPU读取,实现CPU读取输出电平 所以,当N-MOS截止时,如果读取到输出电平为1,不一定是我们输出的1,有可能是外部上拉产生的1 (2)ODR输出1: N-MOS开启,IO端口电平被N-MOS管拉倒VSS,使IO输出低电平。此时输出的低电平同样可以被CPU读取到4 Q4 p; X4 O/ b. P- u - A* \: L. q7 [+ R h' p' W6 P/ c2 s 开漏输出为不确定状态,不具有驱动能力 6.推挽输出模式7 `) M6 ]( S6 C& s4 Q; E8 P 推挽输出使用 P-MOS和N-MOS ,输出为0或1 1 i/ ^0 T6 l: O3 Z+ V ![]() 推挽输出可以采取强高/强低输出,可以连接数字电路 & [0 C: | Q* [6 z+ `' F 7.推挽复用输出模式 ![]() 与推挽输出模式唯一的区别在于输出控制电路之前电平的来源 推挽输出模式的输出电平是由CPU写入输出数据寄存器控制的,推挽复用输出模式的输出电平是由复用功能外设输出决定的! T% G1 V+ I. d! J( P 8.开漏复用输出模式. n1 m2 ^8 |4 c, [4 z1 W ![]() 与开漏输出模式唯一的区别在于输出控制电路之前电平的来源 开漏输出模式的输出电平是由CPU写入输出数据寄存器控制的,开漏复用输出模式的输出电平是由复用功能外设输出决定的 % _4 D1 F# W' Z; l8 ]) W! @ 小结: (1)推挽结构:两个参数相同的三极管或MOS管分别受两互补信号的控制,总是在一个三极管或MOS管导通的时候另一个截止。高低电平由输出电平决定- q/ S8 D5 L' H8 U! o 6 t @+ f" [, S, q( E' k9 ] (2)开漏输出:只可以输出强低电平,高电平得靠外部电阻拉高。输出端相当于三极管的集电极。适合于做电流型的驱动,其吸收电流的能力相对强, 由于输出电平完全由上拉电阻连接的电源电平决定,很方便的调节电平转换; r' O4 k7 W! R% x% R H5 Y6 K, P 可以实现"线与"功能,"线与"指的是多个信号线直接连接在一起,只有当所有信号全部为高电平时,合在一起的总线为高电平;只要有任意一个或者多个信号为低电平,则总线为低电平 (3)推挽输出:可以输出强高、低电平,都具有驱动能力,可以连接数字器件 四、GPIO寄存器组6 V' G$ l J+ r) T7 C* ? STM32G4系列控制器参考手册 : 查看GPIO寄存器1 G, b0 j4 R3 h% P- e0 O ; C: ]& x6 s, Z0 G: b5 J ![]() 每个GPIO包括10个寄存器来配置GPIO的具体功能(每个引脚功能都是完全可以独立配置,互不影响): GPIOx_MODER:GPIO 端口模式寄存器1 d2 g: l( N4 T* d* k5 t9 H+ { GPIOx_OTYPER :GPIO 端口输出类型寄存器9 I& |. `( r) \1 n GPIOx_OSPEEDR :GPIO 端口输出速度寄存器 GPIOx_PUPDR :GPIO 端口上拉/下拉寄存器: _4 D( A3 L# ~ GPIOx_IDR :GPIO 端口输入数据 GPIOx_ODR :GPIO 端口输出数据寄存器: i+ `6 J& s* n! ?% k$ y* U# r3 @ GPIOx_BSRR :GPIO 端口置位/复位寄存器& n& d# I \( h& I4 [ [5 a+ q" [' g6 { GPIOx_LCKR :GPIO 端口配置锁定寄存器 GPIOx_AFRL :GPIO 复用功能低位寄存器 GPIOx_AFRH :GPIO 复用功能高位寄存器 GPIOx_BRR:GPIO位复位寄存器 / C+ ~4 w( }) a+ P' q; ~ ![]() / [( Q! T9 J; S& U- s5 G p& U 7 s$ H, U9 r y. q9 z |