STMCU小助手
发布时间:2021-10-12 14:15
|
1 GPIO简介 GPIO,即通用I/O(输入/输出)端口,是STM32可控制的引脚。STM32芯片的GPIO引脚与外部设备连接起来,可实现与外部通讯、控制外部硬件或者采集外部硬件数据的功能。 ( C0 m# `- n+ n0 S c: J& F0 x2 z . {1 z: m* @0 f+ J/ J STM32F407有7组IO。分别为GPIOA~GPIOG,每组IO有16个IO口,共有112个IO口 通常称为 PAx、PBx、PCx、PDx、PEx、PFx、PGx,其中x为0-15。 并且F4系列是基于Cortex-M4内核 ! V- F& q4 l# q/ k1 n$ y 9 `' Y3 E8 q' I( y# m- l GPIO的复用:1 V/ _% e4 L# \* k 0 ~% g" D0 c3 U6 ?; T, H $ U; @( v6 `& w' k6 y+ _ STM32F4 有很多的内置外设,这些外设的外部引脚都是与 GPIO 共用的。也就是说,一个引脚可以有很多作用,但是默认为IO口,如果想使用一个 GPIO内置外设的功能引脚,就需要GPIO的复用,那么当这个 GPIO 作为内置外设使用的时候,就叫做复用。 比如说串口 就是GPIO复用为串口0 i* b+ ~: j; P' Z 2 GPIO的工作模式% C) g. W+ B% I! _. h" x 1、4种输入模式 7 E. F" a) ^; ^6 j (1)GPIO_Mode_IN_FLOATING 浮空输入/ L9 ?% m* R% c+ _% D (2)GPIO_Mode_IPU 上拉输入 (3)GPIO_Mode_IPD 下拉输入9 q5 H$ p) l1 j- j/ d (4)GPIO_Mode_AIN 模拟输入 $ f- {5 d4 ?+ y* J, l. l ' m0 @6 d( L/ e) \ 2、4种输出模式 ) H/ A3 f% y5 X+ x- i& J# r B: o/ W1 l$ J (5)GPIO_Mode_Out_OD 开漏输出(带上拉或者下拉)- l2 L$ ?2 o" d1 u (6)GPIO_Mode_AF_OD 复用开漏输出(带上拉或者下拉)! q/ f/ L0 n. a, a/ w4 W: D9 \3 w (7)GPIO_Mode_Out_PP 推挽输出(带上拉或者下拉) @' n5 d4 e9 w; W1 T (8)GPIO_Mode_AF_PP 复用推挽输出(带上拉或者下拉) 3、4种最大输出速度) y: H: H" `3 h6 X (1)2MHZ (低速) (2)25MHZ (中速)$ u+ ?' a2 E+ C0 a, f' ]' i (3)50MHZ (快速)# D8 c8 P8 _5 u# a7 X# o (4)100MHZ (高速)/ [ d- Y+ u, C) g+ X2 ?. ]) m 3 o. X; y+ F* X 关于他们的定义,都在 stm32f4xx_gpio.h 中,都为结构体形式的定义 2 f& {! ^. v4 c$ w3 W* R : U+ z6 L* x+ h2 H6 d 3 GPIO框图剖析
我们所用到的每一个GPIO其内部结构都是这样,分别对应着GPIO的八种模式 这里我们简单的介绍下: ) g/ K4 t- Q7 W" I ! F- y* l8 d5 R 保护二极管: IO引脚上下两边两个二极管用于防止引脚外部过高、过低的电压输入,当引脚电压高于VDD_FT时,上方的二极管导通,当引脚电压低于VSS时,下方的二极管导通,防止不正常电压引入芯片导致芯片烧毁 / b) F u; O; P/ S& X$ r" L 上拉、下拉电阻:控制引脚默认状态的电压,开启上拉的时候引脚默认电压为高电平,开启下拉的时候引脚默认电压为低电平 TTL施密特触发器:基本原理是当输入电压高于正向阈值电压,输出为高;当输入电压低于负向阈值电压,输出为低;IO口信号经过触发器后,模拟信号转化为0和1的数字信号 也就是高低电平 并且是TTL电平协议 这也是为什么STM32是TTL电平协议的原因 P-MOS管和N-MOS管:信号由P-MOS管和N-MOS管,依据两个MOS管的工作方式,使得GPIO具有“推挽输出”和“开漏输出”的模式 P-MOS管高电平导通,低电平关闭,下方的N-MOS低电平导通,高电平关闭; P. S; Q0 H) p% ?/ D7 | 注: VDD_FT 代表IO口,兼容3.3V和5V,如果没有标注“FT”,就代表着不兼容5V - ]/ I. Y6 z" S" U+ t' a$ ] 在芯片数据手册的引脚定义中,会看到有“I/O电平”一列 有FT即为支持5V
4 GPIO的八种工作模式剖析:; k6 E# J6 t$ `1 R) X8 b+ | 浮空输入模式
浮空输入模式下,I/O端口的电平信号直接进入输入数据寄存器。MCU直接读取I/O口电平,I/O的电平状态是不确定的,完全由外部输入决定;如果在该引脚悬空(在无信号输入)的情况下,读取该端口的电平是不确定的。 (接用电压表测量其引脚电压为1点几伏,这是个不确定值) 以用来做KEY识别 . U" H( r& T. _0 ~ ~ 0 `# p$ ?& T1 U' t; e. G 上拉输入模式
IO内部接上拉电阻,此时如果IO口外部没有信号输入或者引脚悬空,IO口默认为高电平 如果I/O口输入低电平,那么引脚就为低电平,MCU读取到的就是低电平 STM32的内部上拉是"弱上拉",即通过此上拉输出的电流是很弱的,如要求大电流还是需要外部上拉。/ s( K8 K% Q/ X, l# O # l3 ?4 o! t* ?% T! r+ n" j* K - s' }& X" D. U# P 下拉输入模式
IO内部接下拉电阻,此时如果IO口外部没有信号输入或者引脚悬空,IO口默认为低电平 如果I/O口输入高电平,那么引脚就为高电平,MCU读取到的就是高电平4 L: |( j9 J$ K0 e: S 模拟输入模式
当GPIO引脚用于ADC采集电压的输入通道时,用作"模拟输入"功能,此时信号不经过施密特触发器,直接直接进入ADC模块,并且输入数据寄存器为空 ,CPU不能在输入数据寄存器上读到引脚状态- r4 n9 g' T* r, B. J: u8 I/ U2 z 3 @8 e* v3 e4 d) b8 w% M 6 V1 s6 U2 S4 a& f2 f9 d- Z5 ? 当GPIO用于模拟功能时,引脚的上、下拉电阻是不起作用的,这个时候即使配置了上拉或下拉模式,也不会影响到模拟信号的输入输出. w2 b$ F, B% `, m/ A. O / R+ r- r( v) t _0 r5 |/ k+ j 除了 ADC 和 DAC 要将 IO 配置为模拟通道之外其他外设功能一律 要配置为复用功能模式,7 ?3 f7 N1 E( p# K4 t* p, E) T$ j 5 a# u* h5 k' Q) g 开漏输出模式(带上拉或者下拉)! t5 B" |/ z8 i m' r
在开漏输出模式时,只有N-MOS管工作,如果我们控制输出为0,低电平,则P-MOS管关闭,N-MOS管导通,使输出低电平,I/O端口的电平就是低电平,若控制输出为1时,高电平,则P-MOS管和N-MOS管都关闭,输出指令就不会起到作用,此时I/O端口的电平就不会由输出的高电平决定,而是由I/O端口外部的上拉或者下拉决定 如果没有上拉或者下拉 IO口就处于悬空状态) W6 q5 J' L) g& e! k. z5 ^* Y % _3 _; {6 M& e! g2 `, ` 并且此时施密特触发器是打开的,即输入可用,通过输入数据寄存器GPIOx_IDR可读取I/O的实际状态。,I/O口的电平不一定是输出的电平 4 y' }0 ?: _5 |8 a' R9 _% s* D" F ! Z+ A% l6 ~8 y" _ Y7 W5 ?$ Q) Y 推挽输出模式(带上拉或者下拉)
在推挽输出模式时,N-MOS管和P-MOS管都工作,如果我们控制输出为0,低电平,则P-MOS管关闭,N-MOS管导通,使输出低电平,I/O端口的电平就是低电平,若控制输出为1 高电平,则P-MOS管导通N-MOS管关闭,使输出高电平,I/O端口的电平就是高电平, 外部上拉和下拉的作用是控制在没有输出时IO口电平 此时施密特触发器是打开的,即输入可用,通过输入数据寄存器GPIOx_IDR可读取I/O的实际状态。I/O口的电平一定是输出的电平 8 t! R1 K% e3 B4 D3 ?. q2 r , x4 h( o7 |9 k/ e # |, @: n" w+ w 复用开漏输出(带上拉或者下拉), }! Y) S6 y3 c6 I8 X- A
GPIO复用为其他外设,输出数据寄存器GPIOx_ODR无效; 输出的高低电平的来源于其它外设,施密特触发器打开,输入可用,通过输入数据寄存器可获取I/O实际状态 除了输出信号的来源改变 其他与开漏输出功能相同* d0 F" h4 h* l" A 复用推挽输出(带上拉或者下拉)
GPIO复用为其他外设(如 I2C),输出数据寄存器GPIOx_ODR无效; 输出的高低电平的来源于其它外设,施密特触发器打开,输入可用,通过输入数据寄存器可获取I/O实际状态 除了输出信号的来源改变 其他与开漏输出功能相同" ?* {; G; X; p2 a8 g! w 开漏输出和推挽输出的区别: 6 M* e# H" ?- [' W1 v 推挽输出: 7 n0 \, A# X" l( J 可以输出强高低电平,连接数字器件 1 A. t0 i7 q4 z" Z0 s 推挽结构一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止.5 A G+ |, E+ D+ D" S 开漏输出:" k9 A- n) P, L/ N8 h [& ` 可以输出强低电平,高电平得靠外部电阻拉高。输出端相当于三极管的集电极. 需要外接上拉电阻,才能实现输出高电平 合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内); " ]" |4 x7 x( E 在使用任何一种开漏模式时,都需要接上拉电阻,否则只能输出低电平
推挽输出电路: 其中IN端输出高电平时下面的PNP三极管截止,而上面NPN三极管导通,输出电平VS+;当IN端输出低电平时则恰恰相反,PNP三极管导通,输出和地相连,为低电平 ' j: H% Z! Q* e4 v1 H5 U & |1 k; x: w- b! p+ r 开漏输出电路:IN端输出低电平时,三极管导通,使输出接地,IN端输出高电平时,三极管截止,所以引脚既不输出高电平,也不输出低电平,为高阻态。为正常使用时必须接上拉电阻, 5 a) x& n2 H; J: J- T - A8 B1 l$ {& A2 J1 a2 b 在STM32中选用IO模式:$ E2 G: Q* z: a7 ~7 u/ [& k " ~! }& y8 g( T3 v0 r& F 上拉输入、下拉输入可以用来检测外部信号;例如,按键等;; F1 \! h1 U5 `- W 模拟输入 ——应用ADC模拟输入,或者低功耗下省电) H( B3 f' u W' ^ 开漏输出一般应用在I2C、SMBUS通讯等需要"线与"功能的总线电路中。 推挽输出模式一般应用在输出电平为0和3.3伏而且需要高速切换开关状态的场合。在STM32的应用中,除了必须用开漏模式的场合,我们都习惯使用推挽输出模式。 复用功能的推挽输出_AF_PP ——片内外设功能(I2C的SCL,SDA) 复用功能的开漏输出_AF_OD——片内外设功能(TX1,MOSI,MISO.SCK.SS) F4系列与F1系列区别:4 s0 {+ G* `" F* j$ V2 o: ^ 本质上的区别是F4系列采用了Cortex-M4内核 而F1系列采用Cortex-M3内核( e1 M, `% z' R, Q/ S& | , F/ J8 q/ r. Z* r: h( Q & b- C0 s, I8 \* J$ u& w" n F1系列(M3)IO口基本结构:
F4系列(M4)IO口基本结构:
F4系列设计的更加高级与人性化,他将外部上下拉电阻转移到了输出/输入驱动器外部,使得输出模式下也可以实现内部上拉与下拉,方便了用户的使用,增加了灵活性 2 `) v, {2 P( S. P GPIO的初始化(F4) 这里我们以初始化LED为例 2 ^& D2 T6 e5 N# Q6 b 1.定义一个 GPIO_InitTypeDef 类型的结构体( t d( S, \: V1 \5 {! A
2开启 LED 相关的 GPIO 外设时钟1 Y& I: i7 m7 P
0 K. Q" `& t6 ^ i 任何外设都需要时钟,51单片机,stm32,430等等,因为寄存器是由D触发器组成的,往触发器里面写东西,前提条件是有时钟输入。stm32是低功耗,他将所有的门都默认设置为disable(不使能),在你需要用哪个门的时候,开哪个门就可以,也就是说用到什么外设,只要打开对应外设的时钟就可以, 其他的没用到的可以还是disable(不使能),这样耗能就会减少。 4 k7 _+ [: G8 l( r Q:为什么 STM32 要有多个时钟源呢? . X/ ~8 R* J* L" d, z 因为首 先 STM32 本身非常复杂,外设非常的多,但是并不是所有外设都需要系统时钟这么高的频率, 比如看门狗以及 RTC 只需要几十 k 的时钟即可。同一个电路,时钟越快功耗越大,同时抗电磁 干扰能力也会越弱,所以对于较为复杂的 MCU 一般都是采取多时钟源的方法来解决这些问题。 + e3 N1 V: e# t; U2 F 而相对应的外设功能所使用的时钟 在stm32f4xx.h 中即可查看到( v3 z; O: y c1 X ; u. k2 i. ^: Q2 \2 k3 l RCC_AHB1 e3 |- O6 e( r" b" W! G$ y; R% H x% i
RCC_APB1
3选择要控制的 GPIO 引脚
4设置所选引脚的模式( D" ?: S+ m* |1 N$ {+ S
5 设定所选引脚的输出类型
只有输出模式才需要配置,输入模式下不需要配置 * ?9 O5 Z) X# [/ B3 | 6 设定所选管脚的速度6 S' q- G+ [3 t5 i% C3 T
7 设定所选管脚的上拉与下拉
8初始化GPIO
GPIO的初始化(F1) F4的初始化相较于F1系列有了很大的改变,在配置F1系列时,结构体只有三个参数 & ^# j5 s; W. e, q; L2 d 6 [8 G3 q9 T4 r ; u6 x' s# w5 {- R: O! y+ k. `: H GPIO_InitTypeDef 类型的结构体) D/ V% U) ?0 F+ s7 p; F5 _2 W
所选管脚的速度8 X" Q3 m+ {) d4 t6 X$ T& P
所选管脚的8种模式
区别:) x: d7 c% |1 R% y6 g5 _' d 1 y. [' w. h, T0 Z! L F1(M-3)系列管脚速度只有三种模式 并且管脚的模式配置八种模式全部都在一起定义,直接设置即可 : Q" v9 Q- j; a1 W1 [ 总归还是大同小异,不做过多介绍,看下下方配置即可
' l$ G, _9 c# b1 \' S1 o 0 W ~# }+ z% V/ Q0 s1 T |2 x |
【福利三:雨露均沾·逢7狂欢】之四:用一个定时器同步另外两个定时器输出PWM
【逢7发帖赢大礼】STM32开发之WIFI实时时钟
【逢7发帖赢大礼】STM32开发之指纹识别!
【逢7发帖赢大礼】STM32开发之环境空气质量监测
【逢7发帖赢大礼】STM32开发之人体实时运动信息监测!
【逢7发帖赢大礼】STM32开发之IC门禁卡UID读取方法!
【逢7发帖赢大礼】全网最简单的Arduino_STM32开发环境搭建教程!
STM32F4中文用户手册
STM32F400、STM32F402 Cortex-M4超值单片机
SPI 高温读错最后一位?STM32F42xx 官方根治方案
微信公众号
手机版