|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 hunterccc 于 2021-9-16 11:28 编辑 ( l! F5 t4 a3 i" U D! K+ W# u ~
% T# S. r# ~ I' G/ V; B( R
1. GPIO简介
) t4 g! v$ s/ z+ y' ZGPIO是通用输入/输出端口的简称,是STM32可控制的引脚。GPIO的引脚与外部硬件设备连接,可实现与外部通讯、控制外部硬件或者采集外部硬件数据的功能。最简单的helloworld级别的例子: 将GPIO引脚接到LED灯,通过控制引脚的输出高、低电平试下开关控制LED;将按键接到GPIO引脚,通过读取GPIO引脚区分按键是按下还是松开。
, O3 t, w. P5 j
J5 b8 b3 ^ [7 n- {( [" o接下来干嘛?肯定是上那副经典的GPIO内部结构图了:
$ a! x. T2 S% o; p8 L- Y$ h" t) k2 d, w, S$ H
0 [: @0 M7 x0 D2 S U6 J# E0 M! w1 N3 ~3 O8 q: Z g. D
1.1 保护二极管
1 c7 f" T& C: _IO引脚上下两边两个二极管用于防止引脚外部过高/过低的电压输入,当引脚电压高于VDD时,上方的二极管导通,当引脚电压低于VSS时,下方的二极管导通,防止不正常电压引入芯片导致芯片烧毁。但是尽管如此,还是不能直接外接大功率器件,须加大功率及隔离电路驱动,防止烧坏芯片或者外接器件无法正常工作。
+ ?; G: k% P- ^
- O+ B# J* J9 n$ g1.2 P-MOS管和N-MOS管3 ]- D3 W. ]* k& k; W9 W
输出模式的GPIO,由P-MOS管和N-MOS管组成的单元电路使得GPIO具有“推挽输出”和“开漏输出”的模式。这两个MOS管接管电路的输入信号是由GPIO的输出数据寄存器GPIOx_ODR提供的,也就是我们可以通过编程修改GPIOx_ODR寄存器的值从而影响该单元电路的输出。9 R! C8 ^8 p* \9 N0 p: k
常用的还用置位/复位寄存器GPIOx_BSRR和复位寄存器GPIOx_BRR,设置这两个寄存器后也能影响GPIOx_ODR,进而影响单元电路输出。/ R6 _" I% j& m$ @7 F. I& Y
除此,还有复用功能输出,意思是指STM32的其它片上外设对GPIO引脚进行控制,此时该引脚作为外设功能的一部分。片上外设数据信号作为双MOS管接管的输入,进而输出到GPIO引脚中。例如USART串口通讯,要用到某个GPIO 引脚作为通讯发送引脚,就可以把该GPIO 引脚配置成USART 串口复用功能,由串口外设控制该引脚,发送数据。
5 W% C" z2 h0 }. Y
4 Z+ w+ r1 {. C% y1.3 TTL肖特基触发器' E' k" [% t) w( r
输入模式的GPIO,GPIO引脚经过内部上/下拉电阻配置成上/下拉、或者浮空输入,然后连接到触发器。信号经过触发器后,模拟信号转化为0和1的数字信号,然后存储在输入寄存器GPIOx_IDR中,通过读取GPIOx_IDR寄存器就可以知道GPIO的电平状态。1 T* R6 z- M3 e4 H4 ~8 k2 K
同理,与复用功能输出类似,这里也有复用功能输入,GPIO引脚的输入信号会传输到STM32的其他片上外设,由外设去读取该引脚状态。例如使用USART串口通讯,用某个GPIO引脚作为通讯的接收引脚。
- m- E" P. F Z, i* e另外,当GPIO引脚作为ADC采集电压的输入通道时,用其“模拟输入”功能,此时信号不再经过触发器进行TTL电平转换。ADC外设要采集到的原始的模拟信号。类似的,当GPIO引脚用于DAC模拟电压输出通道时,此时作为“模拟输出”功能,DAC信号输出不经过双MOS管。
% g6 F( W2 s; v; e% _" k( k, l! l& P$ {4 b, \, S
2. GPIO的工作模式1 i! \8 f* z) ~
GPIO的硬件结构,决定了GPIO可以配置成的工作模式有:
4 F; @/ k( M# G; q- p# t" L$ E0 _4 R/ R9 F* K4 o
typedef enum
3 N4 U6 L4 ^8 k{ GPIO_Mode_AIN = 0x0, //模拟输入* k: q# b+ l! Q- B) x3 U) O( p/ @9 G
GPIO_Mode_IN_FLOATING = 0x04, //浮空输入
- E0 h/ n2 l1 U3 M* x5 s GPIO_Mode_IPD = 0x28, //下拉输入
' d( }4 Y" @' j* O2 |7 P GPIO_Mode_IPU = 0x48, //上拉输入
% q, P4 N! u- M GPIO_Mode_Out_OD = 0x14, //开漏输入
6 z0 ?. V- d! e, Z: ^% O" b/ r5 z# H2 Z+ }- k
GPIO_Mode_Out_PP = 0x10, //推挽输出, h$ Q5 a7 b0 d& t
GPIO_Mode_AF_OD = 0x1C, //复用开漏输出
1 q' ~+ X- n' Q4 s7 U! O GPIO_Mode_AF_PP = 0x18 //复用推挽输出* X& I+ G8 k U' ]
}GPIOMode_TypeDef;
) u; _. l. n6 a8 o! r$ {; c. Z# G
2.1 输入模式(上拉/下拉/浮空/模拟)0 v, s3 r* l6 I/ `6 P& ^# m+ d
GPIO在输入模式中,肖特基触发器被打开,输出被禁止,通过GPIOx_IDR读取I/O状态。上拉/下拉输入,其默认电平由上拉/下拉决定,浮空输入的电平则是不确定的,完全由外部决定,一般按键就是采用浮空输入;模拟输入用于ADC采样。& B' r( V- q z: U+ e
% P# }4 \. P; C
2.2 输出模式(推挽/开漏): c$ i+ L- M0 `9 |: t( s/ z' |
GPIO在输出模式中,肖特基触发器同样被打开着的,即输入可用,这样通过输入数据寄存器GPIOx_IDR可以读取到IO实际状态。推挽模式时,双MOS以轮流方式工作,开漏模式下,只有N-MOS管工作。输出寄存器GPIOx_ODR可控制是输出高低电平;输出的速率可配,有2MHz/10MHz/50MHz。频率越高,功耗越大,效率也越高。
$ d1 ^. Q1 o' z# a, U" c, T5 {- m! U- h" x; ^
2.3 复用功能
& ` u5 X5 F* O4 b复用功能中,输出输入都使能,可工作与开漏或推挽模式,但是输出信号源于片上外设,输出数据寄存器GPIOx_ODR无效,输入寄存器GPIOx_IDR仍然有效,可通过它获取IO实际状态,片上外设相关寄存器也是通过GPIOx_IDR获取该数据信号。
; Q! ]! L9 g; i* h3 F7 \/ N/ b8 \
控制GPIO端口工作模式寄存器是GPIOx_CRL和GPIOx_CRH,它们都是32位的寄存器,分别管控GPIO的低8位IO和高8位IO。另外涉及到的寄存器还有:
, C0 @6 Z8 d( A. h/ ^+ o2 YGPIOx_ODR: 设置输出数据
. R8 Q3 I( t$ i1 J; q" F, o( vGPIOx_IDR:读取输入数据7 b9 U( W) R/ H- T2 H2 }- R
GPIOx_BSRR:置1/清零GPIO的相应引脚- a1 `- l, N, {
GPIOx_BRR:清零GPIO的相应引脚
. e0 B F, G1 J3 t这些寄存器的设置参照STM32中文参考手册即可,很简单,不赘述。另外,要让GPIO正常工作,记得打开GPIO的时钟。
5 j8 u! r" B* d6 o
& b2 S8 ?4 k: C/ k: `' _: x
8 m3 {$ P' I* v" Y. O7 x |
|