找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2159|回复: 0
打印 上一主题 下一主题
收起左侧

GPIO工作原理(stm32F10x)

[复制链接]
跳转到指定楼层
楼主
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可作为中断输入。-_-

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表