GD32F303开发 ----- 定时器产生PWM实现呼吸灯

概述:

        本章就以GD32F303Rx开发板为例,主要配置定时器输出PWM信号,并调节占空比从而实现呼吸灯的效果,占空比逐渐变大,则灯就越亮

一、原理图连接

 查看原理图,获得信息LED0的管脚为PA8。

 二、PWM通道

 

 查看GD32F303数据手册找到GD32F303Rx引脚定义,然后找到LED引脚信息,可以看出PA8对应的是TIME0的CH0通道。

三、核心代码

 1、初始化GPIO

/* GPIO配置函数 */
void gpio_config(void)
{
    rcu_periph_clock_enable(RCU_GPIOA);
    rcu_periph_clock_enable(RCU_AF);

    /* 配置 PA8 引脚为复用推挽输出模式 */
    gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_8);
}

2、初始化定时器

// 定时器配置函数
void timer_config(void)
{
    timer_oc_parameter_struct timer_ocintpara;
    timer_parameter_struct timer_initpara;

    rcu_periph_clock_enable(RCU_TIMER0);

    timer_deinit(TIMER0);

    /* 定时器配置 */
    timer_initpara.prescaler         = 119;
    timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;
    timer_initpara.counterdirection  = TIMER_COUNTER_UP;
    timer_initpara.period            = 15999;
    timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;
    timer_initpara.repetitioncounter = 0;
    timer_init(TIMER0, &timer_initpara);

    /* PWM模式下配置 CH0、CH1 和 CH2 */
    timer_ocintpara.outputstate  = TIMER_CCX_ENABLE;
    timer_ocintpara.outputnstate = TIMER_CCXN_DISABLE;
    timer_ocintpara.ocpolarity   = TIMER_OC_POLARITY_HIGH;
    timer_ocintpara.ocnpolarity  = TIMER_OCN_POLARITY_HIGH;
    timer_ocintpara.ocidlestate  = TIMER_OC_IDLE_STATE_LOW;
    timer_ocintpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW;

    // 配置 TIMER0 通道输出功能
    timer_channel_output_config(TIMER0, TIMER_CH_0, &timer_ocintpara);

    /* CH0 以 PWM 模式工作,占空比为 0% */
    timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_0, 0);
    timer_channel_output_mode_config(TIMER0, TIMER_CH_0, TIMER_OC_MODE_PWM0);
    timer_channel_output_shadow_config(TIMER0, TIMER_CH_0, TIMER_OC_SHADOW_DISABLE);

	/* 配置 TIMER 主输出功能 */
	timer_primary_output_config(TIMER0, ENABLE);

    /* 自动重装载预装载使能 */
    timer_auto_reload_shadow_enable(TIMER0);
    /* 定时器使能 */
    timer_enable(TIMER0);
}

3、调节占空比递增、递减

void PWM_OUT(void)
{
    int16_t duty_cycle = 0;
    FlagStatus breathe_flag = SET;

    while (1) {
        /* 延迟一段时间,单位为毫秒 */
        delay_1ms(40);

        if (SET == breathe_flag) {
            duty_cycle = duty_cycle + 500;
        } else {
            duty_cycle = duty_cycle - 500;
        }

        if (16000 < duty_cycle) {
            breathe_flag = RESET;
        }
        if (0 >= duty_cycle) {
            breathe_flag = SET;
        }

        /* 配置 TIMER0 通道输出脉冲值 */
        timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_0, duty_cycle);
    }
}

4、 main函数

int main(void)
{
    systick_config();  							// 配置 SysTick 定时器 
	gpio_config();                              
    timer_config();	                            
	
	PWM_OUT ();
}

 以上就是GD32F303开发板配置定时器输出PWM信号,并实现呼吸灯的方法和步骤,欢迎留言讨论。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值