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:在cc2650中具有1微秒精度的32位上升计数计时器

Guru**** 2540720 points
Other Parts Discussed in Thread: CC2650, SYSBIOS

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

https://e2e.ti.com/support/clock-timing-group/clock-and-timing/f/clock-timing-forum/626066/rtos-32-bit-up-count-timer-with-1-micro-second-precision-in-cc2650

“Thread:CC2650SysBIOS”中讨论的其它部件

工具/软件:TI-RTOS

您好,  

我需要一个32位加载计数计时器,以便在SensorTag设备(cc2650)中使用我的应用程序。 我在这方面花了很多时间,但我仍然感到困惑。  

首先,我使用了此计时器:

#include <ti/SysBIOS/hal / Timer.h>


错误块EB;
Timer_Params timer_Params;
ERROR_INIT(&E);
Timer_Params_init(&Timer_Params);
Timer_Params.period = 6万;
Timer_Params.periodType = Timer_PeriodType_microsecs;
timer_params.arg =2;
Timer_Params.extFreq.lo = 2.7亿;
Timer_Params.extFreq.hi = 0;
Timer_Params.startMode = Timer_StartMode_Auto;
timer_Params.runMode = Timer_RunMode_Continuous;
timer_handle = Timer_create (0,tickFxn,&timer_Params,&EB);
如果(timer_handle == NULL){
SYSTEM_ABORT ("计时器创建失败!");
}

我可以得到正确的计时器值,但计时器正在降序。

所以我使用了GPTM:

#include <ti/drivers/timer/GPTimerCC26XX.h>

GPTimerCC26XX_Params参数;
GPTimerCC26XX_Params_init(&params);
Params.width = gPT_config_32bit;
Params.mode = gPT_mode_periodical_up;
params.debugStallMode = GPTimerCC26XX_DEBUG_STOR_OFF;
hTimer = GPTimerCC26XX_OPEN (CC2650_GPTIMER0A,参数(&P));
IF (hTimer == NULL){
log_error0("无法打开GPTimer");
}

Types_FreqHz频率;
BIOS_getCpuFreq (&freq);
GPTimerCC26XX_value loadVal = freq.lo / 1000 - 1;//4.7999万
GPTimerCC26XX_setLoadValue (hTimer,loadVal);
// GPTimerCC26XX_registerInterrupt (hTimer,timerCallback,GPT_INT_TIMEOUT);
GPTimerCC26XX_START (hTimer);

Prescaling对我来说不起作用,所以我无法获得1微秒的精度。

然后我尝试使用此计时器:

PRCMPowerDomainOn(PRCM_DOMAIN_Periph);
POWER_setDependency (PowerCC26XX_Periph_GPT0);
POWER_setConstraint (PowerCC26XX_SB_Disallow);
PRCMLoadSet();
POWER_setDependency (PRCM_Periph_TIMER0);
PRCMLoadSet();
TimerDisable(GPT0_Base,timer_both );//以确保GPTM已禁用
//TimerCcpCombineDisable(GPT0_Base );//禁用A和B一起使用
TimerConfigure (GPT0_BASE,TIMER_CFG_Split_Pair |TIMER_CFG_Periodic);

TimerPrescaleSet (GPT0_base,timer_both,16);

TimerLoadSet(GPT0_base, timer_both,0xFFFFFFFFFFFFFFFFFFF);//要计数的加载计时器值

TimerEnable(GPT0_base, timer_both );

在此计时器中,PrescMailer也不工作。 我知道它的工作时间为16位,但我需要32位计时器,它的值是升序的。

感谢您的回答。

此致,

本巴德  

 

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

    对于内核的计时器(ti/SysBIOS/hal/计时器),您可以从最大计数中减去当前计数,以获得增加的计数。

    托德
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的Todd:
    感谢您的回答。 但我真的很好奇如何通过使用通用计时器来实现这一目标?
    在GP计时器中,我对使用TimerPrescaleSet()感到非常厌倦,但它对我来说不起作用。 你有什么建议吗? 我需要的是一个计时器在2^ 24中溢出,所以在另一个单词1677.7216万中。 和计时器分辨率,每秒1 u。
    此致,
    本巴德