STMCU小助手
发布时间:2021-12-6 10:37
|
1 GPIO简介7 ` C2 n, n. f+ @ GPIO,即通用I/O(输入/输出)端口,是STM32可控制的引脚。STM32芯片的GPIO引脚与外部设备连接起来,可实现与外部通讯、控制外部硬件或者采集外部硬件数据的功能。# H9 s2 _ Z% O S7 K8 Q0 z) M( F STM32F407有7组IO。分别为GPIOA~GPIOG,每组IO有16个IO口,共有112个IO口 通常称为 PAx、PBx、PCx、PDx、PEx、PFx、PGx,其中x为0-15。 并且F4系列是基于Cortex-M4内核 $ g$ L; ~) R" b( i4 s0 t. N GPIO的复用: / o+ Q8 i# W. F7 G5 W) F) J9 A STM32F4 有很多的内置外设,这些外设的外部引脚都是与 GPIO 共用的。也就是说,一个引脚可以有很多作用,但是默认为IO口,如果想使用一个 GPIO内置外设的功能引脚,就需要GPIO的复用,那么当这个 GPIO 作为内置外设使用的时候,就叫做复用。 比如说串口 就是GPIO复用为串口 2 GPIO的工作模式) B/ e. y" u2 n" m6 P 1、4种输入模式 (1)GPIO_Mode_IN_FLOATING 浮空输入* q+ x# _- q4 o" Y8 m5 b: U! u (2)GPIO_Mode_IPU 上拉输入& Q5 f1 x9 Y: ]3 ^2 p( | (3)GPIO_Mode_IPD 下拉输入1 e! l4 J A! e# v9 L X0 Y (4)GPIO_Mode_AIN 模拟输入 2、4种输出模式 (5)GPIO_Mode_Out_OD 开漏输出(带上拉或者下拉)% |) p7 D ] o* B' F9 O& | (6)GPIO_Mode_AF_OD 复用开漏输出(带上拉或者下拉) (7)GPIO_Mode_Out_PP 推挽输出(带上拉或者下拉) (8)GPIO_Mode_AF_PP 复用推挽输出(带上拉或者下拉)- a0 t$ X3 r! A `9 M) D6 w * ^' X/ x4 h) F/ G; n! z 3、4种最大输出速度 (1)2MHZ (低速)0 {; b: h/ P3 F% H (2)25MHZ (中速) (3)50MHZ (快速) W+ [7 E* V. E+ p) [% t (4)100MHZ (高速) 0 w5 y$ _" e# z4 p/ V 关于他们的定义,都在 stm32f4xx_gpio.h 中,都为结构体形式的定义 % [) J* j8 Z" v* l9 G k, u 3 GPIO框图剖析 T3 N- t7 s" b9 k0 Y
我们所用到的每一个GPIO其内部结构都是这样,分别对应着GPIO的八种模式 这里我们简单的介绍下: 保护二极管: IO引脚上下两边两个二极管用于防止引脚外部过高、过低的电压输入,当引脚电压高于VDD_FT时,上方的二极管导通,当引脚电压低于VSS时,下方的二极管导通,防止不正常电压引入芯片导致芯片烧毁 上拉、下拉电阻:控制引脚默认状态的电压,开启上拉的时候引脚默认电压为高电平,开启下拉的时候引脚默认电压为低电平6 r/ @7 q' G9 d0 K+ z/ q6 A TTL施密特触发器:基本原理是当输入电压高于正向阈值电压,输出为高;当输入电压低于负向阈值电压,输出为低;IO口信号经过触发器后,模拟信号转化为0和1的数字信号 也就是高低电平 并且是TTL电平协议 这也是为什么STM32是TTL电平协议的原因 P-MOS管和N-MOS管:信号由P-MOS管和N-MOS管,依据两个MOS管的工作方式,使得GPIO具有“推挽输出”和“开漏输出”的模式 P-MOS管高电平导通,低电平关闭,下方的N-MOS低电平导通,高电平关闭 注: VDD_FT 代表IO口,兼容3.3V和5V,如果没有标注“FT”,就代表着不兼容5V + s( b) b. E. q% r! l. z 在芯片数据手册的引脚定义中,会看到有“I/O电平”一列 有FT即为支持5V + T' e3 W( u+ b9 @: ?
+ a" o& J* S5 H% j- ?+ y' v 4 GPIO的八种工作模式剖析:- C3 M& G; ~ n. k- T0 l 浮空输入模式/ Y* M5 ?5 ]% J* f8 B+ K / ]( K6 F" j9 \4 w8 F
& R; q8 g3 E. q1 d& v7 c 浮空输入模式下,I/O端口的电平信号直接进入输入数据寄存器。MCU直接读取I/O口电平,I/O的电平状态是不确定的,完全由外部输入决定;如果在该引脚悬空(在无信号输入)的情况下,读取该端口的电平是不确定的。 (接用电压表测量其引脚电压为1点几伏,这是个不确定值) 以用来做KEY识别 上拉输入模式 + b! d8 ^: [# L
1 m# r! N' w* H) ]0 K* u IO内部接上拉电阻,此时如果IO口外部没有信号输入或者引脚悬空,IO口默认为高电平 如果I/O口输入低电平,那么引脚就为低电平,MCU读取到的就是低电平: m z- M0 i: g% \ STM32的内部上拉是"弱上拉",即通过此上拉输出的电流是很弱的,如要求大电流还是需要外部上拉。 下拉输入模式6 D: v- r$ A; H& T7 b5 ~
$ U9 D/ z7 ~+ U' |, g. _ s IO内部接下拉电阻,此时如果IO口外部没有信号输入或者引脚悬空,IO口默认为低电平 如果I/O口输入高电平,那么引脚就为高电平,MCU读取到的就是高电平& @8 G. ^- A! [ ^+ @ 模拟输入模式 * ^( c6 e* ]1 Z! r% _
当GPIO引脚用于ADC采集电压的输入通道时,用作"模拟输入"功能,此时信号不经过施密特触发器,直接直接进入ADC模块,并且输入数据寄存器为空 ,CPU不能在输入数据寄存器上读到引脚状态 / E2 ~( `+ G+ ]( G6 D 当GPIO用于模拟功能时,引脚的上、下拉电阻是不起作用的,这个时候即使配置了上拉或下拉模式,也不会影响到模拟信号的输入输出 : J* R7 b3 n1 u5 L3 D 除了 ADC 和 DAC 要将 IO 配置为模拟通道之外其他外设功能一律 要配置为复用功能模式, 开漏输出模式(带上拉或者下拉)" L/ p" O. m. m0 Y. {2 m7 p 8 w- ]! o3 K [8 y
2 t6 ?# {) p/ \( K 在开漏输出模式时,只有N-MOS管工作,如果我们控制输出为0,低电平,则P-MOS管关闭,N-MOS管导通,使输出低电平,I/O端口的电平就是低电平,若控制输出为1时,高电平,则P-MOS管和N-MOS管都关闭,输出指令就不会起到作用,此时I/O端口的电平就不会由输出的高电平决定,而是由I/O端口外部的上拉或者下拉决定 如果没有上拉或者下拉 IO口就处于悬空状态% \) t$ i* {: V* A ! X8 e9 `( V, s. B5 q7 d 并且此时施密特触发器是打开的,即输入可用,通过输入数据寄存器GPIOx_IDR可读取I/O的实际状态。,I/O口的电平不一定是输出的电平
, F2 R8 i5 ?* h) A1 t' F( z 在推挽输出模式时,N-MOS管和P-MOS管都工作,如果我们控制输出为0,低电平,则P-MOS管关闭,N-MOS管导通,使输出低电平,I/O端口的电平就是低电平,若控制输出为1 高电平,则P-MOS管导通N-MOS管关闭,使输出高电平,I/O端口的电平就是高电平, 外部上拉和下拉的作用是控制在没有输出时IO口电平 8 a/ {2 I# \6 n9 U: r& G. m X 此时施密特触发器是打开的,即输入可用,通过输入数据寄存器GPIOx_IDR可读取I/O的实际状态。I/O口的电平一定是输出的电平 复用开漏输出(带上拉或者下拉); U7 S$ t$ [ p- n: q- H0 H
4 O7 D( c" x4 T# d4 m GPIO复用为其他外设,输出数据寄存器GPIOx_ODR无效; 输出的高低电平的来源于其它外设,施密特触发器打开,输入可用,通过输入数据寄存器可获取I/O实际状态 除了输出信号的来源改变 其他与开漏输出功能相同, P# N |) Y M& w/ D 5 Q+ E4 B; F; q1 Z$ c 复用推挽输出(带上拉或者下拉)7 f. ~- X' j: Y
- R8 h( G. K3 F8 S3 Q GPIO复用为其他外设(如 I2C),输出数据寄存器GPIOx_ODR无效; 输出的高低电平的来源于其它外设,施密特触发器打开,输入可用,通过输入数据寄存器可获取I/O实际状态 除了输出信号的来源改变 其他与开漏输出功能相同 7 d! }9 M7 O* y2 O$ U 开漏输出和推挽输出的区别: 推挽输出:5 e! B) c: O# v 7 K4 `7 i$ b/ Q 可以输出强高低电平,连接数字器件 : B1 K9 F9 I7 t! ? 推挽结构一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止. 开漏输出: 可以输出强低电平,高电平得靠外部电阻拉高。输出端相当于三极管的集电极. 需要外接上拉电阻,才能实现输出高电平 合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内);) r7 s+ [% V0 m, t 在使用任何一种开漏模式时,都需要接上拉电阻,否则只能输出低电平 0 ~; D+ y& o! F% E- z
推挽输出电路: 其中IN端输出高电平时下面的PNP三极管截止,而上面NPN三极管导通,输出电平VS+;当IN端输出低电平时则恰恰相反,PNP三极管导通,输出和地相连,为低电平 e7 d& N8 E* |/ y$ t 开漏输出电路:IN端输出低电平时,三极管导通,使输出接地,IN端输出高电平时,三极管截止,所以引脚既不输出高电平,也不输出低电平,为高阻态。为正常使用时必须接上拉电阻,% W4 l- [0 n7 x% y @ 6 J/ i4 B- G- f* L# a 在STM32中选用IO模式:& i, u; u+ `+ k- |7 B( @1 p 上拉输入、下拉输入可以用来检测外部信号;例如,按键等;5 {0 y- m5 Y1 N* R6 Y9 H! p 模拟输入 ——应用ADC模拟输入,或者低功耗下省电 开漏输出一般应用在I2C、SMBUS通讯等需要"线与"功能的总线电路中。- M6 v4 X( M7 q 推挽输出模式一般应用在输出电平为0和3.3伏而且需要高速切换开关状态的场合。在STM32的应用中,除了必须用开漏模式的场合,我们都习惯使用推挽输出模式。 复用功能的推挽输出_AF_PP ——片内外设功能(I2C的SCL,SDA)+ ~2 [# F/ d( e0 w5 n, b% C 复用功能的开漏输出_AF_OD——片内外设功能(TX1,MOSI,MISO.SCK.SS) F4系列与F1系列区别: 本质上的区别是F4系列采用了Cortex-M4内核 而F1系列采用Cortex-M3内核 F1系列(M3)IO口基本结构: 6 Z' z+ `1 M2 g+ w5 W: z2 {/ _+ b
+ Z& l0 y, `9 r0 L- \* ?: K F4系列(M4)IO口基本结构:1 C: z5 s3 t7 ?/ O* b- G% S0 i 6 t. x4 ]: K* r1 i6 _: F7 |, T
& p5 J$ K6 Q9 r% T% w$ R# S F4系列设计的更加高级与人性化,他将外部上下拉电阻转移到了输出/输入驱动器外部,使得输出模式下也可以实现内部上拉与下拉,方便了用户的使用,增加了灵活性4 J' H4 L) x, X ~* h( \ # y4 v# P9 U" S9 L9 ~: F& Y% T GPIO的初始化(F4)9 n& ?/ a; j1 e2 g* ^+ ~ 这里我们以初始化LED为例 6 e+ C6 r9 l2 }6 m 1.定义一个 GPIO_InitTypeDef 类型的结构体( L" h( J3 G$ [6 o; s2 M
) s, X6 `9 A" E2 F$ i 8 b3 j- F* H+ b3 J; o7 R 2开启 LED 相关的 GPIO 外设时钟9 R" v& Y9 \/ \. @
Q:为什么要设置时钟? ' c" K: P3 l) Q) M 任何外设都需要时钟,51单片机,stm32,430等等,因为寄存器是由D触发器组成的,往触发器里面写东西,前提条件是有时钟输入。stm32是低功耗,他将所有的门都默认设置为disable(不使能),在你需要用哪个门的时候,开哪个门就可以,也就是说用到什么外设,只要打开对应外设的时钟就可以, 其他的没用到的可以还是disable(不使能),这样耗能就会减少。# n f6 t8 N( R k# Q4 O, |* a. [! j, ? Q:为什么 STM32 要有多个时钟源呢?3 N8 R, c: Y. ~6 g" q3 ]4 G 因为首 先 STM32 本身非常复杂,外设非常的多,但是并不是所有外设都需要系统时钟这么高的频率, 比如看门狗以及 RTC 只需要几十 k 的时钟即可。同一个电路,时钟越快功耗越大,同时抗电磁 干扰能力也会越弱,所以对于较为复杂的 MCU 一般都是采取多时钟源的方法来解决这些问题。! X7 W- A+ \% Q1 o3 _' @ ; k/ k: o) V, Q) L8 t- ] 4 D. _5 {* x/ Y( j, V 而相对应的外设功能所使用的时钟 在stm32f4xx.h 中即可查看到 & X, Y$ h; I3 Y9 a RCC_AHB1. v' |0 `0 P) K% N2 \; ~) J( B : C/ L/ r& [ T. A6 v/ G+ N
RCC_APB1$ T( V6 \8 f6 w+ a" ?$ P! Z+ j 2 N. [" K# G3 c
/ o# X( l. D4 x: ^4 D; a' F 3选择要控制的 GPIO 引脚 ( C- m2 M8 `' y; S' R) R$ Z
可选引脚为0-15 一组IO口有16个引脚: a g0 |2 W6 Z6 X: d8 | v
4设置所选引脚的模式
引脚的模式共有四种,分别为输入,输出,复用,和模拟模式 3 I1 p- N F' x9 ?, F! `
, K6 G% `, t J" H8 V 3 x1 T8 j* F0 F# y; ~! G3 I( ^ 5 设定所选引脚的输出类型 6 X1 G6 ?( L. e9 |! e9 r' }
输出模式有两种:推挽输出和开漏输出 , K I3 f$ Y' D; {7 N A+ Q & _. S5 ^7 k/ { # v7 W. Z& K; O( z 只有输出模式才需要配置,输入模式下不需要配置 & B7 L* W( H5 u; D3 R- Z; [ 6 设定所选管脚的速度& ~- D' u8 B( _" @ f1 T0 }2 R3 |/ X% y
7 设定所选管脚的上拉与下拉
可设置为:上拉,下拉,与浮空 9 e6 u/ s0 n& [) l0 \7 J
8初始化GPIO
GPIO_Init() 是官方配置的初始化函数 第一个参数是GPIOX 第二个参数是结构体所对应GPIO各种参数的配置. d8 v+ r' T5 t4 a- ?) k7 Y GPIO的初始化(F1) F4的初始化相较于F1系列有了很大的改变,在配置F1系列时,结构体只有三个参数 / X7 x: b2 b- L2 Z. R3 L GPIO_InitTypeDef 类型的结构体' a0 @& X, L0 V8 k9 e+ V 7 u7 J, g$ F M' c: f9 N+ X
- `5 A0 k5 D2 ^. ? 所选管脚的速度 ) B# G: h: j$ U8 u6 G
0 B4 D1 G% v( j( n+ Y- [6 P 所选管脚的8种模式) P. H+ _/ b' I
区别: 1 {, z: p0 ?* f! {+ j& R, B F1(M-3)系列管脚速度只有三种模式 并且管脚的模式配置八种模式全部都在一起定义,直接设置即可 总归还是大同小异,不做过多介绍,看下下方配置即可
|
【福利三:雨露均沾·逢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 官方根治方案
微信公众号
手机版