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

相关推荐
不会武功的火柴3 小时前
SystemVerilog语法(7)-接口(interface)
嵌入式硬件·fpga开发·仿真·ic验证·rtl
深圳英康仕4 小时前
五网口六USB:一台龙芯2K3000工控机的接口配置解读
嵌入式硬件·信创·工控机·工业计算机·龙芯2k3000
lllllllccccc4 小时前
FReeRtos中断管理、临界段保护和任务调度器挂起和恢复学习
单片机·嵌入式硬件
ACP广源盛139246256735 小时前
IX8024 对标 ASM2824 @ACP#搭配昆仑芯 P800 构建 AI 服务器 PCIe4.0 高速互联架构
网络·人工智能·嵌入式硬件·电脑
踏着七彩祥云的小丑5 小时前
嵌入式测试学习第 15 天:逻辑门基础:与或非、简单逻辑电路
单片机·嵌入式硬件
Ligocious6 小时前
stm32---2.按键触发外部中断
stm32·单片机
rit84324996 小时前
STM32F4 USB Host 功能实现
stm32·单片机·嵌入式硬件
金戈鐡馬7 小时前
定时器+中断优化单总线通信
stm32·单片机·嵌入式硬件
cici158747 小时前
STM32 + VS1003/VS1053 MP3播放器SD卡读取程序
stm32·单片机·嵌入式硬件