STM32 GPIO口基本结构和工作方式

STM32F103ZET6:

共144个引脚,7组IO口,每组16个IO口

7*16=12个IO口(这7组IO口分别为GPIOA,GPIOB...GPIOG)

例如:PGPIOA包含PA0,PA1,PA2...PA15,每组16个IO口

 

IO口的基本结构和工作方式:

1.STM32F1系列IO口基本结构(IO口内部电路结构)

右侧IO引脚部分为芯片暴露在外部的引脚,每个引脚在数据手册都有说明是否支持或识别5V电压

 

GPIO的8种工作方式:

4种输入模式:

输入浮空,输入上拉,输入下拉,输入模拟

4种输出模式:

开漏输出,开漏复用功能,推挽输出,推挽复用功能

3种最大翻转速度:

2MHZ/10MHZ/50MHZ

 

8种工作方式讲解:

一. GPIO输入工作模式:

 

1.输入浮空模式:

①外部通过IO口输入电平,外部电平通过上下拉部分(浮空模式下都关闭,既无上拉也无下拉电阻)

②传输到施密特触发器(此时施密特触发器为打开状态)

③继续传输到输入寄存器IDR

④CPU通过读输入数据寄存器IDR实现读取外部输入电平值,在输入浮空模式下可以读取外部输入电平

 

2.输入上拉模式:

输入上拉模式和输入浮空模式相比较不同之处在于内部有一个上拉电阻连接到VDD(输入上拉模式下,上拉电阻开关接通,阻值约为30~50K)

外部输入通过上拉电阻,施密特触发器存入输入数据寄存器IDR,被CPU读取。

 

3.输入下拉模式:

和输入浮空模式相比较,不同之处在于内部有一个下拉电阻连接到VSS(输入下拉模式下,下拉电阻开关接通,阻值约为30~50K),外部输入通过下拉电阻,施密特触发器存入输入数据寄存器IDR,被CPU读取。

 

4.输入模拟模式:

上拉和下拉部分均为关闭状态,AD转换-模拟量转换为数字量,斯密特触发器为截至状态,通过模拟输入通道输入到CPU,IO口外部电压为模拟量,电压形式为非电平形式,作为模拟输入范围一般为0~3.3V

 

二.GPIO输出工作模式:

1.开漏输出模式

①CPU写入位设置/清除寄存器BSRR,映射到输出寄存器ODR

②联通到输出控制电路,也就是ODR的电平

③ODR电平通过输出控制电路进入N-MOS管

ODR输出1:N-MOS截止,IO端口电平不会由ODR输出决定,而由外部上拉/下拉决定,在输出状态下,输出的电平可以被读取,数据存入输入数据寄存器,由CPU读取,实现CPU读取输出电平,所以当N-MOS截止时,若读取到输出电平为1,不一定就是输出的1,也有可能是外部上拉产生的1。

ODR输出0:N-MOS开启,IO端口电平被N-MOS管拉到VSS,使IO输出低电平,此时输出的低电平同样可以被CPU读取到

也就是只能输出0和高阻态,若为高阻态Z时,此时输出电压由外部上拉电阻决定。

 

2.开漏复用输出模式

与开漏输出模式唯一区别在于输出控制电平之前电平的来源,开漏输出模式的输出电平是由CPU写入输出数据寄存器控制的,开漏复用输出模式的输出电平是由复用功能外设输出决定的。其他与开漏输出相似。

控制电路输出1:N-MOS截止,IO口电平由外部上拉/下拉决定

控制电路输出0:N-MOS开启,IO口输出低电平

 

3.推挽输出

 

与开漏相比,输出控制寄存器部分相同,输出驱动器部分加入了P-MOS管部分。

输出控制电路输出1:P-MOS管导通,N-MOS管截止,被上拉到高电平,IO口输出为高电平1

输出控制电路输出0:P-MOS管截止,N-MOS管导通,被下拉到低电平,IO口输出为低电平0

同时IO口输出的电平可以通过输出电路读取

 

4.推挽复用输出

与推挽输出模式唯一区别在于输出控制电路之前电平的来源。

开漏输出模式的输出电平是CPU写入输出数据寄存器的,推挽复用输出模式的输出电平是由复用功能外设输出决定的。

 

推挽输出和开漏输出的区别:

推挽输出:可以输出强高/强低电平,可以连接数字器件

开漏输出:只输出强低电平,高电平需要外接上拉电阻,适合做电流型驱动,吸收电流能力较强,20mA以内。

 

STM32 IO口相关寄存器:

每组GPIO包含系列7个寄存器,7组GPIO共包含7*7 49个寄存器

两个32位配置寄存器: GPIOx_CRL低16位 GPIOx_CRH高16位

两个32位数据寄存器:GPIOx_IDR输入数据寄存器 GPIOx_ODR输出数据寄存器

一个32位置位/复位寄存器:GPIOx_BSRR

一个16位复位寄存器:GPIOx_BRR

一个32位锁定寄存器:GPIOx_LCKR

 

STM32 IO口相关寄存器讲解

1.端口配置寄存器:

STM32每组GPIO为16个IO口,每4位控制一个IO口,所以32位控制8个IO口

分为低16位:GPIOx_CRL 和 高16位:GPIOx_CRH 共32位控制一组GPIO的16个IO口

 

 

如上图,以端口配置寄存器低16位为例,每四位控制一个IO口,高16位同理

MODEx的2位:配置IO口输入/输出模式,1种输入和3种不同速度的输出模式

CNFx的2位:配置IO口输入/输出状态下(由MODEx控制)的输入/输出模式

 

以GPOIOA_CRL为例:

配置IO口PA0->MODE0=00(输入模式)

配置CNF0=10(上拉/下拉输入模式)

此种配置下到底是上拉还是下拉输入模式还需由ODR寄存器决定:

2.数据寄存器,以输入数据寄存器GPIOx_IDR为例,每一组IO口都具有一个GPIOx_IDR的32位寄存器,实际只使用低16位,高16位保留,即16位控制16个IO口,每一位控制一个。

如图,IDR寄存器共32位,0~15位代表一组IO口16个IO当前值,则当IO口配置为输入模式且配置上拉/下拉输入模式,即MODEx=00 CNFx=10时,ODR决定到底是上拉还是下拉。

1)当输出模式时,ODR为输出数据寄存器

2)当输入模式时,ODR用作区分当前位输入模式到底是上拉输入(ODRx=0)还是下拉输入(ODRx=1)

 

3.端口位设置/清除寄存器(GPIOx_BSRR)

 

BSRR寄存器作用:BSRR寄存器为32位寄存器,低16位BSx为设置位,1表示设置,0表示不变,高16位BRx为重置位,1表示清除,0表示不变,当然,最终的目的还是通过BSRR间接设置ODR寄存器,改变IO口电平。

 

4.端口位清除寄存器(GPIOx_BRR)

GPIOx_BRR寄存器作用同GPIOx_BSRR寄存器高16位,一般使用BSRR低16位和BRR的低16位,STM32F4系列取消了BSRR的高16位

 

5.锁存寄存器:

使用较少,暂不分析

 

 

端口复用和重映射:

1.端口的复用:

大部分IO口可复用为外部功能引脚,参考芯片数据手册,IO口复用和重映射

如,STM32F103ZET6的PA9和PA10引脚可复用为串口发送和接收功能引脚,也可复用为定时器1的通道2和通道3

端口复用作用:最大限度的利用端口资源

 

2.端口的重映射:

串口1默认引脚为PA9, PA10可通过配置重映射到PB6,PB7

 

端口重映射的作用:

方便布线

 

3.STM32的所有IO口都可作为中断输入,51单片机只有2个端口可作为外部终端输入。

 

上拉寄存器是控制对应端口上拉使能的,当对应位为0时,设置对应引脚上拉使能,为1时,禁止对应引脚上拉使能。若上拉寄存器使能,无论引脚功能寄存器如何设置,输入,输出,数据,中断等,对应引脚输出高电平。

若图中GPBn被设为输入引脚,则就应该使能内部上拉。

可认为:

1.A电平为高时,三极管连通,这是GPBn接地,读GPBDAT时它的位n为0

2.A电平为低时,GPBn相当于没有外接电路,它的电平取决于有无上拉

a.若有上拉,则读GPBDAT时它的位为1

b.若无上拉,则读GPBDAT时它的位n的值不确定,有时为1,有时为0

这仅是一个例子,是否上拉,应该取决于电路的设计。

上拉是一个电阻接到电压,其实就是增强IO的驱动能力,下拉是一个电阻接到地,保证IO口是低电平。

 

以上所有内容为笔记整理,其中有部分内容来自网络文章,若有侵权,请告知,作者会删除。

你可能感兴趣的:(STM32)