This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TM4 timer

我用TM4的timer来测脉宽,发现用timerccp0可以准确测量,然后换成ccp1就发现不行了,求教ccp0和ccp1的区别

  •  #include <stdbool.h>
    #include "inc/hw_types.h"
    #include "PulseWidth.h"

    uint32_t Fre_TimerOutCount1=0;
    uint32_t fre_temp_tick1=0;
    int Fre_Frequece_Index1 = 0;
    float Fre_Cur_Frequency1 = 0.000000;
    float fre1[FREQUENCY_AVARAGE_NUM1] = { 0.0 };

    uint32_t CapTimer_Fre_Ori1=0;

    void Init_WTimer2_Pluse() {
    // 启用WTIMER2模块
    SysCtlPeripheralEnable (SYSCTL_PERIPH_WTIMER2);
    SysCtlPeripheralEnable (SYSCTL_PERIPH_GPIOD);// 启用GPIO_M作为脉冲捕捉脚

    GPIOPinConfigure (GPIO_PD0_WT2CCP0);
    GPIOPinTypeTimer (GPIO_PORTD_BASE, GPIO_PIN_0);

    //GPIOPadConfigSet (GPIO_PORTD_BASE, GPIO_PIN_0, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);
    TimerConfigure (WTIMER2_BASE, // 配置使用WTimer2的TimerA模块为边沿触发减计数模式
    TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_CAP_TIME | TIMER_CFG_B_PERIODIC);
    TimerControlEvent (WTIMER2_BASE, TIMER_BOTH, TIMER_EVENT_BOTH_EDGES);// 使用 双边沿触发

    TimerLoadSet (WTIMER2_BASE, TIMER_A, 0xFFFFFFFF);
    TimerLoadSet (WTIMER2_BASE, TIMER_B, 0xFFFFFFFF);

    TimerIntRegister(WTIMER2_BASE, TIMER_A, Int_WTimer2A_Handler);
    TimerIntRegister(WTIMER2_BASE, TIMER_B, Int_WTimer2B_Handler);

    IntMasterEnable ();
    TimerIntEnable (WTIMER2_BASE, TIMER_CAPA_EVENT | TIMER_TIMB_TIMEOUT);
    IntEnable (INT_WTIMER2A | INT_WTIMER2B);
    TimerEnable (WTIMER2_BASE, TIMER_BOTH);
    }



    void Int_WTimer2A_Handler(void)
    {
    extern float Dis1;
    uint32_t CapTimer_Fre1 = 0;
    uint8_t flag1=1;
    if(GPIOPinRead(GPIO_PORTD_BASE,GPIO_PIN_0))
    {
    if(flag1)
    {
    TimerIntClear (WTIMER2_BASE, TimerIntStatus (WTIMER2_BASE, false));
    CapTimer_Fre1 = TimerValueGet(WTIMER2_BASE, TIMER_B);
    CapTimer_Fre_Ori1 = CapTimer_Fre1;
    Fre_TimerOutCount1 = 0;
    }
    else
    {
    TimerIntClear (WTIMER2_BASE, TimerIntStatus (WTIMER2_BASE, false));
    CapTimer_Fre1 = TimerValueGet(WTIMER2_BASE, TIMER_B);
    CapTimer_Fre_Ori1 = CapTimer_Fre1;
    Fre_TimerOutCount1 = 0;
    flag1=1;
    }

    }
    else
    {
    if(flag1)
    {
    TimerIntClear (WTIMER2_BASE, TimerIntStatus (WTIMER2_BASE, false));
    TimerEnable (WTIMER1_BASE, TIMER_A);
    CapTimer_Fre1 = TimerValueGet(WTIMER2_BASE, TIMER_B);
    if (Fre_TimerOutCount1 >= 1) fre_temp_tick1 = CapTimer_Fre_Ori1
    + ((Fre_TimerOutCount1 - 1) << 32 )+ (TIMER_TOTAL_COUNTNUM1 - CapTimer_Fre1);
    else
    fre_temp_tick1 = CapTimer_Fre_Ori1 - CapTimer_Fre1;


    Dis1=340*fre_temp_tick1/1000000;
    flag1=0;
    }
    else
    {
    TimerIntClear (WTIMER2_BASE, TimerIntStatus (WTIMER2_BASE, false));
    }
    }

    }

    void Int_WTimer2B_Handler(void)
    {
    TimerIntClear (WTIMER2_BASE,TimerIntStatus (WTIMER2_BASE, true));
    TimerEnable (WTIMER2_BASE, TIMER_B);
    Fre_TimerOutCount1++;
    这个是32位ccp0代码可行,直接把寄存器和端口改了,ccp1就不行了
  • 应该是其他地方还需要修改了,你没修改吧,比如时钟,你去主函数里面看看,有什么需要修改的了

  • 这两个没有区别的,对应修改好了之后就能正常运行的。

    检查一下配置的管脚是否能对应上,外设初始化配置是否正确,以及终端向量表映射等。

  • 我检查了没发现问题、、、那同一timer的ccp0和ccp1可以同时用吗?timerbase不会冲突吗?

  • 可以的,32/64bit的timer可以分成16/32bit的timera和timerb来使用,分别对应ccp0和ccp1.