单片机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触发等高速场景‌‌

相关推荐
FreakStudio7 天前
W55MH32L-EVB 上手测评:硬件 TCP/IP 加持的以太网单片机,MicroPython 零门槛开发
python·单片机·嵌入式·大学生·面向对象·并行计算·电子diy·电子计算机
✎ ﹏梦醒͜ღ҉繁华落℘12 天前
单片机基础知识---stm32单片机的优先级
stm32·单片机·mongodb
u1521096484913 天前
S.S.Audio PRO A2音频隔离器
嵌入式硬件·音视频·实时音视频·视频编解码·视频
zd84510150013 天前
RS485 总线详解
单片机·嵌入式硬件
半条-咸鱼13 天前
【STM32】I2C协议原理、HAL读写与OLED显示操作
嵌入式硬件·c·信息与通信
wohoo_wangzi13 天前
苏州晟雅泰电子:关于W25Q128JVSIQ这个芯片物料的参数,规格及应用领域
嵌入式硬件
✎ ﹏梦醒͜ღ҉繁华落℘13 天前
编程基础 --高内聚,低耦合
c语言·单片机
科芯创展13 天前
1A,1MHz,30VIN,XZ4115,降压恒流LED驱动芯片
单片机·嵌入式硬件
集芯微电科技有限公司13 天前
四通道2A输出集成功率电感降压模块专为紧凑型方案设计
人工智能·单片机·嵌入式硬件·生成对抗网络·计算机外设
踏着七彩祥云的小丑13 天前
嵌入式测试学习第 37 天:异常场景测试:断电、拔插、干扰、非法指令
单片机·嵌入式硬件·学习