GPIO口通识
实际偏移地址因内型号而定/***//*!/*!/*!/*!/*!/*!/*!/*!/*!/*!/*!/*!
·
文章目录
GPIO实现的功能
- 输出相关
- 输出状态:推挽或者开漏 + 上下拉
- 输出数据可以来自于输出数据寄存器(GPIOx_ODR)或外设(复用功能的输出)
- 每个I/O都可以选择输出的速度
- 输入相关
- 输入状态:浮空、上下拉和模拟
- 输入数据可以来自于输入数据寄存器(GPIOx_IDR)或外设(复用功能的输入)
- 模拟功能
- ADC输入
- DAC输出输入
- 模拟比较器
- 复用功能的选择寄存器
- 早期stm32 GPIO的种工作模式, 如_STM32F103xx_
- 浮空输入模式
- 上拉输入模式
- 下拉输入模式
- 模拟输入模式
- 开漏输出模式
- 推挽输出模式
- 复用开漏输出模式
- 复用推挽输出模式
GPIO的工作模式
GPIO的输出
输出类型
推挽输出
- 输出寄存器ODR为1时,P-MOS管导通,N-MOS管截止(断开),引脚高电平

- 输出寄存器ODR为0时,P-MOS管截至,N-MOS管导通,引脚低电平

开漏输出
- 输出寄存器ODR为1时,N-MOS管截止,引脚高阻态/悬空

- 输出寄存器ODR为0时,N-MOS管导通,引脚输出低电平

内部上下拉电阻
- 在输出模式下,输出类型为推挽输出,不管如何设置内部上下拉电阻(内部上下拉电阻是无效的或者说被旁路了),引脚输出是受ODR输出寄存器控制,推挽输出不配置上拉电阻
- 在输出模式下,输出类型为开漏输出,引脚输出是受ODR输出寄存器控制同时也受上下拉电阻控制
- 开漏 + ODR(1) = 悬空
- 开漏 + ODR(1) + 上拉 = 高电平
- 开漏 + ODR(1) + 下拉 = 低电平

- 开漏 + ODR(0) + 上拉/下拉= 低电平
输出速度
速度挡位
| 模式 | 速度描述 | 速度 @2.7-3.6V (MHz) | 速度 @1.58-2.7V (MHz) |
|---|---|---|---|
| 0 | Low speed | 12.5 | 5 |
| 1 | Medium speed | 55 | 12.5 |
| 2 | High speed | 100 | 33 |
| 3 | Very-high speed | 100 | 33 |
速度的影响
- 速度越高,GPIO翻转的时间越短,对高速信号造成的影响越小
- 速度越高,产生的电磁干扰越强,功耗越大
比喻:允许速度越快的路,越直,越平坦,但路占地面积越大,修建成本越高!
常见接口速度
- 驱动LED等,低速
- UART,115200bps以内,低速
- I2C,400k,中速
- SPI,20M,高速
GPIO口的输入
- 输入模式下没有推挽、开漏一说
- 在不配置上下拉电阻的情况下,引脚是浮空状态
- 一般情况下根据所接外设的默认输出状态决定配置上下拉电阻

上拉输入
- 在输入模式下,配置为上拉电阻,引脚默认是高电平,即输入寄存器IDR为1

下拉输入
- 在输入模式下,配置为下拉电阻,引脚默认是低电平,即输入寄存器IDR为0

GPIO口的复用
- 为了在有限的引脚上实现尽量多的外设接口,目前几乎所有的MCU都采用IO口可配置模式,让每个IO口拥有多种接口能力
- I2C总线
- I2C总线,在一组总线上可以连接多个外设,同一个时刻,MCU只能和一个外设进行通信, 其他外设不能参与通信。这样,就要求同一时刻,只能由1个外设控制总线的高、低电平变 化,这样需要线与功能 两根数据线,因为硬件上已经有外置的上拉电阻,所以配置成不带上下拉的开漏输出,复用 模式,速度选择高速或超高速
- SPI总线
- UART接口
- Timer
- …

GPIO口的模拟
- ADC
- DAC输出输入
- 模拟比较器

GPIO的复位状态
普通GPIO口的复位状态
- 是模拟输入模式
调试口
- 下述接口,复位后,不是普通GPIO口状态,是特殊的调试相关接口状态
- PA15: JTDI in pull-up
- PA14: JTCK/SWCLK in pull-down
- PA13: JTMS/SWDIO in pull-up
- PB4: NJTRST in pull-up
- PB3: JTDO/TRACESWO in floating state no pull-up/pull-down
引导配置接口
- PH3/BOOT0:根据在用户选择配置字(user option byte)中的nSWBOOT0 位配置,可以被用作boot 引脚 (BOOT0) 或一个 GPIO(nSWBOOT0 = 0为GPIO功能)
- 如果是用作boot引脚,上电时的高低电平,可以结合其他用户选择字节配置位,影响代码从什么位置来运行
外部晶体振荡器接口
- 外部高速晶体振荡器接口、外部低速(32.768kHz)晶体振荡器接口在没有使用相应的外部振荡器时,可以被用作普通的GPIO
GPIO寄存器简介
- 实际偏移地址因内型号而定
/**
* @brief General Purpose I/O
*/
typedef struct
{
__IO uint32_t MODER; /*!< GPIO port mode register, Address offset: 0x00 */
__IO uint32_t OTYPER; /*!< GPIO port output type register, Address offset: 0x04 */
__IO uint32_t OSPEEDR; /*!< GPIO port output speed register, Address offset: 0x08 */
__IO uint32_t PUPDR; /*!< GPIO port pull-up/pull-down register, Address offset: 0x0C */
__IO uint32_t IDR; /*!< GPIO port input data register, Address offset: 0x10 */
__IO uint32_t ODR; /*!< GPIO port output data register, Address offset: 0x14 */
__IO uint32_t BSRR; /*!< GPIO port bit set/reset register, Address offset: 0x18 */
__IO uint32_t LCKR; /*!< GPIO port configuration lock register, Address offset: 0x1C */
__IO uint32_t AFR[2]; /*!< GPIO alternate function registers, Address offset: 0x20-0x24 */
__IO uint32_t BRR; /*!< GPIO Bit Reset register, Address offset: 0x28 */
__IO uint32_t HSLVR; /*!< GPIO high-speed low voltage register, Address offset: 0x2C */
__IO uint32_t SECCFGR; /*!< GPIO secure configuration register, Address offset: 0x30 */
} GPIO_TypeDef;
更多推荐



所有评论(0)