一、STM32F103ZET6 介绍
1. STM32 实物图:
2. STM32 引脚分布图:
 
  
 
STM32F103ZET6:共 144 个引脚,7 组 IO 口,每组 16 个 IO 口
 
7*16=112 个 IO 口(这 7 组 IO 口分别为 GPIOA,GPIOB…GPIOG)
 
例如:PGIOA 包含 PA0,PA1,PA2…PA15,每组 16 个 IO 口
 
二、IO 口的基本结构和工作方式
1. STM32F1 系列 IO 口的基本结构()IO 口内部电路结构)
  
 
右侧 I/O 引脚部分为芯片暴露在外部的引脚
 
每个引脚在数据手册都有说明是否支持(识别))5V 电压
 
三、PGIO 的 8 种工作方式
4 种输入模式
输入浮空
输入上拉
输入下拉
模拟输入
 
4 种输出模式
开漏输出
开漏复用功能
推挽输出
推挽复用功能
 
可配置 3 种最大翻转速度
2MHz
10MHz
50MHz
 
四、八种工作方式讲解
1、GPIO 输入工作模式 1- 输入浮空模式
 
  
1)外部通过 IO 口输入电平,外部电平通过上下拉部分(浮空模式下都关闭,既无上拉也无下拉电阻)
2)传输到施密特触发器(此时施密特触发器为打开状态)
3)继续传输到输入数据寄存器 IDR
4)CPU 通过读输入数据寄存器 IDR 实现读取外部输入电平值
 
在输入浮空模式下可以读取外部输入电平
 
2,GPIO 输入工作模式 2- 输入上拉模式 
 
 
和输入浮空模式相比较,不同之处在于内部有一个上拉电阻连接到 VDD(输入上拉模式下,上拉电阻开关接通,阻值约 30-50K)
 
外部输入通过上拉电阻,施密特触发器存入输入数据寄存器 IDR,被 CPU 读取
 
3,GPIO 输入工作模式 3- 输入下拉模式 
 
 
和输入浮空模式相比较,不同之处在于内部有一个下拉电阻连接到 VSS(输入下拉模式下,下拉电阻开关接通,阻值约 30-50K)
 
外部输入通过下拉电阻,施密特触发器存入输入数据寄存器 IDR,被 CPU 读取
 
4,GPIO 输入工作模式 4- 输入模拟模式  
 
 
上拉和下拉部分均为关闭状态(AD 转换 - 模拟量转换为数字量)
 
施密特触发器为截止状态
 
通过模拟输入通道输入到 CPU
 
IO 口外部电压为模拟量(电压形式非电平形式),作为模拟输入范围一般为 0~3.3V
 
5,GPIO 输出工作模式 1- 开漏输出模式
 
 
1,CPU 写入位设置 / 清楚寄存器 BSRR,映射到输出数据寄存器 ODR
2,联通到输出控制电路(也就是 ODR 的电平)
3,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 读取到
 
6,GPIO 输出工作模式 2- 开漏复用输出模式 
 
 

 

与开漏输出模式唯一的区别在于输出控制电路之前电平的来源
 
开漏输出模式的输出电平是由 CPU 写入输出数据寄存器控制的
 
开漏推挽输出模式的输出电平是由复用功能外设输出决定的
 
其他与开漏输出模式相似:
 
控制电路输出为 1:N-MOS 截止,IO 口电平由外部上拉 / 下拉决定
 
控制电路输出为 0:N-MOS 开启,IO 口输出低电平
 
7,GPIO 输出工作模式 3- 推挽输出模式
 
 
与开漏输出相比较:
输出控制寄存器部分相同
输出驱动器部分加入了 P-MOS 管部分
 
当输出控制电路输出 1 时:
P-MOS 管导通 N-MOS 管截止,被上拉到高电平,IO 口输出为高电平 1
 
当输出控制电路输出 0 时:
P-MOS 管截止 N-MOS 管导通,被下拉到低电平,IO 口输出为低电平 0
同时 IO 口输出的电平可以通过输入电路读取
8,GPIO 输出工作模式 4- 复用推挽输出模式
 
 
与推挽输出模式唯一的区别在于输出控制电路之前电平的来源
开漏输出模式的输出电平是由 CPU 写入输出数据寄存器控制的
开漏推挽输出模式的输出电平是由复用功能外设输出决定的
 
9,推挽输出和开漏输出的区别:
推挽输出:
可以输出强高 / 强低电平,可以连接数字器件
 
开漏输出:
只能输出强低电平(高电平需要依靠外部上拉电子拉高),适合做电流型驱动,吸收电流能力较强(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 控制)的输入 / 输出模式
 
以 GPIOA_CRL 为例,配置 IO 口 PA0 -> MODE0=00(输入模式) CNF0=10(上拉 / 下拉输入模式) 
 
此种配置下到底是上拉还是下拉输入模式还需由 ODR 寄存器决定 
 
 
关于上拉 / 下拉的控制我们将在下面-数据寄存器-中介绍 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 个端口可以作为外部中断输入)
以上为 STM32-GPIO 工作原理及相关寄存器内容