什么是IO?IO就是输入输出设备,就像一个可以判断电压是否输入,管理电压是否输出的引脚。
比如识别一个按键是否按下,随意点亮或熄灭一个LED灯,这就是IO
保护二极管及上、下拉电阻引脚的两个保护二级管可以防止引脚外部过高或过低的电压输入,
当引脚电压高于VDD 时,上方的二极管导通,当引脚电压低于 VSS 时,下方的二极管导通,
防止不正常电压引入芯片导致芯片烧毁。并且引脚不能直接驱动大功率器件,如驱动电机烧坏芯片
一.输入模式
1.上拉输入:信号从外部IO进入,信号状态保存在输入数据寄存器中,可以读取寄存器值判断IO状态,默认为上拉为高电平
2.下拉输入:默认为下拉为低电平,其它同上拉输入
3.浮空输入:不加外部信号是输入数据寄存器值未知,由外部信号决定
4.模拟输入:ADC用来读取外部IO电信号值,必须为浮空,在模拟配置中,I/O 引脚不能为 5 V 容忍
5.复用功能输入:复用功能分复用输入,复用输出,例如串口的接收脚就是复用输入(由复用功能寄存器决定)
二.输出模式
1.推挽输出:
输出控制为推挽,通过写置位/复位或输出数据寄存器来输出高低电平,当INT为0时反向为1,NMOS导通,PMOS截止,OUT脚电平为0;INT为1时反向为0,NMOS截止,PMOS导通,OUT脚电平为1。可设置浮空及上下拉。
2.开漏输出:
输出控制为开漏,通过写置位/复位或输出数据寄存器来输出高低电平,当INT为0时反向为1,NMOS导通,OUT脚电平为0;INT为1时反向为0,NMOS截止,OUT脚电平为1。可设置浮空及上下拉。但是要注意一点如果内部没有上拉就一定要在外面增加上拉电路,防止NMOS截止时D级为高阻态。
3.复用推挽:输出控制为推挽,但通过复用功能(复用的外设)来输出高低电平,根据外设需求可设置浮空及上下拉。
4.复用开漏:输出控制为开漏,但通过复用功能(复用的外设)来输出高低电平,根据外设需求可设置浮空及上下拉。
每个通用 I/O 端口包括 4 个 32 位配置寄存器(GPIOx_MODER、GPIOx_OTYPER、
GPIOx_OSPEEDR 和 GPIOx_PUPDR)、2 个 32 位数据寄存器(GPIOx_IDR 和
GPIOx_ODR)、1 个 32 位置位/复位寄存器 (GPIOx_BSRR)、1 个 32 位锁定寄存器
(GPIOx_LCKR) 和 2 个 32 位复用功能选择寄存器(GPIOx_AFRH 和 GPIOx_AFRL)。
1.GPIO 端口模式寄存器 (GPIOx_MODER) (x = A…I)
偏移地址:0x00
复位值:
● 0xA800 0000(端口 A)
● 0x0000 0280(端口 B)
● 0x0000 0000(其它端口)
可以看出每两个位控制同一组的16个IO中的对应IO为输入/输出模式,
其中A组及B组中的几个IO口用途以固定,如(含调试引脚):
● PA15:JTDI 处于上拉状态
● PA14:JTCK/SWCLK 处于下拉状态
● PA13:JTMS/SWDAT 处于下拉状态
● PB4:NJTRST 处于上拉状态
● PB3:JTDO 处于浮空状态
2.GPIO 端口输出类型寄存器 (GPIOx_OTYPER) (x = A…I)
偏移地址:0x04
复位值:0x0000 0000
● 0:输出推挽(复位状态)
● 1:输出开漏
每位控制同一组的16个IO中的对应IO为输入输出模式,高16位保留
3.GPIO 端口输出速度寄存器 (GPIOx_OSPEEDR) (x = A…I/)
偏移地址:0x08
复位值:
● 0x0000 00C0(端口 B)
● 0x0000 0000(其它端口)
控制方法雷同
4.GPIO 端口上拉/下拉寄存器 (GPIOx_PUPDR) (x = A…I/)
偏移地址:0x0C
复位值:
● 0x6400 0000(端口 A)
● 0x0000 0100(端口 B)
● 0x0000 0000(其它端口)
00:无上拉或下拉 ---- 01:上拉 — 10:下拉 — 11:保留
5.GPIO 端口输入数据寄存器 (GPIOx_IDR) (x = A…I)
偏移地址:0x10
复位值:0x0000 XXXX(其中 X 表示未定义)
以16位数据访问,读取对应引脚电平状态
6.GPIO 端口输出数据寄存器 (GPIOx_ODR) (x = A…I)
偏移地址:0x14
复位值:0x0000 0000
用于输出模式,可读可写,操作置位/复位寄存器会对输出数据寄存器进行置位/复位
7.GPIO 端口置位/复位寄存器 (GPIOx_BSRR) (x = A…I)
偏移地址:0x18
复位值:0x0000 0000
高16位用来将输出数据寄存器复位为0,低16位将其置位为1
8.GPIO 端口配置锁定寄存器 (GPIOx_LCKR) (x = A…I)
每个锁定位冻结一个特定的配置寄存器(控制寄存器和复用功能寄存器)。
偏移地址:0x1C
复位值:0x0000 0000
访问:仅 32 位字,读/写寄存器
位 16 LCKK[16]:锁定键 (Lock key)
可随时读取此位。可使用锁定键写序列对其进行修改。
0:端口配置锁定键未激活。
1:端口配置锁定键已激活。直到 MCU 复位时,才锁定 GPIOx_LCKR 寄存器。
位 15:0 LCKy:端口 x 锁定位 y (Port x lock bit y) (y= 0…15)
这些位都是读/写位,但只能在 LCKK 位等于“0”时执行写操作。
0:端口配置未锁定
1:端口配置已锁定
这个寄存器用来将需要配置好IO的配置保存,先选择需要确定配置的位(位15:0),
再将位16置1表示锁定这些需要配置的端口(控制寄存器和复用功能寄存器)
9.GPIO 复用功能低位寄存器 (GPIOx_AFRL) (x = A…I)
偏移地址:0x20
复位值:0x0000 0000
可以看出4位控制一个IO,低位复用只能操作IO口0-7,但每个IO都对应16种复用状态
10.GPIO 复用功能高位寄存器 (GPIOx_AFRH) (x = A…I)
偏移地址:0x24
复位值:0x0000 0000
控制IO口8-15,功能同上
通过配置以上寄存器就可以得到我们想要的IO功能
● 外部中断线/唤醒线:
所有端口都具有外部中断功能。要使用外部中断线,必须将端口配置为输入模式
以上就是GPIO基础内容,下期我们具体来讲解库函数是怎么来实现GPIO的初始化