我用的是GD32的单片机,把两个LED灯接到两个管脚PI7,PI9上,想让这两个LED灯同时有呼吸效果
只配置了PI7的管脚,用的高级定时器7
PI9要怎么处理?现在就是PI7管脚上的灯会呼吸,PI9不知道怎么办
还有个问题就是定时器的PWM输出后,我再改变管脚的高低电平都不能让LED灯亮暗了,这是咋回事
感谢!
用定时器中断+GPIO控制引脚反转,即可实现LED呼吸灯的功能!
以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:
你可以按照以下步骤来解决这个问题:
配置PI9的管脚,并使用同样的高级定时器7来控制它。你可以使用定时器的另一个PWM通道来控制PI9的管脚,具体的配置方法可以参考你已经配置好的PI7的管脚。
在定时器的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);
这是代码,只有一个灯亮