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

相关推荐
今天的你比昨天进步了?11 小时前
单片机程序,keil可以正常编译,VScode编译报错处理
vscode·单片机·嵌入式硬件
linbaiwan66611 小时前
42V/50V/60V高耐压OVP保护芯片的应用——PW1600实测70V耐压
嵌入式硬件
嵌入式小站11 小时前
STM32 零基础可移植教程 24:SPI Flash 读数据,先从指定地址读几个字节
chrome·stm32·嵌入式硬件
崇山峻岭之间12 小时前
单片机汉字显示实验
单片机·嵌入式硬件
guygg8812 小时前
基于C# + Halcon的通用ROI绘制工具
stm32·单片机·c#
yugi98783813 小时前
基于 RFID 的智能公交刷卡系统
stm32·嵌入式硬件
点灯小铭13 小时前
基于单片机的雨量检测智能汽车雨刮器模拟系统设计与实现
单片机·嵌入式硬件·汽车·毕业设计·课程设计·期末大作业
三佛科技-1341638421214 小时前
腕式血压计方案开发设计,腕式血压计MCU控制芯片选择
单片机·嵌入式硬件·物联网·智能家居
cici1587414 小时前
C# LAS 点云读取与处理工具
stm32·单片机·c#