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