历史上的今天
返回首页

历史上的今天

今天是:2024年08月26日(星期一)

正在发生

2018年08月26日 | STM32 GPIO的8种工作模式及相关配置寄存器

2018-08-26 来源:eefocus

GPIO八种工作模式

四种输入: 

GPIO_Mode_IPU(上拉输入) 
GPIO_Mode_IPD(下拉输入) 
原理: 经过上拉开关和下拉开关的连接,再经过触发器转化为0,1的数字信号,存储到数据寄存器中,然后我们就可以通过配置寄存器CRL,CRH控制这两个开关。 
用法: 若GPIO引脚配置为上拉输入模式,在默认状态下(GPIO引脚无输入),取得的GPIO引脚数据为1,既高电平. 而下拉输入模式则是相反的,在默认状态下其引脚数据为0,低电平.

GPIO_Mode_IN_FLOATING(浮空输入) 
原理: 不接上拉和下拉开关,直接经由触发器输入. 
用法: 若配置成这个模式可以用电表测量其引脚电压是1点几伏(不确定的值).由于输入阻抗较大,一般把这种模式用于标准的通讯协议例如:I2C,USART的接收端.

GPIO_Mode_AIN(模拟输入) 
原理: 直接关闭触发器,不接上拉和下拉开关,由另一路开关传至片上外设模块. 
用法: 例如传送至ADC模块时,就由ADC采集电压信号.(使用ADC外设的时候,必须是设置为模拟输入模式).

四种输出: 
GPIO_Mode_Out_PP(普通推挽输出) 
原理: 经过一个由P_MOS和N_MOS管组成的单元电路.输出高电平(3.3V)时,P_MOS导通,低电平(0V)时,N_MOS导通(两个管子轮流导通,一个进电流,一个拉电流.这样它的负载能力和开关速度都比普通方式有大的提高) 
用法: 一般都是应用在输出电平为0和3.3V的场合.

GPIO_Mode_Out_OD(普通开漏输出) 
原理: 
在输出0时,既高电平,则N_MOS管导通,使输出接地.在输出1时,则不输出高电平也不输出低电平(无法输出高电平,本身为高阻态).所以在使用的时候,必须在外部接上一个上拉电阻并且开漏输出模式具有”线与”的特性,既有很多开漏模式的引脚接到一起时,只有在所有引脚都处于高阻态的时候,才会输出高电平.(电压是外部上拉电阻所接电源的电压).只要其中一个引脚是低电平,那么整个线路都等于短路接地(低电平),电压是0V.(只要是开漏输出模式,都必须接上拉电阻) 
用法: 
一般应用在电平不匹配的场合,如需要输出5V的高电平,就需要在外部接上一个上拉电阻,电源为5V.这时在输出高组态的时候,就会由上拉电阻和电源向外输出5V.

GPIO_Mode_AF_PP(复用推挽输出) 
GPIO_Mode_AF_OD(复用开漏输出) 
原理: 同上. 
用法: 对于复用模式,一般都是由GPIO的复用功能来选择的(比如一个IO引脚可以做一般输入输出,同时还是串口输出脚,这就是复用) 例如:GPIO的引脚用作串口的输出,就可以使用复用推挽输出模式了.如果是用在I2C,SMBUS这些需要线与功能的,就使用复用开漏输出

附上工作模式原理图,想具体了解的朋友可以看着原理图对照我上面所说的,一步步看,最右边的为IO引脚


GPIO相关配置寄存器

每组GPIO端口的寄存器包括:

  • 一个端口模式寄存器(GPIOx_MODER)

  • 一个端口输出类型寄存器(GPIOx_OTYPER)

  • 一个端口输出速度寄存器(GPIOx_OSPEEDR)

  • 一个端口上拉下拉寄存器(GPIOx_PUPDR)

  • 一个端口输入数据寄存器(GPIOx_IDR)

  • 一个端口输出数据寄存器(GPIOx_ODR)

  • 一个端口置位/复位寄存器(GPIOx_BSRR)

  • 一个端口配置锁存寄存器(GPIOx_LCKR)

  • 两个复位功能寄存器(低位GPIOx_AFRL & GPIOx_AFRH)

如果配置一个IO口需要2个位,那么刚好32位寄存器配置一组IO口16个IO口
如果配置一个IO口只需要1个位,一般高16位保留
BSRR寄存器32位分为低16位BSRRL和高16位BSRRH,BSRRL配置一组IO口的16个IO口的置位状态(1),BSRRH配置复位状态(0)。


推荐阅读

史海拾趣

问答坊 | AI 解惑

wince GPRS自动拨号问题(C#)

如题 有没有会的 给个详细解释哈…

查看全部问答>

渥瑞达“3G移动开发”免费试听课于北京交通大学举行,欢迎大家光临!

渥瑞达“3G移动开发”免费试听课于北京交通大学举行,欢迎大家光临! 渥瑞达“3G移动开发”免费试听课于北京交通大学举行,欢迎大家光临! 详情请参见 www.neworigin.net 同时欢迎大家与我们的609期学员交流!这期学员已与2月11日毕业 ...…

查看全部问答>

用c51写的程序怎么使各个模块联合工作

由于从来没有与人合作写一个程序,不知道怎么配合? 有几个疑问请教高手指点: 1怎么才能使各个模块联合工作。 2全局变量怎么才能共用。 3函数之间的数据如何传递。 4如果我写模块,那么我是不是一定要去,看另一个人写的主函数框架。那这样的 ...…

查看全部问答>

dsp的电源芯片,大家一般选什么?

dsp供电电压为 3.3和1.8V ,大家是如何考虑去选电源芯片的。用哪家的LDO?…

查看全部问答>

请教坛里用过Ti的 Piccolo 2803X\2802x的开发板

请教坛里用过Ti的 Piccolo 2803X\\2802x的开发板的坛友,开发板上的28027是否可以用28035替代…

查看全部问答>

Launchpad + 呼吸灯这样才好玩~

$(\'swf_MQo\').innerHTML=AC_FL_RunContent(\'width\', \'550\', \'height\', \'400\', \'allowNetworking\', \'internal\', \'allowScriptAccess\', \'never\', \'src\', encodeURI(\'http://player.youku.com/player.php/sid/XNDE4Mjk2Njky/v.sw ...…

查看全部问答>

关于中断架构在raw os 中的设计

由于中断在系统中的特殊作用,历来被os设计者一直所看重。raw os 系统内核最大关中断时间在S3c2440平台上实测为8.2us, 虽然不是皎皎冠军,但是也不至于落到最后。 本人一直认为整个应用系统的最大瓶颈是在中断的驱动架构这里,只要抓好这个整体,系 ...…

查看全部问答>

TI CCS6 License【破解图示】

本帖最后由 qwqwqw2088 于 2014-6-20 08:36 编辑 To install Code Composer Studio    On Windows:          1. Run ccs_setup_6.0.0.xxxxx.exe    2. Choose where you wa ...…

查看全部问答>

IGBT驱动板电源的脉冲变压器

有没有人设计过IGBT驱动板电源的脉冲变压器?指点一下,如何进行设计,或者分享一些设计资料,谢谢!…

查看全部问答>