【BUG】LED 灯无法点亮?确认GPIO初始化是否有配置成功

一、实验现象

在实验中,我尝试通过 STM32 的 GPIO 引脚点亮 LED 灯。当配置为推挽输出模式时,LED 灯正常点亮。但当我将模式配置为复用推挽输出时,LED 灯无法点亮,直到我正确配置了复用通道。
在实验时,我发现以下现象:

  • 当通过 STM32 的 GPIO 引脚点亮 LED 灯。当配置为推挽输出模式时,LED 灯正常点亮。但当我将模式配置为复用推挽输出时,LED 灯无法点亮。(没有配置复用通道)
  • 在用PWM输出点亮LED时,发现仅设置成推挽输出无法得到正确的输出电压;同样,设置成复用推挽输出也不起作用。后来发现问题在于没有打开复用通道。

二、原因分析

  • 推挽输出模式:适用于简单的数字电路设备,如LED灯。在这种模式下,GPIO引脚可以输出高电平或低电平。
    在这里插入图片描述
  • 复用推挽输出模式:当使用外设(如PWM)输出时,需要将引脚设置为复用推挽输出模式。这是因为复用推挽输出模式允许GPIO引脚通过特定的外设功能配置,从而驱动外设
    在这里插入图片描述
  • 未打开复用通道的问题:仅仅设置引脚为复用推挽输出模式还不够,必须确保相应的复用通道被正确开启。否则,引脚无法按照预期工作。

三、解决方法

STM32 GPIO 推挽输出与复用推挽输出的区别及应用场景

在嵌入式开发中,STM32 的 GPIO 配置是一个常见的任务。本文将详细解释推挽输出和复用推挽输出的区别,并通过具体的实验现象和解决方法,帮助你更好地理解和应用这两种输出模式。

一、实验现象

在实验中,我尝试通过 STM32 的 GPIO 引脚点亮 LED 灯。当配置为推挽输出模式时,LED 灯正常点亮。但当我将模式配置为复用推挽输出时,LED 灯无法点亮,直到我正确配置了复用通道。

二、原因分析

1. 推挽输出模式

推挽输出模式适用于简单的数字电路设备,如 LED 灯。在这种模式下,GPIO 引脚可以直接输出高电平或低电平。推挽输出模式的内部结构如下图所示:

推挽输出模式

2. 复用推挽输出模式

复用推挽输出模式适用于需要通过特定外设功能配置的场景,如 PWM 输出。在这种模式下,GPIO 引脚的输出电平不仅受 GPIO 配置影响,还受外设功能配置的影响。复用推挽输出模式的内部结构如下图所示:

复用推挽输出模式

3. 未打开复用通道的问题

仅仅设置引脚为复用推挽输出模式还不够,必须确保相应的复用通道被正确开启。否则,引脚无法按照预期工作。

三、解决方法

配置引脚模式,开启复用通道:

在设置引脚模式后,还需要在程序中正确配置并开启对应的复用通道。这通常涉及到对特定外设的控制寄存器进行设置。

在使用 PWM 输出点亮 LED 时,确保将相关引脚设置为复用推挽输出模式,并正确配置和开启对应的复用通道。以下是一个具体的代码示例:

// 配置 GPIO 引脚为复用推挽输出模式
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);

// 配置复用通道
GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_1);

// 配置 PWM 输出
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Period = 1000 - 1;
TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 500;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM2, &TIM_OCInitStructure);

TIM_Cmd(TIM2, ENABLE);

扩展:
GPIO Mode AF PP和GPIO Mode Out PP是STM32单片机中GPIO模式的两种配置。它们之间的区别如下:

  1. GPIO Mode AF PP(复用推挽输出):这种模式下,GPI0引脚可以通过复用功能配置为特定的外设功能,通常用于连接外设。该模式下,引脚的输出电平可以是高电平或低电平,通过推挽输出方式驱动外设。
  2. GPIO Mode Out PP(推挽输出):这种模式下,GPI0引脚被配置为普通的推挽输出模式。引脚的输出电平可以是高电平或低电平通过推挽输出方式驱动外部电路。

硬件电路上来了解的话看下面分析

软件上配置注意:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值