GPIO
GPIO:通用输入输出
GPIO与引脚的区别:引脚包含GPIO,还有其他特殊的引脚
引脚分类:电源、晶振IO、下载IO、BOOT IO、复位IO 组成最小系统,剩下的引脚才是GPIO
GPIO原理图:
CRL(第八位)/CRH(高八位)
当外部电压高于VDD(3.3v)会通过二极管保护芯片,但是当电压过高后,保护机制无法保护芯片,例如(直连电机)
推挽输出
- 当ODR输出1时,N管关闭,P管导通,输出接通VDD电压输出1(推,向外的 灌电流 25mA)
- 当ODR输出1时,P管关闭,N管导通,输出接通VSS电压输出0(挽 ,向内的 拉电流)
用于连接数字器件,开关效率高,电流大,驱动能力强
除开必须用开漏一般都用推挽。
开漏输出
- 只能输出低电平,不能输出高电平
- 如若需要输出高电平,需要引脚上拉电阻,由外部体提供高电平
- 开漏具有“线与”功能,可以将多个开漏输出的Pin,连接到一条线上,形成“与逻辑”关系。一个低,全为低,多用于I2C和SMBUS总线
用于需要线与功能和总线的电路中
ODR/BSRR
- 如果只需要设置端口的某些pin为1,直接赋值到BSRR(高16位保持为0),BSRR为端口置位/复位寄存器,置位就是高电平、复位也就是低电平,这玩意是个32位寄存器,低16位控制置位、高16位控制复位.
- 如果只需要设置端口的某些pin为0,直接赋值到BRR。
- 如果设置端口的某些pin为1、另外一些pin为0,需要对应的设置一个32-bit的数值,其低16位对应设置1的pin,高16位对应设置0的pin,然后赋值到BSRR。
- 整体操作使用ODR,ODR也可以使用逻辑实现原子操作用BSRR和BRR去改变管脚状态的时候,没有被中断打断的风险
链接:https://www.jianshu.com/p/17d8b3f0d6d1
GPIO的初始化顺序
- 确定具体的GPIO
- 配置GPIO工作模式(CRL \CRH)
- 控制GPIO输出电平(ODR\BRR\BSRR)
寄存器映射
AHB划分为两路总线
APB1:慢速总线,最快36Mhz
APB2:快速总线,最快72Mhz
总线地址 = 总线基地址 + 相对外设地址偏移量
外设地址 = 总线地址 + 相对目标总线的偏移地址
寄存器地址 = 外设地址 + 相对寄存器偏移地址
外设总线基地址:0x40000000
#define PERIPH_BASE (unsigned int)0x40000000
地址的起始为APB1所以APBI1没有偏移量
# define APB1_PERIPH_BASE (PERIPH_BASE)
ABP2的起始地址为总线基地址+0x1000
# define APB2_PERIPH_BASE (PERIPH_BASE+ 0x1000)