21ic问答首页 - GD32E230使用高级定时器的比较输出
GD32E230使用高级定时器的比较输出 赏100家园币
风来吴山2021-04-08
初始化的时候就死机了,不知道怎么使用高级定时器的比较输出模式
void b_timer_config(uint16_t __pres, uint16_t __period, uint16_t __pulse)
{
// timer_oc_parameter_struct timer_ocinitpara;
timer_parameter_struct timer_initpara;
timer_break_parameter_struct timer_breakpara;
rcu_periph_clock_enable(RCU_TIMER0);
timer_deinit(TIMER0);
timer_struct_para_init(&timer_initpara);
timer_initpara.prescaler = __pres;
timer_initpara.alignedmode = TIMER_COUNTER_EDGE;
timer_initpara.counterdirection = TIMER_COUNTER_UP;
timer_initpara.period = __period; // 10KHz
timer_initpara.clockdivision = TIMER_CKDIV_DIV1;
timer_initpara.repetitioncounter = 0;
timer_init(TIMER0, &timer_initpara);
// timer_channel_output_struct_para_init(&timer_ocinitpara);
// timer_ocinitpara.outputstate = TIMER_CCX_ENABLE;
// timer_ocinitpara.outputnstate = TIMER_CCXN_DISABLE;
// timer_ocinitpara.ocpolarity = TIMER_OC_POLARITY_HIGH;
// timer_ocinitpara.ocnpolarity = TIMER_OCN_POLARITY_HIGH;
// timer_ocinitpara.ocidlestate = TIMER_OC_IDLE_STATE_LOW;
// timer_ocinitpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW;
// timer_channel_output_config(TIMER0, TIMER_CH_0, &timer_ocinitpara);
timer_break_struct_para_init(&timer_breakpara);
timer_breakpara.runoffstate = TIMER_ROS_STATE_ENABLE;
timer_breakpara.ideloffstate = TIMER_IOS_STATE_ENABLE;
timer_breakpara.deadtime = 164;
timer_breakpara.breakpolarity = TIMER_BREAK_POLARITY_LOW;
timer_breakpara.outputautostate = TIMER_OUTAUTO_ENABLE;
timer_breakpara.protectmode = TIMER_CCHP_PROT_OFF;
timer_breakpara.breakstate = TIMER_BREAK_ENABLE;
timer_break_config(TIMER0, &timer_breakpara);
timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_0, __pulse);
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_primary_output_config(TIMER0, ENABLE);
nvic_irq_enable(TIMER0_Channel_IRQn, 1);
timer_interrupt_enable(TIMER0, TIMER_INT_CH0);
timer_interrupt_disable(TIMER0, TIMER_INT_BRK);
timer_auto_reload_shadow_enable(TIMER0);
timer_enable(TIMER0);
}
void TIMER0_IRQHandler(void)
{
static uint8_t status = 0;
if (SET == timer_interrupt_flag_get(TIMER0, TIMER_INT_CH0))
{
status++;
switch (status % 3){
case 0:
printf("a\n");
timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_0, tim[B.idle);
timer_channel_output_pulse_value_config(TIMER15, TIMER_CH_0, 0);
break;
case 1:
printf("b\n");
timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_0, tim[B.t_off);
timer_channel_output_pulse_value_config(TIMER15, TIMER_CH_0, 0);
break;
case 2:
printf("c\n");
timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_0, tim[B.t_on);
timer_channel_output_pulse_value_config(TIMER15, TIMER_CH_0, pwm_ch[B.pulse);
break;
default:
break;
}
timer_interrupt_flag_clear(TIMER0, TIMER_INT_CH0);
}
}
void b_timer_config(uint16_t __pres, uint16_t __period, uint16_t __pulse)
{
// timer_oc_parameter_struct timer_ocinitpara;
timer_parameter_struct timer_initpara;
timer_break_parameter_struct timer_breakpara;
rcu_periph_clock_enable(RCU_TIMER0);
timer_deinit(TIMER0);
timer_struct_para_init(&timer_initpara);
timer_initpara.prescaler = __pres;
timer_initpara.alignedmode = TIMER_COUNTER_EDGE;
timer_initpara.counterdirection = TIMER_COUNTER_UP;
timer_initpara.period = __period; // 10KHz
timer_initpara.clockdivision = TIMER_CKDIV_DIV1;
timer_initpara.repetitioncounter = 0;
timer_init(TIMER0, &timer_initpara);
// timer_channel_output_struct_para_init(&timer_ocinitpara);
// timer_ocinitpara.outputstate = TIMER_CCX_ENABLE;
// timer_ocinitpara.outputnstate = TIMER_CCXN_DISABLE;
// timer_ocinitpara.ocpolarity = TIMER_OC_POLARITY_HIGH;
// timer_ocinitpara.ocnpolarity = TIMER_OCN_POLARITY_HIGH;
// timer_ocinitpara.ocidlestate = TIMER_OC_IDLE_STATE_LOW;
// timer_ocinitpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW;
// timer_channel_output_config(TIMER0, TIMER_CH_0, &timer_ocinitpara);
timer_break_struct_para_init(&timer_breakpara);
timer_breakpara.runoffstate = TIMER_ROS_STATE_ENABLE;
timer_breakpara.ideloffstate = TIMER_IOS_STATE_ENABLE;
timer_breakpara.deadtime = 164;
timer_breakpara.breakpolarity = TIMER_BREAK_POLARITY_LOW;
timer_breakpara.outputautostate = TIMER_OUTAUTO_ENABLE;
timer_breakpara.protectmode = TIMER_CCHP_PROT_OFF;
timer_breakpara.breakstate = TIMER_BREAK_ENABLE;
timer_break_config(TIMER0, &timer_breakpara);
timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_0, __pulse);
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_primary_output_config(TIMER0, ENABLE);
nvic_irq_enable(TIMER0_Channel_IRQn, 1);
timer_interrupt_enable(TIMER0, TIMER_INT_CH0);
timer_interrupt_disable(TIMER0, TIMER_INT_BRK);
timer_auto_reload_shadow_enable(TIMER0);
timer_enable(TIMER0);
}
void TIMER0_IRQHandler(void)
{
static uint8_t status = 0;
if (SET == timer_interrupt_flag_get(TIMER0, TIMER_INT_CH0))
{
status++;
switch (status % 3){
case 0:
printf("a\n");
timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_0, tim[B.idle);
timer_channel_output_pulse_value_config(TIMER15, TIMER_CH_0, 0);
break;
case 1:
printf("b\n");
timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_0, tim[B.t_off);
timer_channel_output_pulse_value_config(TIMER15, TIMER_CH_0, 0);
break;
case 2:
printf("c\n");
timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_0, tim[B.t_on);
timer_channel_output_pulse_value_config(TIMER15, TIMER_CH_0, pwm_ch[B.pulse);
break;
default:
break;
}
timer_interrupt_flag_clear(TIMER0, TIMER_INT_CH0);
}
}
赞0
评论
2021-11-16
赞0
评论
2021-11-09
赞0
已经解决了。
评论
2021-04-11
赞0
嗯,是的。
评论
2021-04-11
赞0
那你自己思考了吗,至少单步调试一下,看看是哪一行代码,读写哪个寄存器时出的问题?死机,是怎么个死法,死机这个词太笼统了,是出现异常fault了吗,你自己都描述不清楚自己的问题,让别人怎么帮你
评论
2021-04-09
赞0
评论
2021-04-09
赞0
仿真看一下,程序究竟停在什么地方,然后再分析。官方的定时器库文件介绍的不是很能理解,包括STM32也一个屌样,所以,咱在使用定时器相关功能的时候,都是使用寄存器编程,其他外设用库文件。
评论
2021-04-09
赞0
说的很清楚了,这段代码运行就死机,不想思考就别答。
评论
2021-04-09
赞0
评论
2021-04-08
您需要登录后才可以回复 登录 | 注册