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:为输入边沿计时模式设置 PinMux

Guru**** 2391415 points
Other Parts Discussed in Thread: SYSCONFIG, CC1354P10

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1386408/cc1354p10-setting-up-pinmux-for-input-edge-time-mode

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

工具与软件:

您好、E2E:

我尝试在 GPIO 引脚上实现边沿时间捕获。 我的目的是捕获 GPIO 引脚上两个边沿之间的时间。  

我尝试使用实现时的示例  GPTMERCC26XX.h 不知何故,我看不到任何定义/引用" PINCC26XX_setMux "。   以下是我的示例代码...  

GPTimerCC26XX_Handle CapTimer;
GPTimerCC26XX_Params tParams;
GPTimerCC26XX_PARAMS_INIT (&tParams);

tParams.width = GPT_CONFIG_16BIT;
tParams.mode = GPT_MODE_EDGE_TIME;
tParams.Direction = GPTimerCC26XX_DIRECTION_UP;
tParams.debugStallMode = GPTimerCC26XX_DEBUG_STALL_OFF;

CapTimer = GPTimerCC26XX_OPEN (GPT_A、&tParams);

if (capTimer => NULL){
  log_error0 ("无法打开 GPTimer");
  task_exit();
  while (1);
}

GPTimerCC26XX_setCaptureEdge (capTimer、GPTimerCC26XX_Both_EDGE);
GPTimerCC26XX_registerInterrupt (capTimer、captureTimerCallback、GPT_INT_CAPTURE);

GPTimerCC26XX_START (capTimer);

感谢您帮助解决此问题。  

此致、

Satya  

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

    你(们)好、Satya

    您需要选择 PINCC26XX_setMux ();而不是 PINCC26XX_setMux、因为不再支持引脚驱动程序。

    BR

    Siri

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

    我尝试了使用 PINCC26XX_setMux ();。 我想它的定义没有在哪里。 您能不能再详细说明一下。  

    此致、

    Satya  

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

    抱歉、我的结尾处有拼写错误

    我想说的是、您应该使用 GPIO_setConfigAndMux、而不是 PINCC26XX_setMux  ();

    Siri

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

    你好、Siri、  

    捕捉引脚配置现在运行正常。 谢谢您的讲解。

    但是、无论输入脉冲宽度如何、计数器始终读取相同的值。 我可以看到使用正确的时序调用 ISR。 但是当我尝试使用以下代码读取计数器值时...  

    GPTimerCC26XX_setCaptureEdge (capTimer、GPTimerCC26XX_NEG_EDGE);
    GPTimerCC26XX_registerInterrupt (capTimer、captureTimerCallback、GPT_INT_CAPTURE);

    GPIO_setConfigAndMux (GPIO_USS_ECHO、GPIO_CFG_INPUT、GPT_PIN_0A);
    GPTimerCC26XX_START (capTimer);

    void captureTimerCallback (GPTimerCC26XX_Handle handle、GPTimerCC26XX_IntMask interruptMask){GPIO_TOGGLE (GPIO_USS_N);
      /*在输入边沿时间内、该寄存器包含发生上一个边沿事件的定时器值*/
      CaptureValue = GPTimerCC26XX_getValue (capTimer);

      ussTriggerFlag = 0xFF;
    }

    感谢您的帮助。 此致

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

    你(们)好

    您能否以 SDK 中的空示例为例、具体实施一个小型演示代码、以表明您正在代码中执行的操作、以便我可以测试这里的相同操作?

    向我发送修改后的 e、pty.c 文件和您的 SysConfig 文件、我可以在我的空示例中使用它。

    该示例应在 LaunchPad 上运行

    Siri

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

    我制作了下面的简单代码、并且能够按预期读取定时器值:

    #include <unistd.h>
    #include <stdint.h>
    #include <stddef.h>
    
    /* Driver Header files */
    #include <ti/drivers/GPIO.h>
    #include <ti/drivers/timer/GPTimerCC26XX.h>
    
    #include "ti_drivers_config.h"
    
    GPTimerCC26XX_Handle hTimer;
    GPTimerCC26XX_Params timerParams;
    
    uint32_t edgeCount_1 = 0;
    uint32_t edgeCount_2 = 0;
    bool edge1 = true;
    
    void buttonCallbackFunction(uint_least8_t index) {
    
        // Simple debounce logic
        CPUdelay((uint32_t)((48000000/3)*0.050f));
        GPIO_toggle(CONFIG_GPIO_LED_GREEN);
    }
    
    void timerCallback(GPTimerCC26XX_Handle handle, GPTimerCC26XX_IntMask interruptMask)
    {
    
        GPIO_write(CONFIG_GPIO_LED_RED, 1);
        if (edge1)
        {
            edgeCount_1 = GPTimerCC26XX_getValue(handle);
            edge1 = false;
        }
        else
        {
            edgeCount_2 = GPTimerCC26XX_getValue(handle);
            edge1 = true;
        }
        GPIO_write(CONFIG_GPIO_LED_RED, 0);
    }
    
    void *mainThread(void *arg0)
    {
        GPIO_init();
    
        // Toggle the RLED the BTN-1 toggles (pushed and released)
        // RLED is connected to the input CONFIG_GPIO_EDGE_INPUT (DIO0) which is connected to the GPTimer
        GPIO_setConfig(CONFIG_GPIO_BTN1, GPIO_CFG_IN_PU | GPIO_CFG_IN_INT_BOTH_EDGES);
        GPIO_setCallback(CONFIG_GPIO_BTN1, buttonCallbackFunction);
        GPIO_enableInt(CONFIG_GPIO_BTN1);
    
        GPTimerCC26XX_Params_init(&timerParams);
        timerParams.mode = GPT_MODE_EDGE_TIME;
        timerParams.width = GPT_CONFIG_16BIT;
        timerParams.direction = GPTimerCC26XX_DIRECTION_UP;
        timerParams.debugStallMode = GPTimerCC26XX_DEBUG_STALL_OFF;
    
        hTimer = GPTimerCC26XX_open(CONFIG_GPTIMER_0, &timerParams);
    
        GPTimerCC26XX_registerInterrupt(hTimer, timerCallback, GPT_INT_CAPTURE);
    
        GPTimerCC26XX_PinMux pinMux = GPTimerCC26XX_getPinMux(hTimer);
    
        GPIO_setConfigAndMux(CONFIG_GPIO_EDGE_INPUT,(GPIO_CFG_INPUT_INTERNAL | GPIO_CFG_PULL_NONE_INTERNAL), pinMux);
    
        GPTimerCC26XX_setCaptureEdge(hTimer, GPTimerCC26XX_BOTH_EDGES);
    
        GPTimerCC26XX_start(hTimer);
        while (1);
    }

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

    你好、Siri、

    除了在 ISR 部分、我只计算一个边沿、我的应用程序也与您的示例代码一样。 现在、我复制了你的示例、根据我的理解、这个代码应该将上升沿和下降沿的定时器值存储到变量 edgeCount_1和 edgeCount_2中。  

    我为我的捕获引脚提供了一个1mSec 开/关计时脉冲、我会看到一些随机计数值。 由于我使用的是48MHz (使用 TI 的 CC1354P10_1评估板)、我们应该每次提供48000-1。 我知道在由 Capture 引脚执行 ISR 后、计时器应该自动变为零。 我实时没有看到。 如果我错过了什么、请帮助我。     

    此外、您可以帮助我为同一个计时器进行预分频器设置吗? 感谢您的帮助。

    此致、

    Satya Raji.

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

    计时器在捕获到事件后没有重新启动/变为零。

    计时器从0开始计数到0xFFFF、然后再次从0开始计数。

    在48MHz 下从0到0xFFFF 计数只需1.36ms

    当您尝试测量宽度为1ms 的脉冲时、只有在  同一"计数周期"内捕获到 edgeCount_1和 edgeCount_2、才能获得正确的值(48000)

    如果您运行下面的代码、在确保 edgeCount_1 < edgeCount_2时、您将看到 DIFF = 48000。

    void timerCallback(GPTimerCC26XX_Handle handle, GPTimerCC26XX_IntMask interruptMask)
    {
        if (edge1)
        {
            edgeCount_1 = GPTimerCC26XX_getValue(handle);
            edge1 = false;
        }
        else
        {
            edgeCount_2 = GPTimerCC26XX_getValue(handle);
            edge1 = true;
    
            if(edgeCount_1 < edgeCount_2)
            {
                diff = edgeCount_2 - edgeCount_1;
            }
        }
    }
    
    void *mainThread(void *arg0)
    {
        GPIO_init();
    
        GPTimerCC26XX_Params_init(&timerParams);
        timerParams.mode = GPT_MODE_EDGE_TIME;
        timerParams.width = GPT_CONFIG_16BIT;
        timerParams.direction = GPTimerCC26XX_DIRECTION_UP;
        timerParams.debugStallMode = GPTimerCC26XX_DEBUG_STALL_OFF;
    
        hTimer = GPTimerCC26XX_open(CONFIG_GPTIMER_0, &timerParams);
    
        GPTimerCC26XX_registerInterrupt(hTimer, timerCallback, GPT_INT_CAPTURE);
    
        GPTimerCC26XX_PinMux pinMux = GPTimerCC26XX_getPinMux(hTimer);
    
        GPIO_setConfigAndMux(CONFIG_GPIO_EDGE_INPUT,(GPIO_CFG_INPUT_INTERNAL | GPIO_CFG_PULL_NONE_INTERNAL), pinMux);
    
        GPTimerCC26XX_setCaptureEdge(hTimer, GPTimerCC26XX_BOTH_EDGES);
    
        GPTimerCC26XX_start(hTimer);
        while (1);
    }
    

    Siri

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

    你好、Siri、  

    感谢您的帮助。 我正在提供一个大于2mSec 宽度的脉冲、它基本上是16位计时器溢出、从而对我的变量进行错误计数。 页面。 尝试使用预分频器、不知何故、缺少一些 API 和相关文档。 我有 TRM、但堆栈和 TRM 之间有很大的差距。 您能帮助我设置预分频器吗? 此致。

    Satya Raji.  

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

    您需要使用 GPTimerCC26XX_setLoadValue 来写入 TAPR 寄存器。

    您可以看到如何在 GPTimerCC26XX.c 中访问/使用它

    /*!
     *  @brief  Shared code to be used by GPTimerCC26XX_setLoadValue / GPTimerCC26XX_setMatchValue
     *          Sets load/match values using input value and register offset for
     *          prescaler and load/match register
     *          Functions calling this should specifiy which the register offset
     *          within the module base to the corresponding timer A register.
     */
    static void GPTimerCC26XXSetLoadMatch(GPTimerCC26XX_Handle handle,
                                          GPTimerCC26XX_Value loadMatchVal,
                                          uint32_t regPre,
                                          uint32_t regLoadMatch)
    {
        /* Get the pointer to the object and hwAttrs */
        GPTimerCC26XX_HWAttrs const *hwAttrs = handle->hwAttrs;
        GPTimerCC26XX_Object *object         = handle->object;
        uint32_t offset                      = GPT_LUT[handle->timerPart].offset;
    
        /* Split value into correct timer and prescaler register for 16 bit modes. */
        if (object->width == GPT_CONFIG_16BIT)
        {
            /* Upper byte is used by prescaler */
            uint8_t prescaleValue = 0xFF & (loadMatchVal >> 16);
            /* Discard upper byte (24 bits max) */
            loadMatchVal &= 0xFFFF;
    
            /* Set prescale value */
            HWREG(hwAttrs->baseAddr + offset + regPre) = prescaleValue;
        }
    
        /* Set load / match value */
        HWREG(hwAttrs->baseAddr + offset + regLoadMatch) = loadMatchVal;
    }
    
    /*!
     *  @brief  Set GPTimer load value. For 32-bit configuration all 32 bits can
     *          be used. For split mode / 16-bit mode maximum value is 24 bits.
     *          Function concatenates prescaler functionality automatically
     */
    void GPTimerCC26XX_setLoadValue(GPTimerCC26XX_Handle handle, GPTimerCC26XX_Value loadValue)
    {
        GPTimerCC26XXSetLoadMatch(handle, loadValue, GPT_O_TAPR, GPT_O_TAILR);
    }

    Siri

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

    感谢您的持续支持。