GD32A503 定时器7两路输入捕获不能同时工作

[复制链接]
1647|8
zjsxhwl 发表于 2025-10-22 16:17 | 显示全部楼层 |阅读模式
void timer7_config_icp(void)
{
    timer_ic_parameter_struct timer_icinitpara;
    timer_parameter_struct timer_initpara;
    rcu_periph_clock_enable(RCU_TIMER7);
    timer_deinit(TIMER7);

    timer_initpara.prescaler         = 1999;//100M/2000=0.05MHZ
    timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;
    timer_initpara.counterdirection  = TIMER_COUNTER_UP;
    timer_initpara.period            = 65536-1;
    timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;
    timer_initpara.repetitioncounter = 4;
    timer_init(TIMER7, &timer_initpara);

          timer_input_trigger_source_select(TIMER7, TIMER_SMCFG_TRGSEL_CI0FE0| TIMER_SMCFG_TRGSEL_CI1FE1);    // 输入触发源为通道0
    timer_slave_mode_select(TIMER7, TIMER_SLAVE_MODE_RESTART);               // 从模式选择为复位模式
    timer_master_slave_mode_config(TIMER7, TIMER_MASTER_SLAVE_MODE_ENABLE);  // 使能从模式

       
          timer_icinitpara.icpolarity = TIMER_IC_POLARITY_RISING; // 配置了 CH0P   [CH0NP==0, CH0P==0]:把 CIxFE0 的上升沿作为捕获或者从模式下触发的有效信号,并且 CIxFE0 不会被翻转。
          timer_icinitpara.icselection = TIMER_IC_SELECTION_DIRECTTI;
          timer_icinitpara.icprescaler = TIMER_IC_PSC_DIV1;
          timer_icinitpara.icfilter = 4;
          timer_input_pwm_capture_config(TIMER7, TIMER_CH_0|TIMER_CH_1, &timer_icinitpara);

    timer_auto_reload_shadow_enable(TIMER7);
                timer_interrupt_flag_clear(TIMER7, TIMER_INT_CH0|TIMER_INT_CH1);  // 清除通道0中断标志位
    timer_interrupt_enable(TIMER7, TIMER_INT_CH0|TIMER_INT_CH1);      // 使能通道0中断
  
               
                nvic_priority_group_set(NVIC_PRIGROUP_PRE4_SUB0);   // 抢占优先级4位,响应优先级0位
    nvic_irq_enable(TIMER7_Channel_IRQn, 0, 0);         // 使能中断服务,抢占优先级为1
          timer_enable(TIMER7);       
}
 楼主| zjsxhwl 发表于 2025-10-22 16:20 | 显示全部楼层
这个设置有问题吗
 楼主| zjsxhwl 发表于 2025-10-22 16:23 | 显示全部楼层
void TIMER7_Channel_IRQHandler(void)//
{
        uint16_t readvalue1,readvalue2,count;
        static uint8_t ccnumber;
  static uint16_t count_old;
       
        if(SET == timer_interrupt_flag_get(TIMER7,TIMER_INT_CH1)){
                 timer_interrupt_flag_clear(TIMER7,TIMER_INT_CH1);
               
                    My_fre_out = 0;
               
        if(0 == ccnumber){
            // read channel 0 capture value
            readvalue1 = timer_channel_capture_value_register_read(TIMER7,TIMER_CH_0);
            ccnumber = 1;
        }else if(1 == ccnumber){
            // read channel 0 capture value
            readvalue2 = timer_channel_capture_value_register_read(TIMER7,TIMER_CH_0);

            if(readvalue2 >= readvalue1){
                count = (readvalue2 - readvalue1);
            }else{
                count = ((0xFFFF - readvalue1) + readvalue2);
            }
                                       

                                         if((count<50000) &&(count>35))  //My_fre = (float)50000 / count;
           {
                                           if(My_fre_fre1 == 0){My_fre0 = (float)50000 / count; My_fre_fre1 = 1; }
                                                 else                {My_fre1 = (float)50000 / count; My_fre_fre1 = 0; }  
                                                 
                                                 My_fre = My_fre0 + My_fre1;
                                         }
                                         
           ccnumber = 0;
                                               
        }
                        }
     if(SET == timer_interrupt_flag_get(TIMER7,TIMER_INT_CH0)){
                            timer_interrupt_flag_clear(TIMER7,TIMER_INT_CH0);
                            My_fre_out_ZS++;//=178;
                                                    
                                        }       
       
}       
dffzh 发表于 2025-10-23 10:10 | 显示全部楼层
分别用一路进行测试时,是都可以正常工作吗?
 楼主| zjsxhwl 发表于 2025-10-23 11:36 | 显示全部楼层
分开正常的
 楼主| zjsxhwl 发表于 2025-10-23 11:39 | 显示全部楼层
我是用在汽油车上的,一路车速表,一路转速表。
sunjd 发表于 2025-10-24 09:42 | 显示全部楼层
1.代码中 timer_input_trigger_source_select 函数试图同时选择通道0和通道1作为触发源(TIMER_SMCFG_TRGSEL_CI0FE0 | TIMER_SMCFG_TRGSEL_CI1FE1)。通常情况下,一个定时器在从模式下只能选择一个触发源。同时选择两个可能会造成冲突,导致定时器无法正确复位,从而影响捕获。
尝试只选择一个通道作为触发源。例如,如果你希望用通道0的上升沿来复位定时器,可以只设置 TIMER_SMCFG_TRGSEL_CI0FE0。这通常用于精确测量频率或占空比。如果两个通道的信号是独立的,并且你只是想简单测量各自的脉冲,可以考虑不使用从模式(复位模式),而是让定时器自由运行,通过捕获事件来读取CNT值并计算差值。      代码中使用 timer_input_pwm_capture_config 同时配置了通道0和通道1,并且参数完全相同(都是上升沿)。如果你的目标是测量一个完整PWM波的周期和占空比,通常需要一个通道捕获上升沿(周期),另一个通道捕获下降沿(占空比)
2.如果两路信号是独立的,也需要确保它们都能正确触发中断。
分别配置两个通道。你可以先配置通道0,然后修改 timer_icinitpara 中的参数(例如极性),再配置通道1。确保每个通道的中断都能被正确使能。   
中国英茂科工 发表于 2025-10-24 09:49 | 显示全部楼层
不懂啊,帮不上忙,有压缩包,我测评一下。
 楼主| zjsxhwl 发表于 2025-10-24 13:49 | 显示全部楼层
sunjd 发表于 2025-10-24 09:42
1.代码中 timer_input_trigger_source_select 函数试图同时选择通道0和通道1作为触发源(TIMER_SMCFG_TRGSE ...

谢谢,分析的好!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

21

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部