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.

[参考译文] CC1312R:传感器控制器时间 2 以不同的间隔发生多个事件

Guru**** 2694555 points

Other Parts Discussed in Thread: CC1352P, CC1312R7

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1593302/cc1312r-sensor-controller-timer2-multiple-events-at-different-intervals

器件型号: CC1312R
主题中讨论的其他器件: CC1352P

尊敬的支持部门:

我正在尝试使用传感器控制器的 timer2 来处理多个事件:
a) 传感器轮询、默认为 8Hz、可扩展至 64Hz。  
b) 振荡器 GPIO 64Hz。

初始化

// set enable pins as outputs
gpioCfgMode(AUXIO_O_RLED, GPIO_MODE_OUTPUT);
gpioCfgMode(AUXIO_O_GLED, GPIO_MODE_OUTPUT);

timer2SetClockSource(TIMER2_CLOCKSRC_HFDIV2);
timer2WaitForClockSource();

evhSetupTimer2Trigger(0, TIMER2_EV_ID0, 1, EVH_TIMER2_TRIG_ON_MATCH);
evhSetupTimer2Trigger(1, TIMER2_EV_ID1, 1, EVH_TIMER2_TRIG_ON_MATCH);

timer2SetInitCounterTarget(4096); // 32768/8
timer2SetInitCmpValue(0, 4096);    
timer2SetInitCmpValue(1, 512);      // 32768/64

timer2CfgCcChannel(0, TIMER2_CCMODE_PULSE_ON_CMP, (1 << TIMER2_EV_ID0));
timer2CfgCcChannel(1, TIMER2_CCMODE_PULSE_ON_CMP, (1 << TIMER2_EV_ID1));

//timer2ConnectEventToGpio(0, AUXIO_O_RLED);
//timer2ConnectEventToGpio(1, AUXIO_O_GLED);

timer2SetClockSource(TIMER2_CLOCKSRC_LF);
timer2WaitForClockSource();

timer2StartWithTarget(TIMER2_CNTRMODE_UP_REP);

事件处理程序 A

state.tickA += 1;
if (state.tickA == 64) {
    state.tickA = 0;
}

timer2ClearEvent(TIMER2_EV_ID0);

//timer2SetNextCmpValue(0, 4096);

timer2GetCounter(state.countA);

gpioToggleOutput(AUXIO_O_RLED);

evhSetupTimer2Trigger(0, TIMER2_EV_ID0, 1, EVH_TIMER2_TRIG_ON_MATCH);

事件处理程序 B

state.tickB += 1;
if (state.tickB == 64) {
    state.tickB = 0;
}

timer2ClearEvent(TIMER2_EV_ID1);

timer2GetCounter(state.countB);

gpioToggleOutput(AUXIO_O_GLED);

evhSetupTimer2Trigger(1, TIMER2_EV_ID1, 1, EVH_TIMER2_TRIG_ON_MATCH);

终端

timer2Stop();

timer2ResetCcChannel(0);
timer2ResetCcChannel(1);

timer2ClearEvent(TIMER2_EV_ID0);
timer2ClearEvent(TIMER2_EV_ID1);

timer2SetClockSource(TIMER2_CLOCKSRC_NONE);
timer2WaitForClockSource();

消息

If event trigger 0 enabled {
    If event trigger 0 occurred {
        Run Event Handler A Code (trigger 0)
    }
}
If event trigger 1 enabled {
    If event trigger 1 occurred {
        Run Event Handler B Code (trigger 1)
    }
}

COUNTA 和 countB 绘制相同的曲线、但它们之间的偏移是固定的。
tickA 和 tickB 相等。    

我玩了周围 timer2SetNextCmpValue 但似乎不能达到以上.  

在具有设置(固定间隔?)的 SCS 中是否有不同的运行示例? 与在器件上?
不确定 SCS 是否使用了实际的 timer2?

也许我错过了计时器计数器和比较值的基本概念?
非常感谢任何帮助!
信息和/或 timer2 示例似乎有限。

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

    您能否 与我共享 SCS 项目文件、以便我更轻松地设置您的项目并查看您尝试执行的操作?

    Siri

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

    尊敬的 Siri:

    请参阅以下要点以了解工程文件。
    https://gist.github.com/h3lpd3sk/e99c717ccf2ecc8034d47ce0bd32622a

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

    嗨、Lode

    很抱歉、我花了一些时间才回复您。

    我反复播放了您的代码、能够让它在 8kHz 和 64kHz 下切换两个 LED。

    代码如下:

    初始化代码:

    timer2SetClockSource(TIMER2_CLOCKSRC_HFDIV2);
    timer2WaitForClockSource();
    
    evhSetupTimer2Trigger(0, TIMER2_EV_ID0, 1, EVH_TIMER2_TRIG_ON_MATCH);
    evhSetupTimer2Trigger(1, TIMER2_EV_ID1, 1, EVH_TIMER2_TRIG_ON_MATCH);
    
    timer2SetInitCounterTarget(4095);
    
    timer2SetInitCmpValue(0, 4095);
    timer2SetInitCmpValue(1, 511);
    
    timer2CfgCcChannel(0, TIMER2_CCMODE_SET_ON_CMP, (1 << TIMER2_EV_ID0));
    timer2CfgCcChannel(1, TIMER2_CCMODE_SET_ON_CMP, (1 << TIMER2_EV_ID1));
    
    timer2ConnectEventToGpio(0, AUXIO_O_RLED);
    timer2ConnectEventToGpio(1, AUXIO_O_GLED);
    
    timer2SetClockSource(TIMER2_CLOCKSRC_LF);
    timer2WaitForClockSource();
    
    timer2StartWithTarget(TIMER2_CNTRMODE_UP_REP);

    事件处理程序代码:

    timer2ClearEvent(TIMER2_EV_ID0);
    
    evhSetupTimer2Trigger(0, TIMER2_EV_ID0, 1, EVH_TIMER2_TRIG_ON_MATCH);

    事件处理程序 B 代码:

    timer2ClearEvent(TIMER2_EV_ID1);
    
    state.nextCmp = (state.nextCmp + 511) & 0x0FFF;
    timer2SetInitCmpValue(1, state.nextCmp);
    
    evhSetupTimer2Trigger(1, TIMER2_EV_ID1, 1, EVH_TIMER2_TRIG_ON_MATCH);

    STATE.nextCmp 是 16 位无符号、并初始化为 511。

    希望这是你需要的。

    BR

    Siri

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

    尊敬的 Siri:

    感谢您查看并回答该问题!
    我还没有测试它的选项,但我相信它的工作,如你所说。  
    我将在测试后标记为“已解决“。

    但是、还有一些其他问题:
    -如果 state.nextCmp 是 U16 为什么 12 位位掩码?  
    -我尝试了一个类似的东西,一个查找表和 timer2SetNextCmpValue,这显然不起作用。  
     timer2SetInitCmpValue 与 timer2SetNextCmpValue 有何区别?
     也许也可以稍微更新手册、这不是很有描述性的。  

    kr  
    LODE

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

    尊敬的 Siri

    0x0FFFF = 4095、因此事后诸葛有意义。 我与 16 位计时器混淆、而不是计数值。


    尽管+ 511 是不正确的、因为对于 0、而不是 1 范围、增量应该为 512、总值为–1
    不知道如何使用按位运算符来实现这一点。

    timer2SetClockSource(TIMER2_CLOCKSRC_HFDIV2);
    timer2WaitForClockSource();
    
    evhSetupTimer2Trigger(0, TIMER2_EV_ID0, 1, EVH_TIMER2_TRIG_ON_MATCH);
    evhSetupTimer2Trigger(1, TIMER2_EV_ID1, 1, EVH_TIMER2_TRIG_ON_MATCH);
    
    // (32768/8)-1 = 4095
    // (32768/64)-1 = 511
    
    timer2SetInitCounterTarget(4095);
    
    // must be <= counter target
    timer2SetInitCmpValue(0, 4095);
    
    state.nextCmp = 512;
    timer2SetInitCmpValue(1, state.nextCmp - 1);
    
    timer2CfgCcChannel(0, TIMER2_CCMODE_PULSE_ON_CMP, (1 << TIMER2_EV_ID0));
    timer2CfgCcChannel(1, TIMER2_CCMODE_PULSE_ON_CMP, (1 << TIMER2_EV_ID1));
    
    timer2ConnectEventToGpio(0, AUXIO_O_RLED);
    timer2ConnectEventToGpio(1, AUXIO_O_GLED);
    
    timer2SetClockSource(TIMER2_CLOCKSRC_LF);
    timer2WaitForClockSource();
    
    timer2StartWithTarget(TIMER2_CNTRMODE_UP_REP);

    事件处理程序 B 代码:

    timer2ClearEvent(TIMER2_EV_ID1);
    
    state.nextCmp += 512;
    if (state.nextCmp >= 4096) {
        state.nextCmp = 0;
        timer2SetNextCmpValue(1, state.nextCmp);
    } else {
        timer2SetNextCmpValue(1, state.nextCmp - 1);
    }
    
    evhSetupTimer2Trigger(1, TIMER2_EV_ID1, 1, EVH_TIMER2_TRIG_ON_MATCH);
    


    更重要的是、我在 Sensor Controller Studio 中看不到 8Hz 和 64Hz?
     与我的原始 proj 一样、使用 tickA abd tickB 变量时只有轻微偏差。

     
    您如何通过 CCS 在直接在 MCU 上运行代码的引脚上通过示波器验证频率?

    编辑:代码修复、屏幕截图和 Gist 已更新


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

    祝大家愉快、

    使用查找表再次更新了比较值、更干净的代码。
    仍然看不到事件处理程序 B 的速度比 A 快 8 倍?  
    也不清楚 timer2SetInitCmpValue 与 timer2SetNextCmpValue 之间的区别到底是什么 
    init 是下一个比较、因为我们从事件处理程序中设置它了吗?

    期待获得更多见解。

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

    你(们)好

    我通过将传感器控制器代码整合到空示例中并直接在 DIO6 和 DIO7 上进行测量来测试我的代码:

    我的代码如下所示:

    #include "ti_drivers_config.h"
    #include "scif.h"
    
    // SCIF driver callback: Task control interface ready (non-blocking task control operation completed)
    void scCtrlReadyCallback(void) {
    
    }
    
    // SCIF driver callback: Sensor Controller task code has generated an alert interrupt
    void scTaskAlertCallback(void) {
    
    }
    
    void *mainThread(void *arg0)
    {
        // Initialize the SCIF operating system abstraction layer
        scifOsalInit();
        scifOsalRegisterCtrlReadyCallback(scCtrlReadyCallback);
        scifOsalRegisterTaskAlertCallback(scTaskAlertCallback);
    
        // Initialize the SCIF driver
        scifInit(&scifDriverSetup);
    
        // Start the "oscillator" Sensor Controller task
        scifStartTasksNbl(1 << SCIF_OSCILLATOR_TASK_ID);
    
        while (1);
    }
    

    请注意、我更改了您的工程以在 CC1312R7 上运行、因为我没有 CC1352P 可用性。

    已附加传感器控制器代码(只需将其改回所选的器件即可)

    e2e.ti.com/.../timer2.scp

    我认为 在计数器绕回到 0 之前、timer2SetNextCmpValue 不会更新比较值、而 timer2SetInitCmpValue 会立即更改该值。

    BR

    Siri

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

    谢谢你的快速答复,让我度过周末,回来给你。

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

    尊敬的 Siri :

    这确实解决了我的初始问题、并回答了一些提出的问题。  
    谢谢您的支持、我可以继续推进这一进程。  

    但也提出了另一个市长的问题;
    Sensor Controller Studio 中的计时器 2 外设(和其他外设)是否通过设置进行了同步、或者如何解释运行差异?

    KR Lode  

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

    我不确定我是否理解这个问题。  

    请详细说明您如何在不使用 CCS 的情况下进行测试/调试、以及您看到的内容、我可以对此进行深入研究。

    Siri

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

     尊敬的 Siri :

    SCS 中的结果与 CSS 不同。  
    实际时间 2 是否通过 SCS 使用?
    请参阅前面的屏幕截图。  
    能否解释这些差异以供将来参考...

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

    我无法看到您要引用的图、但我假设您使用任务测试。 这样做时、您只是在测试不同的任务、但不会以正确的速度调用它们。 为此、您必须使用运行时日志记录功能。

    您需要在项目中启用此功能、然后将以下内容添加到两个事件处理程序中:

    rtlLogStructs(BV_RTL_LOG_STATE);

    执行日志记录时、它将如下所示:

    Siri