打印

GD32A503 TIMER 上溢UP中断与CAP中断优先级有一定几率反转问题

[复制链接]
9570|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hsyy|  楼主 | 2024-6-18 10:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
测试硬件:GD32A503CC测试外设:TIMER0_CH1
测试准备:PE5输入高频PWM
中断优先级配置:UP中断高于CH1中断
void nvic_configuration(void)
{
    nvic_priority_group_set(NVIC_PRIGROUP_PRE1_SUB3);
    nvic_irq_enable(TIMER0_BRK_UP_TRG_CMT_IRQn, 1, 0);
    nvic_irq_enable(TIMER0_Channel_IRQn, 1, 1);
}

测试定时器配置:配置TIMER0_CH1为双沿输入捕获模式,使能TIMER0 UP上溢与CH1中断。
void timer_configuration(void)
{
    /* TIMER1 configuration: input capture mode -------------------
    the external signal is connected to TIMER0 CH1 pin (PE5)
    the rising edge is used as active edge
    the TIMER1 CH0CV is used to compute the frequency value
    ------------------------------------------------------------ */
    timer_ic_parameter_struct timer_icinitpara;
    timer_parameter_struct timer_initpara;

    rcu_periph_clock_enable(RCU_TIMER0);

    timer_deinit(TIMER0);
    /* TIMER0 configuration */
    timer_struct_para_init(&timer_initpara);
    timer_initpara.prescaler         = 99;
    timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;
    timer_initpara.counterdirection  = TIMER_COUNTER_UP;
    timer_initpara.period            = 65535;
    timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;
    timer_initpara.repetitioncounter = 0;
    timer_init(TIMER0, &timer_initpara);

    /* TIMER0 configuration */
    /* TIMER0 CH1 input capture configuration */
    timer_channel_input_struct_para_init(&timer_icinitpara);
    timer_icinitpara.icpolarity  = TIMER_IC_POLARITY_BOTH_EDGE;
    timer_icinitpara.icselection = TIMER_IC_SELECTION_DIRECTTI;
    timer_icinitpara.icprescaler = TIMER_IC_PSC_DIV1;
    timer_icinitpara.icfilter    = 0x0;
    timer_input_capture_config(TIMER0, TIMER_CH_1, &timer_icinitpara);

    /* auto-reload preload enable */
    timer_auto_reload_shadow_enable(TIMER0);
    /* clear channel 0 interrupt bit */
    timer_interrupt_flag_clear(TIMER0, TIMER_INT_FLAG_UP);
    /* channel 0 interrupt enable */
    timer_interrupt_enable(TIMER0, TIMER_INT_UP);
    /* clear channel 0 interrupt bit */
    timer_interrupt_flag_clear(TIMER0, TIMER_INT_FLAG_CH1);
    /* channel 0 interrupt enable */
    timer_interrupt_enable(TIMER0, TIMER_INT_CH1);

    /* TIMER0 counter enable */
    timer_enable(TIMER0);
}

中断处理:
__IO uint16_t u16_cap_tick = 0;
__IO uint32_t u32_cap_tick = 0;
__IO uint32_t u32_cap_tick_pre = 0;
__IO uint16_t ovf_cont = 0;
__IO uint32_t err_cnt = 0;


void TIMER0_BRK_UP_TRG_CMT_IRQHandler(void)
{
    if(SET == timer_interrupt_flag_get(TIMER0, TIMER_INT_FLAG_UP)) {
        /* clear channel1 interrupt bit */
        timer_interrupt_flag_clear(TIMER0, TIMER_INT_FLAG_UP);

        /* count overflow value */
        ovf_cont++;


    }
}


void TIMER0_Channel_IRQHandler(void)
{
    if(SET == timer_interrupt_flag_get(TIMER0, TIMER_INT_FLAG_CH1)) {
        /* clear channel1 interrupt bit */
        timer_interrupt_flag_clear(TIMER0, TIMER_INT_FLAG_CH1);

        /* read channel 1 capture value */
        u16_cap_tick = timer_channel_capture_value_register_read(TIMER0, TIMER_CH_1);

        u32_cap_tick_pre = u32_cap_tick;
        u32_cap_tick = u16_cap_tick + (ovf_cont << 16);

        if(u32_cap_tick_pre > u32_cap_tick)
        {
          err_cnt++;
        }
    }
}

出现问题:TIMER0 CNT接近上溢时发生CH1捕获中断, 捕获中断有一定几率先于UP中断处理,导致err_cnt计数错误。
示例中,err_cnt会有计数。

使用特权

评论回复
沙发
gfiygi| | 2024-6-19 16:21 | 只看该作者
顶啊,我用的GD32F103,也是定时器上溢出触发比较中断,发帖没人回复。

使用特权

评论回复
板凳
liu96jp| | 2024-6-26 12:40 | 只看该作者
这个问题可能是由于中断优先级配置不正确导致的。

使用特权

评论回复
地板
t1ngus4| | 2024-6-26 13:43 | 只看该作者
在ARM Cortex-M处理器中,中断优先级是通过NVIC(Nested Vectored Interrupt Controller)来管理的

使用特权

评论回复
5
w2nme1ai7| | 2024-6-26 14:55 | 只看该作者
每个中断都有一个优先级,优先级较高的中断会在优先级较低的中断之前被处理

使用特权

评论回复
6
p0gon9y| | 2024-6-26 16:17 | 只看该作者
在处理器中,有两个中断优先级寄存器:NVIC_IPR(Interrupt Priority Register)和NVIC_PRIO_BITS

使用特权

评论回复
7
q1d0mnx| | 2024-6-26 17:22 | 只看该作者
NVIC_IPR用于配置每个中断的优先级,而NVIC_PRIO_BITS则用于确定中断优先级的位数

使用特权

评论回复
8
y1n9an| | 2024-6-26 18:30 | 只看该作者
当你遇到TIMER上溢UP中断与CAP中断优先级有一定几率反转的问题时,可能是因为你没有正确配置这两个中断的优先级

使用特权

评论回复
9
b5z1giu| | 2024-6-26 20:10 | 只看该作者
确保UP中断的优先级高于CAP中断的优先级,这样才能保证UP中断在CAP中断之前被处理

使用特权

评论回复
10
l1uyn9b| | 2024-6-27 08:07 | 只看该作者
要确保在中断服务程序中正确清除中断标志位,以避免中断重复触发

使用特权

评论回复
11
d1ng2x| | 2024-6-27 10:00 | 只看该作者
如果你已经确认了中断优先级配置的正确性,但问题仍然存在,建议你联系芯片厂商或者开发工具的技术支持团队,他们可能会有更专业的解决方案

使用特权

评论回复
12
cen9ce| | 2024-6-27 12:30 | 只看该作者
一般你说的有几率翻转是什么现象?能把你的程序代码发出来看看吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

4

帖子

0

粉丝