单片机GPIO配置

单片机:STM32F407

开发板:DMF407电机开发板

平台:keil V5.31

HSE 为8MHZ

HSI为16MHZ

原理图:

复制代码
void led_init(void)
{
    GPIO_InitTypeDef gpio_init_struct;
    
    LED0_GPIO_CLK_ENABLE();                                 /* LED0时钟使能 */
    LED1_GPIO_CLK_ENABLE();                                 /* LED1时钟使能 */

    gpio_init_struct.Pin = LED0_GPIO_PIN;                   /* LED0引脚 */
    gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP;            /* 推挽输出 */
    gpio_init_struct.Pull = GPIO_NOPULL;//GPIO_PULLDOWN;//GPIO_PULLUP;                    /* 上拉 */
    gpio_init_struct.Speed = GPIO_SPEED_FREQ_LOW;//GPIO_SPEED_FREQ_HIGH;          /* 高速 */
    HAL_GPIO_Init(LED0_GPIO_PORT, &gpio_init_struct);       /* 初始化LED0引脚 */

    gpio_init_struct.Pin = LED1_GPIO_PIN;                   /* LED1引脚 */
    HAL_GPIO_Init(LED1_GPIO_PORT, &gpio_init_struct);       /* 初始化LED1引脚 */
    
    LED0(1);                                                /* 关闭 LED0 */
    LED1(1);                                                /* 关闭 LED1 */
}

1、引脚配置:

复制代码
#define LED0_GPIO_PORT                  GPIOE
#define LED0_GPIO_PIN                   GPIO_PIN_0
#define LED0_GPIO_CLK_ENABLE()          do{ __HAL_RCC_GPIOE_CLK_ENABLE(); }while(0)             /* PF口时钟使能 */

2、引脚定义

复制代码
/* LED端口定义 */
#define LED0(x)   do{ x ? \
                      HAL_GPIO_WritePin(LED0_GPIO_PORT, LED0_GPIO_PIN, GPIO_PIN_SET) : \
                      HAL_GPIO_WritePin(LED0_GPIO_PORT, LED0_GPIO_PIN, GPIO_PIN_RESET); \
                  }while(0)       /* LED0 = RED */

3、输出模式

复制代码
gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP;            /* 推挽输出 */

输出模式配置原则

‌推挽输出(Push-Pull Output)‌

‌推荐用于大多数普通输出场景‌,如驱动 LED、数字信号传输等。

推挽输出能主动驱动高电平(接 VDD)和低电平(接 GND),‌无需依赖外部上拉电阻‌来维持高电平状态。

若已存在外部上拉电阻,‌通常可忽略或移除‌,以免与内部推挽结构产生不必要的电流路径或功耗冲突 ‌‌

‌开漏输出(Open-Drain Output)‌

‌必须配合外部上拉电阻使用‌,否则无法输出高电平 ‌‌

适用于以下情况:

多设备共享总线(如 I²C)‌‌

需要电平兼容(如驱动 5V 逻辑,而 MCU 为 3.3V)‌‌

需要更强的灌电流能力(如驱动继电器、LED 等)‌‌

‌复用推挽输出(Alternate Function Push-Pull)‌

用于片内外设(如 UART、SPI、I²C 的主模式)作为信号输出时。

若外设协议要求(如 I²C),‌仍需外部上拉电阻‌,但此时应使用‌复用开漏模式‌而非推挽 ‌‌

4、上拉配置:

复制代码
gpio_init_struct.Pull = GPIO_NOPULL;//GPIO_PULLDOWN;//GPIO_PULLUP;                    /* 上拉 */

‌外部上拉 vs 内部上拉 的关系‌

‌外部上拉‌:由外部电路(如 4.7kΩ 电阻)将 IO 拉高至 VDD,提供较强的驱动能力和稳定的电平。

‌内部上拉‌:由芯片内部集成的弱上拉电阻(通常 30--100kΩ)实现,抗干扰能力较弱,但可简化硬件设计。

✅ ‌若已使用外部上拉,一般无需启用内部上拉‌,以免形成分压导致电平不足或增加功耗。

❌ ‌但若外部上拉失效(如虚焊、ESD 损坏)‌,内部上拉可作为"故障兜底",维持基本功能 ‌‌

5、速度配置:

复制代码
gpio_init_struct.Speed = GPIO_SPEED_FREQ_LOW;//GPIO_SPEED_FREQ_HIGH;          /* 高速 */

选择原则

应遵循 ‌"满足需求的最小速度"‌ 原则,避免不必要的功耗和电磁干扰(EMI)‌‌

‌低速(2 MHz)‌:适用于LED、按键、继电器等低频控制(通常<10 kHz)‌‌

‌中速(10 MHz)‌:适用于SPI(≤8 MHz)、I2S、PWM(≤10 kHz)等中速接口‌‌

‌高速(50 MHz)‌:适用于USB、高速SPI、FSMC、ADC触发等高速场景‌‌

相关推荐
佳児素花痴╮35 分钟前
STM32U575RIT6(USART)学习
stm32·嵌入式硬件·学习
小+不通文墨2 小时前
使用vscode里的U8G2 库编写OLED菜单控制
经验分享·笔记·单片机·嵌入式硬件·学习
oshan20122 小时前
零基础STM32入门教程--12-I2C 串行通迅
stm32·单片机·嵌入式硬件
Messy create3 小时前
【继续充值】
单片机
茯苓gao3 小时前
从零开发 EtherCAT 主站(六):SOEM 初始化流程详解,主站是如何发现所有从站的?
笔记·嵌入式硬件·学习·信息与通信
智购科技无人售货机工厂3 小时前
2026自动售货机防拆机物理安全设计:从安全螺丝到结构互锁的工程实践~YH
android·网络·驱动开发·python·单片机·安全·云原生
从零开始的嵌入式之旅4 小时前
day33
linux·c语言·经验分享·笔记·嵌入式硬件
RedJACK~4 小时前
Windows11一级右键菜单添加Alacritty教程
单片机·嵌入式硬件
智闲电子设计4 小时前
STM32 DAC 实战:用 DMA 把定时器表变成波形,自制信号发生器
stm32·单片机·嵌入式硬件
zcmodeltech4 小时前
反应装置模型控制系统设计与实现:多设备协同联动方案
java·网络·数据库·stm32·嵌入式硬件·能源·制造