stm32 gpio 工作方式及 mos管的认识

参考博客,《STM32–GPIO结构,推挽、复用输出》, 一起来围观吧
【link】https://blog.youkuaiyun.com/Cecilia_li/article/details/78615459

在这里插入图片描述

GPIO 寄存器的配置

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
模式一 开漏输出
CPU 写寄存器来 输出1通过输出控制电路 N-MOS管处于关闭状态,输出电平不受MOS管影响,而受上下拉电阻的影响,所以IO口输出不一定为1;
输出为0,N-MOS管开启,把输出端电平拉低,所以输出为0;CPU读出来的就是0.在这里插入图片描述
模式二-------开漏复用输出
复用是通过 外设 来控制输入输出
其他与开漏输出一样

模式三----------推挽输出
推挽输出:输入1时,上方的 P-MOS 导通,下方的 N-MOS关闭,对外输出高电平;
输入0时,下方的 N-MOS 导通,上方的 P-MOS关闭,对外输出低电平。

模式四------推挽复用输出
复用是通过 外设 来控制输入输出
其他与推挽输出一样

在这里插入图片描述
在这里插入图片描述

端口模式寄存器

1, GPIOx 是32为寄存器 每两位控制一个IO(32位控制一组16位IO);
2,模式的设置
在这里插入图片描述

端口输出类型寄存器

高16位保留,只用到低16位
在这里插入图片描述

端口输出速度寄存器在这里插入图片描述在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

### STM32 GPIO 的五种工作模式详解 STM32控制器的 GPIO(通用输入/输出)模块提供了多种灵活的工作模式,这些模式可以根据具体的应用需求进行配置。以下是详细的五种常见工作模式及其特点: #### 1. **输入浮空 (Input Floating)** 在这种模式下,GPIO 引脚既没有内部上拉也没有内部下拉电阻[^2]。这意味着引脚处于高阻态,其电平状态完全取决于外部信号源。如果没有任何外部信号连接到此引脚,则可能会因为电磁干扰而导致不确定的状态。 ```c // 配置 GPIO 为输入浮空模式 GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; // 默认为浮空输入 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); ``` 这种模式适用于不需要默认状态的场景,但需要注意的是,在某些情况下可能需要额外增加硬件滤波来稳定信号[^4]。 --- #### 2. **输入上拉 (Input Pull-up)** 在此模式下,GPIO 引脚通过一个内置的弱上拉电阻被拉至高电平[^3]。如果没有其他外部信号作用于该引脚,默认状态下它将是逻辑 “1”。当外部设备将其接地时,可以检测到低电平信号。 ```c // 配置 GPIO 为输入上拉模式 GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); ``` 这种方式常用于按键开关等简单接口设计中,能够有效减少误触的可能性。 --- #### 3. **输入下拉 (Input Pull-down)** 类似于输入上拉模式,只是这里使用了一个内部弱下拉电阻将引脚固定在低电平位置[^3]。因此,在无外界影响的情况下,默认读取到的是逻辑 “0”。 ```c // 配置 GPIO 为输入下拉模式 GPIO_InitStruct.Pull = GPIO_PULLDOWN; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); ``` 尽管上下拉都可以实现类似的控制目的,但在实际应用中通常更倾向于采用上拉方式,因为它能更好地兼容大多数传感器和执行器电路。 --- #### 4. **推挽输出 (Push-Pull Output)** 推挽输出是一种高效的驱动机制,利用一对互补工作的 MOSFET 来分别提供高电平和低电平输出[^5]。当设置为 HIGH 时,P-MOS 导通并将电压提升到接近 VDD;而 LOW 则让 N-MOS 工作从而把输出降到 GND 水平附近。这种方法支持较大的负载能力和较快的速度切换时间。 ```c // 配置 GPIO 为推挽输出模式 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // Push-pull mode GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // 设置输出高低电平 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET); // 输出 HIGH HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET); // 输出 LOW ``` 值得注意的是,虽然理论上单个 IO 能够承受高达 25 mA 的电流[^4],但从整体功耗考虑以及避免损坏器件的角度出发,应尽量避免长时间大功率运行。 --- #### 5. **开漏输出 (Open Drain Output)** 与推挽不同之处在于,开漏仅依靠单一类型的晶体管(N-MOS)完成操作——即只有在需要产生零伏特的时候才会激活相应元件[^5]。这就意味着除非另有安排(例如附加外部上拉网络),否则无法主动生成正向供电等级(+Vcc)作为最终结果呈现出来。 ```c // 配置 GPIO 为开漏输出模式 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD; // Open-drain mode HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // 外部需加上拉电阻才能正常工作 ``` 典型应用场景包括 I²C 总线通信或者 LED 显示屏矩阵扫描等功能块里头,它们往往依赖共享总线上多个节点协同作业特性达成目标效果。 --- ### 小结 以上就是关于 STM32 中五个主要 GPIO 运行形态的具体阐述说明。每一种都有各自独特的优势所在,并且针对特定场合下的表现各有千秋。合理选用合适的类型对于优化项目性能至关重要!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值