关于#GD32呼吸灯#的问题,如何解决?

我用的是GD32的单片机,把两个LED灯接到两个管脚PI7,PI9上,想让这两个LED灯同时有呼吸效果

img

只配置了PI7的管脚,用的高级定时器7

PI9要怎么处理?现在就是PI7管脚上的灯会呼吸,PI9不知道怎么办

还有个问题就是定时器的PWM输出后,我再改变管脚的高低电平都不能让LED灯亮暗了,这是咋回事

感谢!

用定时器中断+GPIO控制引脚反转,即可实现LED呼吸灯的功能!

以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:

你可以按照以下步骤来解决这个问题:

  1. 配置PI9的管脚,并使用同样的高级定时器7来控制它。你可以使用定时器的另一个PWM通道来控制PI9的管脚,具体的配置方法可以参考你已经配置好的PI7的管脚。

  2. 在定时器的PWM输出后,你需要通过改变管脚的高低电平来让LED灯亮暗。如果你的代码无法实现这个功能,可能是因为你没有正确地配置GPIO的模式和输出类型。你可以检查一下你的GPIO配置是否正确,以确保它们能够正确地控制LED灯的亮度。

以下是一个简单的例子,可以帮助你了解如何控制两个LED灯同时呼吸:

#include "gd32f30x.h"

void timer7_init(void)
{
    /* 使能定时器时钟 */
    rcu_periph_clock_enable(RCU_TIMER7);

    /* 配置定时器基本参数 */
    timer_deinit(TIMER7);
    timer_parameter_struct timer_initpara;

    timer_initpara.prescaler         = 5999;
    timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;
    timer_initpara.counterdirection  = TIMER_COUNTER_UP;
    timer_initpara.period            = 99;
    timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;
    timer_init(TIMER7, &timer_initpara);

    /* 配置PWM输出通道1和通道2的参数 */
    timer_oc_parameter_struct timer_ocinitpara;

    timer_ocinitpara.ocpolarity       = TIMER_OC_POLARITY_HIGH;
    timer_ocinitpara.outputstate      = TIMER_CCX_ENABLE;
    timer_ocinitpara.ocnpolarity      = TIMER_OCN_POLARITY_HIGH;
    timer_ocinitpara.outputnstate     = TIMER_CCXN_DISABLE;
    timer_ocinitpara.ocidlestate      = TIMER_OC_IDLE_STATE_LOW;
    timer_ocinitpara.outputnidlestate = TIMER_OCN_IDLE_STATE_HIGH;

    timer_channel_output_config(TIMER7, TIMER_CH_0, &timer_ocinitpara);
    timer_channel_output_config(TIMER7, TIMER_CH_1, &timer_ocinitpara);

    /* 启用定时器PWM输出 */
    timer_primary_output_config(TIMER7, ENABLE);
    timer_update_disable(TIMER7);
    timer_enable(TIMER7);
}

void gpio_init(void)
{
    /* 使能GPIO时钟 */
    rcu_periph_clock_enable(RCU_GPIOI);

    /* 配置PI7和PI9的GPIO模式和输出类型 */
    gpio_init(GPIOI, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7);
    gpio_init(GPIOI, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);
    gpio_pin_remap_config(GPIOI, GPIO_PCF7_TIMER7CH0, ENABLE);
    gpio_pin_remap_config(GPIOI, GPIO_PCF9_TIMER7CH1, ENABLE);
}

int main(void)
{
    timer7_init();
    gpio_init();

    while(1);
}

在这个例子中,我们使用了高级定时器7来控制两个LED灯(分别连接到PI7和PI9管脚),并实现了呼吸效果。注意,我们使用了定时器的PWM输出来控制LED的亮度,而不是直接改变管脚的高低电平。


    timer_oc_parameter_struct timer_ocintpara;
    timer_parameter_struct timer_initpara;
    
    rcu_periph_clock_enable(RCU_GPIOI);
    rcu_periph_clock_enable(RCU_TIMER7);
    
    gpio_mode_set(GPIOI, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_9);
    gpio_af_set(GPIOI, GPIO_AF_9, GPIO_PIN_9);
    gpio_output_options_set(GPIOI,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_9);

    
    gpio_mode_set(GPIOI, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_7);
    gpio_af_set(GPIOI, GPIO_AF_3, GPIO_PIN_7);
    gpio_output_options_set(GPIOI,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_7);
    
    timer_deinit(TIMER7);

    /* TIMER7 configuration */
    timer_initpara.prescaler         = (SystemCoreClock/1000)/8-1;//(SystemCoreClock/1000)/8-1;//21000-1
    timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;
    timer_initpara.counterdirection  = TIMER_COUNTER_UP;
    timer_initpara.period            = 40-1;//(4-1: 1ms, 40-1: 10ms  400-1: 100ms)
    timer_initpara.clockdivision     = TIMER_CKDIV_DIV4;//TIMER_CKDIV_DIV1;
    timer_initpara.repetitioncounter = 0;
    timer_init(TIMER7,&timer_initpara);
    
    /* PWM初始化 */
    timer_ocintpara.ocpolarity   = TIMER_OC_POLARITY_HIGH;       //通道输出极性
    timer_ocintpara.outputstate  = TIMER_CCX_ENABLE;            //通道输出状态
    timer_ocintpara.ocidlestate  = TIMER_OC_IDLE_STATE_HIGH;     //通道处于空闲时的输出    
    timer_ocintpara.ocnpolarity  = TIMER_OCN_POLARITY_HIGH;     //互补通道输出极性 
    timer_ocintpara.outputnstate = TIMER_CCXN_DISABLE;          //互补通道输出状态
    timer_ocintpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW;    //互补通道处于空闲时的输出
    timer_channel_output_config(TIMER7,TIMER_CH_2,&timer_ocintpara);
    timer_channel_output_config(TIMER7,TIMER_CH_1,&timer_ocintpara);
    

    timer_channel_output_pulse_value_config(TIMER7, TIMER_CH_1, 0);
    timer_channel_output_mode_config(TIMER7,TIMER_CH_1,TIMER_OC_MODE_PWM0);
    timer_channel_output_shadow_config(TIMER7,TIMER_CH_1,TIMER_OC_SHADOW_DISABLE);    

    
    timer_channel_output_pulse_value_config(TIMER7, TIMER_CH_2, 0);
    timer_channel_output_mode_config(TIMER7,TIMER_CH_2,TIMER_OC_MODE_PWM0);
    timer_channel_output_shadow_config(TIMER7,TIMER_CH_2,TIMER_OC_SHADOW_DISABLE);
    
    timer_primary_output_config(TIMER7,ENABLE);

    timer_interrupt_enable(TIMER7, TIMER_INT_UP);
    nvic_priority_group_set(NVIC_PRIGROUP_PRE4_SUB0);  // 抢占优先级4位,响应优先级0位
    nvic_irq_enable(TIMER7_UP_TIMER12_IRQn, 1, 0);
    timer_interrupt_flag_clear(TIMER7, TIMER_INT_FLAG_UP);
    
    /* TIMER7 counter enable */
    timer_auto_reload_shadow_enable(TIMER7);
    //timer_enable(TIMER7);

这是代码,只有一个灯亮