TI中文支持网
TI专业的中文技术问题搜集分享网站

CC2642R: 关于cc2642使用tirtos定时器不准的问题求解

Part Number:CC2642ROther Parts Discussed in Thread:SIMPLELINK-CC13XX-CC26XX-SDK

一,定时器初始化代码如下

  Timer_Params_init(&timeSleep_params);
  timeSleep_params.period = WAKEUP_TIMES * 1000 * 1000;  //
  timeSleep_params.periodUnits = Timer_PERIOD_US;
  timeSleep_params.timerMode = Timer_CONTINUOUS_CALLBACK;
  timeSleep_params.timerCallback = timerCallback;

  timerSleep = Timer_open(CONFIG_TIMER_0, &timeSleep_params);
  if (timerSleep == NULL)
  {
      /* Failed to initialized timer */
      while (1) {}
  }
  MyWakeUpT_CB.whichStandby = 0x21;
  if (Timer_start(timerSleep) == Timer_STATUS_ERROR)
  {
        /* Failed to start timer */
        while (1) {}
  }
二,定时器回调函数如下
void timerCallback(Timer_Handle myHandle, int_fast16_t status)
    if (myHandle == timerSleep)
    {
        //do some things
        Timer_stop(timerSleep);
    }
}
三,更改定时时间
Timer_stop(timerSleep);
Timer_setPeriod(timerSleep, Timer_PERIOD_US, time);
Timer_start(timerSleep);
四,现象
多次操作后会出现到达预定时间不进入定时器中断现象.
Yolande Wang:

您好,

您使用的是哪个 SIMPLELINK-CC13XX-CC26XX-SDK 版本和示例?

您可以尝试将 CONFIG_TIMER_0 换为 CONFIG_TIMER_1 。

我会尝试在开发板复现您的问题,请稍后。

您还可以查看TI 驱动程序运行时 API 和TI 驱动程序示例。

,

viys:

使用的是simplelink_cc13xx_cc26xx_sdk_6_20_00_29,目前已经确定较为具体的原因

使用Timer_setPeriod后,通过不断使用Timer_getCount函数发现计数值在增加,当增加到最大溢出后再次重新计数到可能是重载值后才触发定时器回调函数

,

Yolande Wang:

viys 说:Timer_setPeriod(timerSleep, Timer_PERIOD_US, time);

暂停定时器,更改时间后,没将时间调整到初始值。

,

viys:

对的

,

viys:

有概率会失败,大部分情况是ok的,当我大幅度如从20s改到1s或者比较频繁三次更改(5s内)出现的概率很大

,

Yolande Wang:

稍后我找找 API 里有没有重启函数。

另外您可以尝试删除,然后重新创建试试。

,

Yolande Wang:

您可以参阅一下这个问题贴:

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1263760/lp-cc1352p7-when-using-timer_setperiod-to-adjust-from-a-long-period-to-a-short-period-there-s-a-waiting-period-before-entering-the-new-period/4805515?tisearch=e2e-sitesearch&keymatch=Timer_setPeriod#4805515

,

Yolande Wang:

这个是Timer.h File Reference:

https://dev.ti.com/tirex/explore/content/simplelink_cc13xx_cc26xx_sdk_7_10_02_23/docs/drivers/doxygen/html/_timer_8h.html

 

,

viys:

好的,非常感谢,我先阅读一下尝试解决问题

,

viys:

图一

图二

抱歉,我在更改了定时器的优先级之后依旧不行,如图一,芯片接收到命令后延迟5s(5000000单位为us),之后蓝牙连接延长延迟时间,之后蓝牙断开休眠延迟时间为1s,定时器并未进入回调函数

,

Yolande Wang:

感谢您的测试反馈。

我重新查看了定时器,得知如果是蓝牙程序,使用 Util_constructClock 函数构建定时任务,具体可以参考simple_peripheral例程。

您可以通过此路径打开例程:C:\ti\simplelink_cc13xx_cc26xx_sdk_7_10_01_24\examples\rtos\CC26X2R1_LAUNCHXL\ble5stack\simple_peripheral

Util_constructClock 初始化一个 TIRTOS Clock 实例,并到时间触发指定的回调。它是 TIRTOS Clock 的实用程序包装。

您可以点击此处查看特定情况下使用定时器的类型。

希望能够帮助到您。

,

viys:

此处定时不仅是蓝牙可以开启,按键也可以启动新的定时,那么使用 Util_constructClock 函数构建定时任务也是可以的么

,

Yolande Wang:

都可以的。

Util_constructClock 函数本身不支持通过按键来启动新的定时器,主要用于创建并启动软件定时器。

,

Yolande Wang:

如果您想通过按键来触发新的定时器,您需要在按键的中断服务程序中调用 Util_constructClock 函数。

在按键触发时,在相应的处理代码中调用 Util_constructClock  来创建新的定时器并启用它。

,

Yolande Wang:

您好,

您这边进行尝试了吗,问题解决了吗?

,

viys:

没有成功,硬件定时器GPTimerCC26XX也试了,定时器从停止到配置一个比较小的延迟时间的话,定时器配置ok的时候,计数值已经超过了设定的.我现在是没有更改定时器的参数之后在回调中编写一些函数实现了下功能.

,

Yolande Wang:

您的意思是定时器重新配置的时间小于当前计时,所以就没更新定时器的配置,而是在定时器的回调内添加了一些操作,然而这些操作也没反应是吗?

另外您现在是想实现什么样的目标?使用定时器更改时间是做什么?

,

Yolande Wang:

您将 Timer_setPeriod 改为 Timer_setPeriodMicroseconds()试试。

您可以参阅 Bios_User_Guide 第103页。

1072.Bios_User_Guide.pdf

,

Yolande Wang:

您好,

timer_stop() 将停止计时器当前的计数,并且不会重置寄存器。因此,调用timer_start()从最后一个值开始计数。

当定时器正在运行且中断之前调用timer_1_init()时,您需要再次运行timer_start()以使定时器重新启动。但是我认为使用 Timer_setPeriod() 来更改计时器的周期会更有用。即使在定时器运行期间也可以调用它。但该值将异步更新。请参阅此了解更多信息: https://dev.ti.com/tirex/explore/content/ simplelink_cc13xx_cc26xx_sdk_7_10_01_24/docs/drivers/doxygen/html/_timer_8h.html#aee385432bc15af4d7ae919e941341a4c

另外您可以参考以下E2E线程:

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1298843/cc2652r7-internal-timer-count-doesn-t-reset-in-one-shot-mode/4930046?tisearch=e2e-sitesearch&keymatch=Timer_setPeriod#4930046

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/1269670/lp-cc1352p7-reset-timer-count

希望能够帮助到您。

,

viys:

非常感谢您的跟进,使用Timer_setPeriodMicroseconds()我的问题已解决

赞(0)
未经允许不得转载:TI中文支持网 » CC2642R: 关于cc2642使用tirtos定时器不准的问题求解
分享到: 更多 (0)

© 2024 TI中文支持网   网站地图 鲁ICP备2022002796号-1