GPIO工作原理(stm32F10x)

news/2025/2/25 4:04:30

GPIO -- General Purpose Input Output (通用输入/输出)简称为GPIO, GPIO在每一款单片机中的地位都是至关重要的。 下面说一下它的工作原理。 我用的是MINISTM32F103RCT6这款单片机。


1.1 GPIO工作方式
工作方式:(4输入、4输出),三种最大翻转速度 

3种最大翻转速度

2MHz
10MHz

50MHz

4种输入方式:
1, 输入浮空模式:CPU可以读输入数据寄存器里面的数据。输入电平经过TTL施密特触发器到输入数据寄存器,
这时上拉下拉电阻都是没接通的。
2, 输入上拉模式:和输入浮空差不多, 唯一的区别就是电平输入的时候加了一个上拉电阻。
3, 输入下拉模式:电平输入的时候加了一个下拉电阻。
4
, 模拟模式:TTL施密特触发器是截止的( 前面三个都是接通的), 注意此刻输入量并不是高低电平, 

而是0-3V电压; 并且上拉下拉电阻都是没有接通的。
注意:输入模式数据都是输入到输入数据寄存器中, 然后CPU直接读输入数据寄存器中。


ps:上图是盗的。。。

4种输出方式:
1, 开漏输出模式:输出电平通过 位设置/清除寄存器 映射到 输出数据寄存器 然后通过输出控制电路, 如果输出的是1(高电平)那么N-MOS管是关闭的, 实际输出电平是由I/O外部的上拉/下拉电阻控制的。 并且此时CPU可以读输出的电平, 但是因为输出1的时候实际输出电平是由I/O口外部上拉/下拉决定的, 所以此时读入的可能不是1。 但是如果输出的是0那么N-MOS管是开启的,此时电平被拉到VSS, 此时I/O口输出的也就是低电平; 并且可以通过CPU输入数据寄存器来读取。
2, 开漏复用输出模式:与开漏输出模式唯一的区别就是来源, 开漏复用输出模式的电平来源是来自于片上外设模块。
3, 推挽输出模式:与开漏输出模式前面都是一样的, 但是当输出1时, N-MOS管是关闭的,P-MOS管开启; 所以输出为1.
当输出为0时, P-MOS管关闭, N-MOS管开启; 输出为0;
4, 复用推挽输出模式:与推挽输出模式的唯一区别就是来源, 复用推挽输出模式的来源是片上外设模块。
学习的时候可以将第一种输出模式和第二种输出模式放一块, 第三种输出模式和第四种输出模式放一块。


上电复位后, GPIO默认为浮空状态,部分特殊功能引脚为特定状态。
复位后, JTAG引脚被置于输入上拉或者下拉模式:
PA15:JTDI置于上拉模式
PA14:JTCK置于下拉模式
PA13:JTMS置于上拉模式
PB4:JNTRST置于上拉模式


推挽输出和开漏输出区别:
推挽输出:
可以输出强高低电平,连接数字器件 
开漏输出:
只可以输出强低电平,高电平得靠外部电阻拉高。输出端相当于三极管的集电极. 要得到高电平状态需要上拉电阻才行. 适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内)


1.2GPIO端口寄存器包括
两个32位配置寄存器(GPIOx_CRL, GPIOx_CRH)
两个32位数据寄存器(GPIOx_IDR和GPIOx_ODR)
一个32位置位/复位寄存器(GPIOx_BRR)
一个16位复位寄存器(GPIOx_BSRR)
一个32位锁定寄存器(GPIOx_LCKR), (不常用)
每个I/O端口可以自由编程, 然而I/O端口寄存器必须按32位字被访问(不允许半字或字节访问)。


1.2.1端口配置高/低寄存器(GPIOx_CRH, GPIOx_CRL)
stm32 GPIO_CRH是32位的寄存器, 但是配置每一个I/O口需要4位,也就是一个寄存器可以控制8个I/O口, 但是每一组I/O有16位所以需要两个32位寄存器(还有GPIO_CRL), CRH控制高16位, CRL控制低16位寄存器。
每个I/O由4位决定其是 输入还是输出 并且是什么模式。 将这4位分为两组:CNFy[1:0] 和 MOEDy[1:0]
MODEy[1:0]
00:输入模式(复位后的状态)
01:输出模式(最大速度10MHz)
10:输出模式(最大速度2MHz)
11:输出模式(最大数据50MHz)
CNFy[1:0]:
在输入模式
00:模拟输入模式
01:浮空输入模式
10:上拉/下拉输入模式
11:保留
在输出模式
00:通用推挽输出模式
01:通用开漏输出模式
10:复用功能推挽输出模式
11:复用功能开漏输出模式


1.2.3端口输入数据寄存器(GPIOx_IDR)
高16位保留, 低16位每一位控制一个I/O口。如果为 1 就是高电平, 为 0 就是低电平。


1.2.4端口输出数据寄存器(GPIO_ODR)
与IDR寄存器对应(相反), 高16位保留, 低16位每一位控制一个I/O口。如果为 1 就是输出高电平, 为 0 就是输出低电平。但是ODR寄存器还有一个作用:就是在输入模式下设置到底是上拉还是下拉。前面的CRH/CRL寄存器中当MODEy为 00 时(即输入模式), CNFy为 10 (即上拉/下拉输入模式)时,由
ODR确定到底是上拉还是下拉。将对应的ODR寄存器的位设置为 1 代表上拉, 设置为 0 代表下拉。


1.2.5端口位设置/清除寄存器(GPIOx_BSRR)
它是一个 32 位寄存器, 如果使用它的低 16 位(BSy), 那么每一位的含义为:
0:对对应的ODRy位不产生影响。
1:设置对应的ODRy位为1.
也就是说这个寄存器是用来控制ODR寄存器的, 如果低 16 位某些位为 1, 就是说ODRy寄存器对应的也为 1。但是为 0 时不产生影响, 但是如果是ODR寄存器设置为 0 那么就会输出低电平。这有什么好处呢? 在实时系统中, 如果要设置ODR寄存器, 首先要读入ODR寄存器的值, 然后赋一个值,然后达到控制电平的目的, 如果只是要设置高电平的话, 如果是使用BSRR寄存器就可以直接赋值为 1 了, 这样就简单了很多 ^_^。
如果使用的是高 16 位(BRy)的话, 那么每一位含义:
0:对对应的ODRy位不产生影响。
1:清除对应的ODRy位为0。 也就是输出低电平
这样一来就可以设置整个的ODR寄存器的, 如果要输出高电平控制(BSy), 如果要输出低电平控制(BRy) ^-^
注意:如果同时设置了BSy和BRy的对应位, BSy位起作用。


1.2.6端口位清除寄存器(GPIOx_BRR)
BRR寄存器其实作用和BSRR的高 16 位作用是一致的。
所以通常BSRR寄存器用低 16 位, 然后用BRR寄存器来实现BSRR高 16 位的功能。


stm32引脚功能说明
stm32大部分端口都具有复用功能, 也就是说可以作为通用I/O还可以作为一些外设接口。
复用作用:最大限度的利用端口资源。
重映射功能:将某些端口的功能映射到其他端口。
所有I/O口都可以作为中断输入。像51只能有两个I/O可作为中断输入。-_-


http://www.niftyadmin.cn/n/674673.html

相关文章

初步试用mini6410

最近买了mini6410,试玩了一下,发现不错,支持4种系统QT,WINCE,AD,XUbuntu 初步测试了一下这4种系统,其中QT除了包括了基本的,还加多了一些外围的测试程序,不过有一些还没有完善例如ADC 其余的三种…

题材预期明朗商业股显露机会

虽然近期大盘出现了震荡走势,但盘口显示,商业股出现了较为明显的上升趋势,尤其是昨日的西单商场、王府井等个股均有不俗的走势,如此看来,商业股具有极强的投资机会。两大动力助力商业股对于商业股在近期的如此强劲走势…

Native Client 谷歌的另一个大手笔?

相信大家对Chrome的发布印象深刻。网民们焦急的等待,各大网站争相报道。下载日疯狂的下载,各大博客铺天盖地的报道。而这次Native Client的出现犹如夜盗,在我们不知不觉中悄悄降临。 我是在Google Code Blog的订阅里面看到这条消息的。 Nativ…

常用存储过程语法

现在学一下常用的存储过程的语法,只要花一点点时间学习下,就能用存储过程实现很复杂的功能,可以少写很多代码。 一.注释 -- 单行注释,从这到本行结束为注释,类似C,c#中///* … */ 多行注释,类似C,C#中/* ……

使用JMeter进行性能测试

JMeter是Apache组织的开放源代码项目,它是功能和性能测试的工具,100%的用java实现,最新的版本是1.9.1,大家可以到http://jakarta.apache.org/jmeter/index.html下载源代码和查看相关文档。1 JMeter作用领域JMeter可以用于测试静态…

PID控制电机转速

转一个PID控制电机的小程序, 被PID困扰好多天了, 知道它的原理但是一直不明白如何将它运用到电机调速中间去, 看了这个程序之后感觉茅塞顿开。原来也并不难^-^ 转载地址:呃,刚刚不小心把网页关掉了(大写的尴尬)。。。…

COM原理及应用之概述

1、组件设计的原始目的 跨平台、跨网络、积木式搭建程序 2、组件的两个规范:CORBA 和COM OMC(Object Management Group,对象管理组织)的CORBA(Common Object Request Breaker Arehitecture ,公共对象请求…

基于jQuery的控制左右滚动及自动滚动效果

迷上jQuery,相对于原生JavaScript,它是如此的美妙.也因此,促使我更加的努力的研习原生JavaScript.分享一个控制左右滚动及自动滚动的样例, 昨晚花了两个多小时, 忍受着悍蚊的叮咬, 汗水的侵袭, 一行行的敲出来的血汗代码. 哈哈.封装了两种模式: 点击滚动版本DEMO自动滚动版本DE…