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.

[参考译文] RTOS/LAUNCHXL-CC2650:边沿计数器 cc26xx 有问题

Guru**** 2561200 points
Other Parts Discussed in Thread: SYSBIOS

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/572143/rtos-launchxl-cc2650-problem-with-edge-counter-cc26xx

器件型号:LAUNCHXL-CC2650
Thread 中讨论的其他器件:SYSBIOS

工具/软件:TI-RTOS

 我想 СС2650该信号的频率、该频率将作为 μ C Launch Pad 上微控制器的输入。  为此、我将定时器配置为计数器模式、该模式对信号中上升沿的数量进行计数。  我花费测量1ms 并通过 GPTimerCC26XX_getValue()获得结果; 下面是我的代码示例:

/*********
*包括
*/

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#include "delay.h"
#include "newtask.h"


/*********
*外部变量
*/
Task_Structt newtask;
Char newTaskStack[512];

GPTimerCC26XX_Handle tTimer;
GPTimerCC26XX_Handle cTimer;

PIN_Handle timerPinHandle;

/* PIN_Config 表的全局存储器存储*/
静态 PIN_STATE timerPinState;

uint32_t qwerty = 0;

PIN_Config GptPinInitTable[]=
{
IOID_15 | PIN_GPIO_OUTPUT_DIS | PIN_INPUT_EN | PIN_迟滞、
PIN_Terminate
};

静态空 tTimer_init (void);
静态空 ctTimer_init (void);
静态空 Init_and_start_PWM (void);

空 timerCallback (gpTimerCC26XX_Handle handle、gpTimerCC26XX_IntMask interrupt Mask)
{
gTimerCC26XX_getTimer (gpTimer_getTimer);


gpterm (gpcc26XX)(unstop
);gptrack_interrupt TimerCC26XX (gpter_timer_timer_timer_timer_timer_timer_timer_timer);gptrack_interrupt (gPTTimer_timer_timer
GPTimerCC26XX_Close (cTimer);
GPTimerCC26XX_Close (tTimer);
}


void newFxn (UARg a0、UARg A1){
Init_and_start_PWM ();
while (1){
Start ();
Log_Info1 ("频率:%d kHz"、qwerty);
E1000_sep_sequate
)
}

void new_createTask (void)
{
Task_Params taskParams;

//配置操作系统任务
Task_Params_init (&taskParams);
taskParams.stack = newTaskStack;
taskParams.STACKSIZE = sizeof (newTaskStack);taskParams.priority
= 3;
Task_constructure.newtask (&newtask、 newFxn、&taskParams、NULL);
}

void Start (void)
{
tTimer_init ();
cTimer_init ();
// TimerSynchronize (GPT0_BASE、TIMER_0A_SYNC | TIMER_0B_SYNC);
GPTimerCC26XX_START (cTimer);
GPTimerCC26XX_START (tTimer);
}

静态空 tTimer_init (空)
{
GPTimerCC26XX_Params 参数;
GPTimerCC26XX_Params_init (&params);
params.width = GPT_CONFIG_16BIT;
params.mode = GPT_MODE_OneShot_up;
params.debugStallMode = GPTimerCC26XX_DEBUG_STALL_OFF;
tTimer = GPTimerCC26XX_OPEN (Board_GPTIMER0B、&params);
if (tTimer = NULL){
Log_err0 ("无法打开 GPTimerVal 计时器");
Task_EXIT ();
CC26XX_freq1




、GPTimervl = GPTimerCLUST_Timer000Hz;GPTimerQ_freq1、GPTimer000_freq1、GPTimer000_freq1、GPTimer000_freq1、GPTimerv1、GPTimer000_freq1、GPTimer000_freq_freq1、GPTimerval GPT_INT_TIMEOUT);
}

静态空 cTimer_init (void)
{
GPTimerCC26XX_Params_timerParams;
GPTimerCC26XX_Params_init (&timerParams);
timerParams.width = gppt_config_16BIT;
timerParams.mode = GPT_MODE_EDGE_COUNT_UP;
//timerParams.debugStallMode = GPTimerCC26XX_DEBUG_STALL_OFF;

cTimer = GPTimerCC26XX_OPEN (Board_GPTIMER1A、&timerParams);
if (cTimer = NULL){
Log_error0 ("打开 GPTimer"失败);
}

/*打开引脚手柄并将引脚路由到计时器*/
timerPinHandle = PIN_OPEN (&timerPinState、GptPinInitTable);

GPTimerCC26XX_PinMux pinMux = GPTimerCC26XX_getPinMux (cTimer);

PINCC26XX_setMux (timerPinHandle、PIN_ID (IOID_15)、pinMux);

}

静态 void Init_and_start_PWM (void)
{
PWM_Handle hPWM;
PWM_Params pwmParams;
PWM_Params_init (&pwmParams);

pwmParams.pwmParams
= period_3Hz;pwmParams.pwmParams = pwmParams.pwmUnits
pwmParams.dutyUnits = PWM_Duty_Fraction;//分数占空比
pwmParams.dutyValue = PWM_Duty_Frage_MAX/2;//50%占空
比//pwmParams.idleLevel = PWM_IDLE_LOW;

hPWM = PWM_OPEN (Board_PWM0、&pwmParams.idleLevel)= PWM_NOTELL;hPWM = PWM_OPEN






(Board_PWM0);电路板(电路板错误0)= PWM0_NOT_PWM0);电路板(电路板(电路板错误0)= PWM0_NOT_PWM0_NOT_PWM0);电路板(如果

因此、我在日志中看到:

#000025 [ 1.011]信息:(newtask.c:69)频率:1kHz
#000026 [2.011] INFO:(newtask.c:69)频率:2kHz
#000027 [ 3.012]信息:(newtask.c:69)频率:3kHz
#000028 [4.012]信息:(newtask.c:69)频率:4kHz
#000029 [5.012]信息:(newtask.c:69)频率:5kHz
#000030 [6.012]信息:(newtask.c:69)频率:6kHz
#000031 [ 7.012 ]信息:(newtask.c:69)频率:7kHz
#000032 [ 8.013 ]信息:(newtask.c:69)频率:8kHz
#000033 [9.013]信息:(newtask.c:69)频率:9kHz
#000034[10.013]信息:(newtask.c:69)频率:10kHz

我不明白为什么每次值增加? 如何在不增加的情况下获得结果?  

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

    您好!

    首先、您不需要代码的 PWM 部分、因为您只想使用计时器捕获输入信号。

    此外、您只需一个计时器即可执行捕获。

    中断源应为 INT_CAPTURE、模式应为 GPT_MODE_EDGE_TIME_UP。 例如、请找到以下代码。

    如需更多信息、我建议您查看我们的技术参考手册第13章。

    
    
    静态 bfirstTimeFlag;
    
    //发生捕获时调用的 TimerCallback
    (gpTimerCC26XX_Handle handle、gpTimerCC26XX_IntMask interMask interruptMask){
    //在捕获最后一个上升沿时获取 tick 值
    timerBuf[timerBufIndex]= gpTimerCC26XX_getool (handle
    
    )(if!TimeFlag)
    if (timerBuf[timerBufIndex]> timerBuf[timerBufIndex-1]){
    intervalBuf[intervalBufIndex]= 48000000 /(timerBuf[timerBufIndex]- timerBuf[timerBufIndex-1]+1);
    }
    否则{
    intervalBuf[intervalBufIndex]= 48000000 /(timerBuf[timerBufIndex]+ 0xFFFFFF-timerBuf[timerBufIndex-1]+1);
    }
    
    }
    
    timerBufIndex++;
    intervalBufIndex++;
    if (firstTimeFlag){
    firstTimeFlag = false;
    }
    
    if (timerBufIndex = TIMERBUFSIZE){
    GPTimerCC26XX_STOP (handle);
    }
    
    
    
    void taskFxn (UARg arg0、UARg arg1)
    {
    
    //在边沿时间捕获模式下设置 GPTimer 0A *
    / GPTimerCC26XX_ParttimerParams;
    GPTimerCC26XX_Params_init (&timerParams);gptimertimerT_params.config
    = gptime_mode_time_mode_time_time_mode_time_mode.t_mode_time_time_params;gPT_time_time_mode_time_time_mode_tim
    
    
    HTimer = GPTimerCC26XX_OPEN (CC2650_GPTIMER0A、&timerParams);
    
    //
    发生捕捉时发生时*寄存器中断*/ GPTimerCC26XX_registerInterrupt (hTimer、timerCallback、GPT_INT_CAPTURE);
    
    //打开引脚手柄并将引脚路由到计时器****/
    TimerPinHandle = TimerCC26XX_PinMux
    
    (TimerTimer_PinMux);GP26xx TimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTim
    //最长周期可以是5Hz=0.2s= 48000000/5-1节拍= 0x927BFF
    //因此向上计数超时应该是0xFFFFFFGPTimerCC26XX_setLoadValue
    (hTimer、0xFFFFFFf);
    
    firstTimeFlag = true;
    //开始计时器*/
    GPTimerCC26XX_START (hTimer);
    
    while (1)
    {
    Task_sleep (BIOS_wait_forever);
    }
    
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的回应、Christin
    我看到了这个示例、并尝试这样做、但如果频率高于100kHz、它不能正常工作
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您如何验证它不起作用? 您的输入信号是什么? 您是否查看了频率的数组内容(intervalBuf[intervalBufIndex])?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    输入波形179kHz:

    intervalBuf 数组:

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您认为我们可以如何解决这个问题?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Christin、您能帮助我的客户解决这个问题吗?
    提前感谢!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Roman、

    您能否通过调用来确保 GPTimer 时钟依赖于 MCU 系统时钟

    #include 
    #include 
    POWER_setDependency (XOSC_HF); 

    此致、

    Klas

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

    非常感谢您的回答、Klas

    我尝试过、但出现错误:

    说明资源路径位置类型
    #1965无法打开源文件"ti/sysbios/family/arm/cc26xx/Power.h" newLockTask.c /project_zero_app_cc2650launchxl/Application line 17 C/C++ problem

    在此文件夹中、没有文件 Power.h 和 PowerCC2650.h

    此致、

    罗马

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

    您使用的是哪个版本的 TI-RTOS?

    此致、

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

    您好 Klas、

    我正在使用 TI-RTOS 2.20.1.08

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

    是否可以尝试 #include "PowerCC26XX.h"? 并确保其路径列在预处理器包含的目录中。 它可能位于"C:\ti_tirtos_cc13xx_cc26xx_2_20_01_08\products\tidrivers_cc13xx_cc26xx_2_20_01_10\packages/ti\drivers\power"

    此致、

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

    完整路径为:

    #include
    #include

    尝试此操作并返回您的结果。

    此致、

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

    但这些文件中的"XOSC_HF"未定义。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Roman、

    "PowerCC26XX_XOSC_HF"应存在。

    您是否在原始帖子中的代码或发布的修改代码 Christin 未能读取超过100kHz 的输入值? 如果是后者、您能否同时发布您的 Christin 规范代码、以便我了解一下?

    此致、

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

    我正在使用的代码:

    /*********
    *包括
    */
    
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    /*********
    *外部变量
    */
    Task_Structurt newLockTask;
    Char newLockTaskStack[1000];
    
    GPTimerCC26XX_Handle hTimer;
    
    PIN_Handle timerPinHandle;
    
    // PIN_Config 表的全局存储器*/
    静态 PIN_STATE timerPinState;
    
    //计时器缓冲区*/
    #define TIMERBUFUFSIU0 =
    
    
    32
    位 UTIMER0 =
    0;{INT0_BIT_BIN0}= TIMENT0_COUNT0 = 0 = TIMENT0_TIM0_TIM0_TIM0_TIMENT0_TIM0_TIMENT0_TIMENT0_TIM0_NOTE_TIMENT0_TIM0_TIM0_TIM0_TIM0_TIM0_TIMENT
    
    PIN_Config GptPinInitTable[]={
    IOID_15 | PIN_GPIO_OUTPUT_DIS | PIN_INPUT_EN | PIN_迟滞、
    PIN_TERMINE
    };
    
    空时间回调(GPTimerCC26XX_Handle handle、GPTimerCC26XX_IntMask interruptMask)
    {
    //获取最后一个上升沿被捕捉时的节拍值
    timerBuf[timerBufIndex]= GPTimerCC26XX_getValue (handle);
    //将节拍值转换为 Hz
    如果(!firstTimeFlag)
    {
    if (timerBuf[timerBufIndex]> timerBuf[timerBufIndex-1])
    {
    intervalBuf[intervalBufIndex]= 48000000 /(timerBuf[timerBufIndex]- timerBuf[timerBufIndex-1]+1);
    }
    其他
    {
    intervalBuf[intervalBufIndex]= 48000000 /(timerBuf[timerBufIndex]+ 0xFFFFFF-timerBuf[timerBufIndex-1]+1);
    }
    }
    
    timerBufIndex++;
    intervalBufIndex++;
    IF (firstTimeFlag)
    {
    firstTimeFlag = false;
    }
    
    if (timerBufIndex == TIMERBUFSIZE)
    {
    GPTimerCC26XX_STOP (句柄);
    }
    }
    
    void newLockFxn (UARg a0、UARg A1){
    
    Power_setDependency (PowerCC26XX_XOSC_HF);
    
    //在边沿时间捕获模式中设置 GPTimer 0A *
    / GPTimerCC26XX_Params_init
    (&TimerBoard_Params_open
    
    )
    
    = GPTimerCC26XX_Params_TimerTimerTimerTimerTimer = GPTimerBoard_Open_TimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTON.T;GPTimerTimerTimerTim &timerParams);
    
    /*捕获发生时的寄存器中断*/
    GPTimerCC26XX_registerInterrupt (hTimer、timerCallback、GPT_INT_CAPTURE);
    
    //打开引脚句柄并将引脚路由到计时器*/
    timerPinHandle = PIN_OPEN (&PinerCallback、GPTTimerInitTable);GPTimer26XX
    (TimerPMCC26XX) PinMux (Timer_PinMux);GPTIMERID = PINM26xx PinMux (TimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimerTimer
    
    //最长周期可以是5Hz=0.2s= 48000000/5-1节拍= 0x927BFF
    //因此向上计数超时应是0xFFFFFFGPTimerCC26XX_setLoadValue
    (hTimer、0xFFFFFFF);
    
    firstTimeFlag = true;
    //开始计时器*/
    GPTimerCC26XX_START (hTimer);
    
    while (1)
    
    Task_sleep (BIOS_wait_forever);
    }
    
    
    void newLock_createTask (void)
    {
    Task_Params taskParams;
    
    //配置操作系统任务
    Task_Params_init (&taskParams);
    taskParams.stack = newLockTaskStack;
    taskParams.STACKSIZE = sizeof (newLockTaskStack);
    taskParams.priority = 3;
    Task_construct(&newLockTask、newLockFxn、&taskParams、NULL);
    } 

    结果(来自发生器171kHz 的频率):

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

    我只能确认我看到的问题与您的问题相同。 驱动器似乎每秒在高速下越来越频繁地缺失中断、因此输出预期值除以2 (71kHz /2 = 85000、就像您得到的那样)。

    我将与司机的写作人员交谈、如果我能找到解决问题的方法、请与您联系。

    此致、

    Klas
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Klas
    好久不见你的消息。 对这个问题没有任何想法?

    此致、

    罗马
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好,Roman,很抱歉我迟到了。

    输入频率越高、中断的损失就越频繁、这是因为处理器也会定期运行 TI-RTOS。 如果在 RTOS 正忙于执行其他操作时发生中断、它将不会注册、并且您读取的频率将出现故障。 到目前为止、我们还没有计划实施更高采样率的解决方案。 我们建议您使用 DMA 自行修改驱动程序、或以较低的速率进行采样。

    很抱歉造成不便。

    此致、

    Klas