STMCU小助手
发布时间:2021-12-6 10:37
|
1 GPIO简介4 m" b# _3 R, z8 Z" T; U GPIO,即通用I/O(输入/输出)端口,是STM32可控制的引脚。STM32芯片的GPIO引脚与外部设备连接起来,可实现与外部通讯、控制外部硬件或者采集外部硬件数据的功能。( ^ w5 h& k8 A 8 [- f. ^) e( u7 m# M STM32F407有7组IO。分别为GPIOA~GPIOG,每组IO有16个IO口,共有112个IO口 通常称为 PAx、PBx、PCx、PDx、PEx、PFx、PGx,其中x为0-15。 并且F4系列是基于Cortex-M4内核 ; ?/ X/ S) C h" E0 V8 ^6 Q GPIO的复用: STM32F4 有很多的内置外设,这些外设的外部引脚都是与 GPIO 共用的。也就是说,一个引脚可以有很多作用,但是默认为IO口,如果想使用一个 GPIO内置外设的功能引脚,就需要GPIO的复用,那么当这个 GPIO 作为内置外设使用的时候,就叫做复用。 比如说串口 就是GPIO复用为串口8 \2 }3 [2 Z8 [+ t+ D5 E 4 ~7 w. A7 h/ o- z6 l 2 GPIO的工作模式 1、4种输入模式 (1)GPIO_Mode_IN_FLOATING 浮空输入 (2)GPIO_Mode_IPU 上拉输入! F4 U9 ?6 f9 \0 k& p (3)GPIO_Mode_IPD 下拉输入 (4)GPIO_Mode_AIN 模拟输入 " i5 r4 J7 {( D% `, K8 B6 ^8 N 2、4种输出模式 4 l( `5 C. e/ a+ ^2 U (5)GPIO_Mode_Out_OD 开漏输出(带上拉或者下拉) (6)GPIO_Mode_AF_OD 复用开漏输出(带上拉或者下拉) (7)GPIO_Mode_Out_PP 推挽输出(带上拉或者下拉) (8)GPIO_Mode_AF_PP 复用推挽输出(带上拉或者下拉)& w P3 [7 a; o% E& M9 |6 a: l s% C0 i4 ~ h, b" s+ g 3、4种最大输出速度 (1)2MHZ (低速) (2)25MHZ (中速)& \# k: W9 x+ J& u% u8 t. u2 w. N) J (3)50MHZ (快速)" s ^% K7 ]% J (4)100MHZ (高速) 5 M0 C1 N! X3 `# x2 u 关于他们的定义,都在 stm32f4xx_gpio.h 中,都为结构体形式的定义1 s' G$ b7 E: |% \' L 3 GPIO框图剖析 0 K: q% Y" L% O1 ]' S
我们所用到的每一个GPIO其内部结构都是这样,分别对应着GPIO的八种模式 这里我们简单的介绍下:" n" |. I2 B2 ~ ; y! v( W: S+ w6 G+ d/ j 保护二极管: IO引脚上下两边两个二极管用于防止引脚外部过高、过低的电压输入,当引脚电压高于VDD_FT时,上方的二极管导通,当引脚电压低于VSS时,下方的二极管导通,防止不正常电压引入芯片导致芯片烧毁 7 B" X5 R3 Q2 ?- u) O 上拉、下拉电阻:控制引脚默认状态的电压,开启上拉的时候引脚默认电压为高电平,开启下拉的时候引脚默认电压为低电平 TTL施密特触发器:基本原理是当输入电压高于正向阈值电压,输出为高;当输入电压低于负向阈值电压,输出为低;IO口信号经过触发器后,模拟信号转化为0和1的数字信号 也就是高低电平 并且是TTL电平协议 这也是为什么STM32是TTL电平协议的原因& _5 r3 w3 n r+ l3 p P-MOS管和N-MOS管:信号由P-MOS管和N-MOS管,依据两个MOS管的工作方式,使得GPIO具有“推挽输出”和“开漏输出”的模式 P-MOS管高电平导通,低电平关闭,下方的N-MOS低电平导通,高电平关闭 注: VDD_FT 代表IO口,兼容3.3V和5V,如果没有标注“FT”,就代表着不兼容5V q, N. a) y8 H& M/ y 在芯片数据手册的引脚定义中,会看到有“I/O电平”一列 有FT即为支持5V ( H' w. J# y+ s3 v
" l- N) |1 Z/ c$ z% X- S/ W 4 GPIO的八种工作模式剖析:6 v; `8 H2 ]% s) u8 @( B7 v! O0 G 浮空输入模式
# d6 T2 R% m4 y J 浮空输入模式下,I/O端口的电平信号直接进入输入数据寄存器。MCU直接读取I/O口电平,I/O的电平状态是不确定的,完全由外部输入决定;如果在该引脚悬空(在无信号输入)的情况下,读取该端口的电平是不确定的。 (接用电压表测量其引脚电压为1点几伏,这是个不确定值) 以用来做KEY识别 ( i4 s5 M6 o: T5 K- S, E0 H 上拉输入模式 " h% N4 ]9 y" ]" ~
IO内部接上拉电阻,此时如果IO口外部没有信号输入或者引脚悬空,IO口默认为高电平 如果I/O口输入低电平,那么引脚就为低电平,MCU读取到的就是低电平. g( u3 I* U' B1 X: ? * \2 P3 B1 _+ u/ T# z$ z8 U& P% L STM32的内部上拉是"弱上拉",即通过此上拉输出的电流是很弱的,如要求大电流还是需要外部上拉。 下拉输入模式 J+ Z4 \8 \5 H$ f0 ^ ( \+ L/ `0 e/ |8 ~' q
IO内部接下拉电阻,此时如果IO口外部没有信号输入或者引脚悬空,IO口默认为低电平 如果I/O口输入高电平,那么引脚就为高电平,MCU读取到的就是高电平- M& U. e% h; B9 a: [ 模拟输入模式) T5 G- C8 t4 z9 }: n7 x' q9 \6 _: G6 I * ~9 ? Y" U$ r; x$ b# O% k
4 z }) @( V' U2 g* Y Y 当GPIO引脚用于ADC采集电压的输入通道时,用作"模拟输入"功能,此时信号不经过施密特触发器,直接直接进入ADC模块,并且输入数据寄存器为空 ,CPU不能在输入数据寄存器上读到引脚状态 5 z/ d3 J% I8 R5 F" J: T, d 当GPIO用于模拟功能时,引脚的上、下拉电阻是不起作用的,这个时候即使配置了上拉或下拉模式,也不会影响到模拟信号的输入输出6 O9 P# ?& |4 b5 k: |7 { ) t! P2 u( ?+ m. ]. p 除了 ADC 和 DAC 要将 IO 配置为模拟通道之外其他外设功能一律 要配置为复用功能模式, 开漏输出模式(带上拉或者下拉)/ g Z$ S% u1 F1 q4 y8 |: @ 3 E8 {1 I6 W# T# T0 y' c; z) A6 t
+ B, x5 i7 W _, }; x* j 在开漏输出模式时,只有N-MOS管工作,如果我们控制输出为0,低电平,则P-MOS管关闭,N-MOS管导通,使输出低电平,I/O端口的电平就是低电平,若控制输出为1时,高电平,则P-MOS管和N-MOS管都关闭,输出指令就不会起到作用,此时I/O端口的电平就不会由输出的高电平决定,而是由I/O端口外部的上拉或者下拉决定 如果没有上拉或者下拉 IO口就处于悬空状态 " | r2 t% e0 d- D 并且此时施密特触发器是打开的,即输入可用,通过输入数据寄存器GPIOx_IDR可读取I/O的实际状态。,I/O口的电平不一定是输出的电平
在推挽输出模式时,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口的电平一定是输出的电平 1 q2 e7 a( i! u x! o 6 D* M, C+ V8 N; y7 }( j" M 复用开漏输出(带上拉或者下拉) ) Y. T% V% u+ b/ c, s4 F
' g8 `* W9 q8 ~9 p6 e' J GPIO复用为其他外设,输出数据寄存器GPIOx_ODR无效; 输出的高低电平的来源于其它外设,施密特触发器打开,输入可用,通过输入数据寄存器可获取I/O实际状态 除了输出信号的来源改变 其他与开漏输出功能相同 2 U! W! q2 h& B2 T$ k4 W" B" P 复用推挽输出(带上拉或者下拉)
GPIO复用为其他外设(如 I2C),输出数据寄存器GPIOx_ODR无效; 输出的高低电平的来源于其它外设,施密特触发器打开,输入可用,通过输入数据寄存器可获取I/O实际状态 除了输出信号的来源改变 其他与开漏输出功能相同; a2 @2 [( j/ b6 m& @. k( N6 i9 J # g! |. i' a# |+ \& P' {8 X 开漏输出和推挽输出的区别:2 s0 _7 F2 C o) P7 d 2 H4 h; o. ]0 u7 H" p+ h/ w 推挽输出: 可以输出强高低电平,连接数字器件 推挽结构一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止. , {0 a" M1 q$ ?# t; P 开漏输出:/ v2 \6 }. W/ _# @ , `2 H% E. L; ?6 W9 q8 M 可以输出强低电平,高电平得靠外部电阻拉高。输出端相当于三极管的集电极. 需要外接上拉电阻,才能实现输出高电平 合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内);! U `! c4 [! m% W' b4 I 在使用任何一种开漏模式时,都需要接上拉电阻,否则只能输出低电平 * V; Z9 \& l& ]8 F1 e; k" x
推挽输出电路: 其中IN端输出高电平时下面的PNP三极管截止,而上面NPN三极管导通,输出电平VS+;当IN端输出低电平时则恰恰相反,PNP三极管导通,输出和地相连,为低电平 9 T' ] D7 [0 W ; y; N5 V$ j: D6 k2 W 开漏输出电路:IN端输出低电平时,三极管导通,使输出接地,IN端输出高电平时,三极管截止,所以引脚既不输出高电平,也不输出低电平,为高阻态。为正常使用时必须接上拉电阻, 在STM32中选用IO模式:6 h, H& p* Z8 b3 L& A% h' x3 Z/ E5 [ $ O. X$ o: I+ v! e% E% i4 R 上拉输入、下拉输入可以用来检测外部信号;例如,按键等; 模拟输入 ——应用ADC模拟输入,或者低功耗下省电5 ?! v& p+ A' _: _2 I 开漏输出一般应用在I2C、SMBUS通讯等需要"线与"功能的总线电路中。9 b# k& p1 b0 P3 n/ Y 推挽输出模式一般应用在输出电平为0和3.3伏而且需要高速切换开关状态的场合。在STM32的应用中,除了必须用开漏模式的场合,我们都习惯使用推挽输出模式。 复用功能的推挽输出_AF_PP ——片内外设功能(I2C的SCL,SDA) 复用功能的开漏输出_AF_OD——片内外设功能(TX1,MOSI,MISO.SCK.SS)4 m1 w2 J7 Z' S9 p F4系列与F1系列区别: 本质上的区别是F4系列采用了Cortex-M4内核 而F1系列采用Cortex-M3内核8 T B1 s O p+ Z0 o F1系列(M3)IO口基本结构:5 d+ Y+ F% i" l* B# V8 K. G. {& K : ^$ g. U4 I5 V$ n3 e8 q: c k9 {
4 E- ^' d3 o5 S* q# r F4系列(M4)IO口基本结构: # A) r; ]; Q1 l* f! K5 [; F/ {
F4系列设计的更加高级与人性化,他将外部上下拉电阻转移到了输出/输入驱动器外部,使得输出模式下也可以实现内部上拉与下拉,方便了用户的使用,增加了灵活性 GPIO的初始化(F4)4 k: y+ d: R$ S& ^" Y 这里我们以初始化LED为例; Z2 ^9 ]+ h4 D5 c# C' u0 f6 ^( E % }, _) w* A4 }7 K# T$ n 1.定义一个 GPIO_InitTypeDef 类型的结构体: r. g. |: q( ~& ]
5 u% x0 m0 ]0 d7 l6 @! f
1 T/ ?* M7 [1 P& s5 c, z# D7 ` 2开启 LED 相关的 GPIO 外设时钟 5 G& J% V s3 W- Z7 r" T8 t
Q:为什么要设置时钟? o, d( \: ~, G" L E- `2 ] 任何外设都需要时钟,51单片机,stm32,430等等,因为寄存器是由D触发器组成的,往触发器里面写东西,前提条件是有时钟输入。stm32是低功耗,他将所有的门都默认设置为disable(不使能),在你需要用哪个门的时候,开哪个门就可以,也就是说用到什么外设,只要打开对应外设的时钟就可以, 其他的没用到的可以还是disable(不使能),这样耗能就会减少。0 t% p$ }0 F0 G* M) G Q:为什么 STM32 要有多个时钟源呢? ' f7 K! N1 {/ p! ^# y5 p, @ 因为首 先 STM32 本身非常复杂,外设非常的多,但是并不是所有外设都需要系统时钟这么高的频率, 比如看门狗以及 RTC 只需要几十 k 的时钟即可。同一个电路,时钟越快功耗越大,同时抗电磁 干扰能力也会越弱,所以对于较为复杂的 MCU 一般都是采取多时钟源的方法来解决这些问题。 7 j- D2 P/ N% U ( W- }: i$ ~: o' S 而相对应的外设功能所使用的时钟 在stm32f4xx.h 中即可查看到6 B8 Y4 B Y3 ]7 b, U. l& G& q0 o 8 f* |) h# I* ?3 u2 X RCC_AHB1" A( e3 r8 o& T! Y
RCC_APB1. t# g$ K- r$ H5 V7 {5 S 6 H7 ?$ n$ a* E
6 l/ j* l' D! @% m2 y1 k 3选择要控制的 GPIO 引脚 $ `, \4 Z2 Y" }. }( n/ |# z
可选引脚为0-15 一组IO口有16个引脚
4设置所选引脚的模式* Z5 N6 p6 C! v" A/ f
引脚的模式共有四种,分别为输入,输出,复用,和模拟模式& N( }+ m9 M! S ( a& ~! |+ V' i% g7 K E! O( A2 o+ L
. [* x% g, G4 I! O p# I& J 5 设定所选引脚的输出类型7 E& @! ^2 D; t5 }6 n
输出模式有两种:推挽输出和开漏输出 只有输出模式才需要配置,输入模式下不需要配置 6 设定所选管脚的速度6 b% h- S4 F( D) Z; B' E 4 H& ]( `0 n8 V: P
7 设定所选管脚的上拉与下拉% U: _# O1 n) J: y% t2 V ! T5 e1 F. c0 F# G
可设置为:上拉,下拉,与浮空4 t: k. a7 e) U. h- u % z: h3 i' c7 |0 \1 s/ _$ i8 K
. Q; p3 v$ g, M2 T) \0 c" K, u0 L 8初始化GPIO' H' O4 V: a3 |' l; J2 B; n/ N
GPIO_Init() 是官方配置的初始化函数 第一个参数是GPIOX 第二个参数是结构体所对应GPIO各种参数的配置% H2 G& B% @+ ]5 p9 n! C GPIO的初始化(F1)1 K# _' I: E9 C' X" B6 J4 K F4的初始化相较于F1系列有了很大的改变,在配置F1系列时,结构体只有三个参数 8 }: z& @" m2 j% i! A+ [. X GPIO_InitTypeDef 类型的结构体6 x$ C6 F( j1 \, ]; L
3 Q {2 y j; `& k 所选管脚的速度- R6 o6 [9 P6 p& l
" u' R8 |3 @2 B; r& \) @, v" j 所选管脚的8种模式
区别: F1(M-3)系列管脚速度只有三种模式 并且管脚的模式配置八种模式全部都在一起定义,直接设置即可! L( m$ i8 x0 K) {. g u/ |; a* x9 b4 ?/ Y 总归还是大同小异,不做过多介绍,看下下方配置即可 9 q6 Z8 d9 A( N( d* I+ _& q. c1 v3 q
. m4 E# E. X7 `+ b% O3 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 官方根治方案
微信公众号
手机版