概述:
本章就以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信号,并实现呼吸灯的方法和步骤,欢迎留言讨论。