参考资料:STM32库函数/不完全手册开发指南跑马灯实验、STM32中文参考手册第八章通用和复用功能IO。
- STM32ZET6引脚说明
STM32F103ZET5共7组IO GPIOA~GPIOG
每组IO又有16个IO GPIOA.0~GPIO15
共16X7=112个IO 144
- STM32F103RCT6
STM32F10RCT6共4组IO GPIOA~GPIOD
每组IO还是有16个IO GPIOA.0~GPIO15
共16X3+3=51个IO 64
- GPIO基本结构
复用功能
补充说明:有FT标识的为5V,3.3V均支持
内部结构图
- GPIO工作方式
四种输入模式[A1]
四种输出模式[A2]
- 输入浮空模式
电平(0/1)通过①到IO口上面,两个二极管只是保护作用,并无其它用途,通过开关,此时开关不会打开,0/1经过施密特触发器,施密特触发器是由肖特基二极管构成(导通电压小,电压降小,导通截止时间短),这个0/1经过输入数据寄存器直接给到单片机引脚。
- 输入上拉模式[A3]
电平(0/1)通过①到IO口上面,两个二极管只是保护作用,并无其它用途,通过开关,此时开关会打开(上拉电阻为30~50K),0/1经过施密特触发器,施密特触发器是由肖特基二极管构成(导通电压小,电压降小,导通截止时间短),这个0/1经过输入数据寄存器直接给到单片机引脚。
- 输入下拉模式[A4]
电平(0/1)通过①到IO口上面,两个二极管只是保护作用,并无其它用途,通过开关,此时开关会打开(上拉电阻为30~50K),0/1经过施密特触发器,施密特触发器是由肖特基二极管构成(导通电压小,电压降小,导通截止时间短),这个0/1经过输入数据寄存器直接给到单片机引脚。
- 模拟输入
模拟量输入,上拉下拉无效,即为开关断开,然后通过模拟输入端口到MCU。
- 开漏输出模式
高电平经过位设置清除寄存器,然后映射到输出寄存器(ODR)上,然后到输出控制电路,如果是高电平,NMOS管处于关闭,这个时候输出电平由外部上拉或者是下拉电阻决定,类似处于浮空状态。在开漏输出模式下,MCU还可以读取IO端口的电平。如果是低电平,NMOS管导通,这个时候输出电平是低电平,CPU读取的值就是低电平。
- 开漏复用功能模式
高电平经过复用功能输出,然后到输出控制电路,如果是高电平,NMOS管处于关闭,这个时候输出电平由外部上拉或者是下拉电阻决定,类似处于浮空状态。在开漏输出模式下,MCU还可以读取IO端口的电平。如果是低电平,NMOS管导通,这个时候输出电平是低电平,CPU读取的值就是低电平。
- 推挽输出模式
高电平经过位设置清除寄存器,然后映射到输出寄存器(ODR)上,然后到输出控制电路,如果是高电平,PMOS导通,NMOS截止,IO口即为高电平,如果是低电平,NMOS管导通,PMOS截止,IO口即为低电平。这样的输出是强高电平或者是强低电平。CUP还是可以读取IO口的高低电平。
- 推挽复用输出模式
高电平经过位复用功能输出,然后到输出控制电路,如果是高电平,PMOS导通,NMOS截止,IO口即为高电平,如果是低电平,NMOS管导通,PMOS截止,IO口即为低电平。这样的输出是强高电平或者是强低电平。CUP还是可以读取IO口的高低电平。
注意:开漏输出只能输出强低电平,不能输出强高电平,而推挽输出可以输出强高低电平。
- GPIO相关寄存器配置
两个32位配置寄存器 (GPIOx_CLR,GPIOx_CRH)
两个32位数据寄存器 (GPIOx_IDR和GPIOx_ODR)
一个32位置位/复位寄存器(GPIOx_BSRR)
一个16位复位锁存器 (GPIOx_BRR)
一个32位锁定寄存器 (GPIOx_LCKR)
注意:每个I/O端口位可以允许自由编程,然而I/O端口寄存器必须按照32位字节访问,不能半字节或者是字节访问。
① 端口配置低寄存器(GPIOx_CRL)[A5]
② 端口配置高寄存器(GPIOx_CRH)[A6]
③ 端口输入数据寄存器(GPIO_IDR)[A7]
注意:输出模式下也可使用!!!
④ 端口输出数据寄存器(GPIO_ODR)[A8]
⑤ 端口位设置/清除寄存器(GPIOx_BSRR)[A9]
⑥ 端口位清除寄存器(GPIOx_BRR)[A10]
更多的寄存器配置在STM32中文参考手册里面有,这里不详细讲解。
端口复用功能不做更多讲解,数据手册会详细讲解。
- 端口重映射
端口重映射是指某些端口可以复用到其它IO口,比如串口1默认是PA9,PA10可以通过配置重映射到PB6,PB7。用途是方便布线(数据手册里面有)
注意:STM32单片机所有IO口都可以实现中断
[A1]输入浮空
输入上拉
输入下拉
模拟输入
[A2]开漏输出
开漏复用功能输出
推挽式输出
推挽式复用功能
[A3]强高
[A4]强低
[A5]Px0~Px7
[A6]Px8~Px15
[A7]IDR寄存器低16位,每个位控制一组IO的一个IO口,对应的是IO口输入电平。
[A8]ODR寄存器低16位,每个位控制一组IO的一个IO口,对应的是IO口输出电平。
[A9]BSRR寄存器低16位,对应位设置为1,那么IO口输出为高电平,对应为0,则不会产生任何影响。高16位作用相反。
[A10]与GPIOx_BSRR低16位相同,所以实际使用中很少使用这个寄存器,实现不了功能在用GPIOx_BRR寄存器。