GD32F30X单片机开发 — PWM输出
配置
1. 引脚初始化
- 使能GPIOA时钟
- 使能AF时钟
2. 定时器初始化
高级定时器PWM初始化
- 使能定时器0时钟
- 去初始化
- 设置:周期值,预分频系数,计数模式,对齐模式,采样分时钟分频
- 定时器通道输出配置:
输出状态;输出极性;空闲状态;输出通道;输出模式 - 使能定时器
代码
/* 引脚复用配置 */
void gpio_config()
{
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_AF);
gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_8);
}
/* 高级定时器PWM初始化 */
void Timer_PWM_Init()
{
rcu_periph_clock_enable(RCU_TIMER0); /* 使能定时器0时钟 */
timer_deinit(TIMER0); /* 去初始化 */
timer_parameter_struct timer_initpara;
timer_initpara.prescaler = 1 - 1; /* 预分频器值 */
timer_initpara.alignedmode = TIMER_COUNTER_EDGE; /* 对齐模式:边沿对齐模式(无对齐模式)*/
timer_initpara.counterdirection = TIMER_COUNTER_UP; /* 向上计数模式 */
timer_initpara.period = 7200 - 1; /* 配置周期*/
timer_initpara.clockdivision = TIMER_CKDIV_DIV1; /* 时钟分频 */
timer_initpara.repetitioncounter = 0; /* 重复计数器值 */
timer_init(TIMER0, &timer_initpara); /* 初始化定时器0 */
/*
占空比:在一个周期内,高电平所占的时间;占空比 = 脉冲数 / 周期值
周期值最好和65535相近,占空比控制效果更好
频率:系统主频 / 预分频系数 / 周期值 / 采样分频
*/
/* 配置PWM模式0 */
timer_oc_parameter_struct timer_ocintpara;
timer_ocintpara.ocpolarity = TIMER_OC_POLARITY_HIGH; /* 输出极性 */
timer_ocintpara.ocnpolarity = TIMER_OCN_POLARITY_HIGH; /* 互补输出极性 */
timer_ocintpara.outputstate = TIMER_CCX_ENABLE; /* 输出状态 */
timer_ocintpara.outputnstate = TIMER_CCXN_DISABLE; /* 互补输出状态 */
timer_ocintpara.ocidlestate = TIMER_OC_IDLE_STATE_LOW; /* 空闲输出状态 */
timer_ocintpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW; /* 互补输出状态 */
timer_channel_output_config(TIMER0, TIMER_CH_0, &timer_ocintpara); /* 定时通道输出配置 */
timer_channel_output_mode_config(TIMER0, TIMER_CH_0, TIMER_OC_MODE_PWM0); /* 定时器通道输出模式配置: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_channel_output_pulse_value_config(TIMER0, TIMER_CH_0, 0); /* 占空比初始值0 */
timer_enable(TIMER0); /* 使能定时器0 */
}
/* 主函数 */
int main(void)
{
gpio_config();
Timer_PWM_Init();
INT16U i = 0;
while(1)
{
Delay100Ms(10);
i += 1800;
if(i > 7200)
{
i = 0;
}
timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_0, i); /* 每1s占空比加大25% */
}
}