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.

[参考译文] CC1354P10:使用 GPTimer 作为具有匹配中断的外部边沿计数器

Guru**** 2460850 points
Other Parts Discussed in Thread: SYSCONFIG

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1552088/cc1354p10-using-gptimer-as-an-external-edge-counterwith-match-interrupt

部件号:CC1354P10
主题:SysConfig 中讨论的其他器件

工具/软件:

大家好、我正尝试使用 GPTimer 实现边沿计数器。  我已经为 GPTimer3 实现了该代码、并验证了来自电路板上 AM64x 的 100kHz 方波应用于 DIO11。

DIO11 - AM64_TO_CC_IRQ

/**************************************************************************************** //**

\details 初始化发送计时器 — 在边沿计数模式下使用 GPTIMER
有关一般信息、请参阅 TRM 第 17.3.2.2 节

我们的设置:
1.在 65536 个计数匹配的向上计数器
2.计数器复位为零并在匹配时生成 IRQ
3. ISR 将对的高 16 位中的 16 位溢出进行计数
总共 32 位计时器计数

\return void

\retval 无

****************************************************************************************** /
静态 void TxTimerInitialize( void )

//TODO 添加计时器初始化包括匹配回调的设置
GPIO_setConfigAndMux (AM64_TO_CC_IRQ、GPIO_CFG_INPUT、GPT_PIN_3A);// AM64x IRQ 输入路由到 GPTimer3A 事件

GPTimerCC26XX_Params_init (&TxTimerParams);

TxTimerParams.mode = GPT_MODE_EDGE_COUNT;
TxTimerParams.direction = GPTimerCC26XX_Direction_up;
TxTimerParams.matchTiming = GPTimerCC26XX_SET_MATCH_NEXT_CLOCK;
TxTimerParams.width = GPT_CFG_16BIT_TIMER;

TxTimerHandle = GPTimerCC26XX_open (twoway_10US_COUNTER、&TxTimerParams);

if( TxTimerHandle !=空)

GPTimerCC26XX_setCaptureEdge (TxTimerHandle、GPTimerCC26XX_POS_EDGE)
GPTimerCC26XX_setMatchValue (TxTimerHandle、0x10000);//匹配 16 位翻转
GPTimerCC26XX_registerInterrupt (TxTimerHandle、TxTimerCallback、GPT_INT_CAPTURE_Match);

TxTimerInitialized = true;
}
TxTimerCount = 0x0uL;
// Power_setDependency (PowerCC26XX_XOSC_HF);//仍然需要?

}

/********************************************************************************************

目的:启动 10us 脉冲计数器以清除累积的计数
注释:

****************************************************************************************** /
int16_t TXTIMER_ResetSyncTimer (void)

int16_t Ex = TXTIMER_EX_OK;

if(!TxTimerInitialized )

TxTimerInitialize();
}
// GPTimerCC26XX_STOP (TxTimerHandle);
GPTimerCC26XX_setLoadValue (TxTimerHandle、0x0uL);
TxTimerCount = 0uL;
TxTimerEnabled = true;
GPTimerCC26XX_enableInterrupt (TxTimerHandle、GPT_INT_CAPTURE_match);
GPTimerCC26XX_START (TxTimerHandle);
退货(例如);
}

/**************************************************************************************** //**

\details 初始化发送计时器 — 在边沿计数模式下使用 GPTIMER
有关一般信息、请参阅 TRM 第 17.3.2.2 节

我们的设置:
1.在 65536 个计数匹配的向上计数器
2.计数器复位为零并在匹配时生成 IRQ
3. ISR 将对的高 16 位中的 16 位溢出进行计数
总共 32 位计时器计数

\return void

\retval 无

****************************************************************************************** /
静态 void TxTimerInitialize( void )

//TODO 添加计时器初始化包括匹配回调的设置
GPIO_setConfigAndMux (AM64_TO_CC_IRQ、GPIO_CFG_INPUT、GPT_PIN_3A);// AM64x IRQ 输入路由到 GPTimer3A 事件

GPTimerCC26XX_Params_init (&TxTimerParams);

TxTimerParams.mode = GPT_MODE_EDGE_COUNT;
TxTimerParams.direction = GPTimerCC26XX_Direction_up;
TxTimerParams.matchTiming = GPTimerCC26XX_SET_MATCH_NEXT_CLOCK;
TxTimerParams.width = GPT_CFG_16BIT_TIMER;

TxTimerHandle = GPTimerCC26XX_open (twoway_10US_COUNTER、&TxTimerParams);

if( TxTimerHandle !=空)

GPTimerCC26XX_setCaptureEdge (TxTimerHandle、GPTimerCC26XX_POS_EDGE)
GPTimerCC26XX_setMatchValue (TxTimerHandle、0x10000);//匹配 16 位翻转
GPTimerCC26XX_registerInterrupt (TxTimerHandle、TxTimerCallback、GPT_INT_CAPTURE_Match);

TxTimerInitialized = true;
}
TxTimerCount = 0x0uL;
// Power_setDependency (PowerCC26XX_XOSC_HF);//仍然需要?

}

/********************************************************************************************

目的:启动 10us 脉冲计数器以清除累积的计数
注释:

****************************************************************************************** /
int16_t TXTIMER_ResetSyncTimer (void)

int16_t Ex = TXTIMER_EX_OK;

if(!TxTimerInitialized )

TxTimerInitialize();
}
// GPTimerCC26XX_STOP (TxTimerHandle);
GPTimerCC26XX_setLoadValue (TxTimerHandle、0x0uL);
TxTimerCount = 0uL;
TxTimerEnabled = true;
GPTimerCC26XX_enableInterrupt (TxTimerHandle、GPT_INT_CAPTURE_match);
GPTimerCC26XX_START (TxTimerHandle);
退货(例如);
}

我在 ISR 中设置了一个断点、但从未看到中断。  几秒钟后我停止调试器、但我看不到计时器正在计数的证据。  我在论坛上看到了几个类似的例子、这些例子使我希望这可以起作用、但我必须错过一个步骤。

任何人都能看到我的实施存在问题吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    下面是在我们的 LP 上运行的一个小示例、每次按下 BTN-1 5 次时都会提供中断。

    请使用此示例对其进行测试、并将其与您的代码进行比较:

    #include <ti/sysbios/BIOS.h>
    #include <ti/sysbios/knl/Task.h>
    
    /* Driver Header files */
    #include <ti/drivers/GPIO.h>
    #include <ti/drivers/timer/GPTimerCC26XX.h>
    
    /* Driver configuration */
    #include "ti_drivers_config.h"
    
    GPTimerCC26XX_Handle hTimer;
    
    static uint8_t counter = 0;
    
    void timerCallback(GPTimerCC26XX_Handle handle, GPTimerCC26XX_IntMask interruptMask)
    {
        counter += 5;
    }
    
    void *mainThread(void *arg0)
    {
        GPIO_init();
    
        GPTimerCC26XX_Params params;
        GPTimerCC26XX_Params_init(&params);
        params.width          = GPT_CONFIG_16BIT;
        params.mode           = GPT_MODE_EDGE_COUNT_UP;
        params.debugStallMode = GPTimerCC26XX_DEBUG_STALL_OFF;
        hTimer = GPTimerCC26XX_open(CONFIG_GPTIMER_0, &params);
        if(hTimer == NULL)
        {
            while(1);
        }
    
        GPTimerCC26XX_registerInterrupt(hTimer, timerCallback, GPT_INT_CAPTURE_MATCH);
    
        GPTimerCC26XX_PinMux pinMux = GPTimerCC26XX_getPinMux(hTimer);
    
        GPIO_setConfigAndMux(CONFIG_GPIO_BTN_1, GPIO_CFG_IN_PU, pinMux);
    
        GPTimerCC26XX_setCaptureEdge(hTimer, GPTimerCC26XX_POS_EDGE);
        GPTimerCC26XX_setLoadValue(hTimer, 0xFFFFFF);
        GPTimerCC26XX_setMatchValue(hTimer, 5);
        GPTimerCC26XX_start(hTimer);
    
        GPIO_setConfig(CONFIG_GPIO_LED_0, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
    
        while (1)
        {
            Task_sleep(BIOS_WAIT_FOREVER);
        }
    }

    我以最新 SDK 中的空示例作为起点、在 SysConfig 中添加了按钮和计时器。

    希望这有所帮助。

    BR

    Siri

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Siri、

    我通过查看您的示例得到了我的代码。  我认为我的 pinMux 是错的、这不会导致中断。  我以 GPTimerCC26XX_getPinMux 为例、使用了该值、然后我的代码开始工作。  感谢你的帮助

    Bruce