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:在 POWER_PowerNotification _CB 中使用时、Clock_start 和 Clock_stop 不能正常工作

Guru**** 2487425 points


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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1167479/cc1312r-clock_start-and-clock_stop-not-work-properly-when-using-in-power_powernotification_cb

器件型号:CC1312R

您好!

我需要根据电源通知事件启动和停止计时器  

当事件为 PowerCC26XX_entering_standby -停止计时器时  

当事件为  PowerCC26XX_awarn_standby 或 PowerCC26XX_awarn_standby_Late -启动计时器时  

STOP 命令不起作用,我看到系统从 计时器事件唤醒。

这是我的代码:  

时钟定义:  

(三

Clock_Params_init (wdtClock._params);

wdtClock._params.period = 500000/ Clock_tickPeriod;//1000000/ Clock_tickPeriod;//每1秒或100.000个时钟节拍*
wdtClock._params.startFlag = false;// true;//立即开始*/
wdtClock._handle = Clock_create ((Clock_Functr) watchdogTimerCallback、
wdtClock._params.period、wdtClock._params、NULL);

电源通知定义:  

(二

power_registerNotify (&g_powerNotificationObj、
PowerCC26XX_entering_standby | PowerCC26XX_awarn_standby | PowerCC26XX_awarK_STANDBY_Late,
(POWER_NotifyFxn) POWER_PowerNotification_CB、
g_clientarg);

通知回调函数定义:  

(二

#pragma Optimize =无
unsigned int power_PowerNotification_CB (unsigned int eventType、unsigned int eventArg、uintptr_t clientArg)

//选通正弦启动-启动
//点1-1
Board_setPin (10);
Board_clrPin (10);
Board_setPin (10);
Board_clrPin (10);
Board_setPin (10);
asm ("nop");asm ("nop");asm ("nop");asm ("nop");
//选通正弦开始-结束
//点1-2
if (eventType = PowerCC26XX_entering_standby)

//点1-3
//系统进入睡眠状态时停止计时器
watchdogTimer_stopTimer();
//Clr 调试端口-系统进入睡眠状态时
Board_clrPin (14);

否则、如果((eventType = PowerCC26XX_awarn_standby)||(eventType = PowerCC26XX_awarn_standby_late))

//点1-4
//set debug port (//设置调试端口)-系统转到运行时
Board_setPin (14);
watchdogTimer_restartTimer();

//选通正弦结束-开始
//点1-5

Board_clrPin (10);
Board_setPin (10);
Board_clrPin (10);
Board_setPin (10);
Board_clrPin (10);
Board_setPin (10);
Board_clrPin (10);
asm ("nop");asm ("nop");asm ("nop");asm ("nop");
//选通正弦结束-结束
//点1-6

返回 Power_NOTIFYDONE;

(二

定时器停止/启动定义  

(三

void watchdogTimer_stopTimer (void)

//停止计时器上的调试端口
Board_togglePin (18);
//停止计时器
//Point 2-1
clock_stop (wdtClock_handle);

void watchdogTimer_restartTimer (void)

//启动计时器上的调试端口
Board_togglePin (9);
//启动计时器
//Point 2-1
clock_start (wdtClock_handle);

//watchdogDriver_feedWatchdog();

输出信号缩小  

输出信号放大 :

问题:  

1.为什么点1-3凸轮在点1-1之前?

2.为什么系统唤醒时使用点2-2两次?  

3.为什么计时器  每500ms 继续唤醒一次系统(计时器超时)?

谢谢  

照烧  

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

    你好、Yaki、

    这是我对您案例的更新。 我尚未完成调查、但我有一些初步答案。

    我已经尝试创建一个简单的示例、通过任务函数启用和禁用时钟、并且我正确地验证了它是否按预期工作。 当时钟启用时、我们会定期从待机模式唤醒、而当时钟停止时、器件永远不会被唤醒。 但是、当我从电源通知回调开始和停止时钟时、我可以看到:

    • 当按预期调用 Clock_stop()时,不再调用时钟回调。
    • 无论如何、即使未调用时钟回调、器件也会每500ms 唤醒一次。

    我将继续调查、了解这种情况的发生原因、如果删除时钟是正确的方法、则不要从待机状态唤醒。

    有关 GPIO 时序的更多信息。 您的点2-2发生两次、因为回调 会连续调用两次:首先是器件从待机状态(PowerCC26XX_WAKE_STANDBY)唤醒、然后是唤醒过程的后续阶段(PowerCC26XX_WAKE_STANDBY_Late)。  

    这两个唤醒事件是在唤醒序列中的不同时间发生的单独电源事件。 事件之间存在明显差异:当由于  PowerCC26XX_WAKE_STANDBY (唤醒序列中的较早事件)调用回调时、GPIO 切换会对 GPIO 寄存器产生影响、但不会对引脚产生影响。 由于 PowerCC26XX_A叫醒_BSTANDBY_Late、第二次调用回调时、我必须详细研究这种情况的发生原因以及它是否按预期工作。 我怀疑它与唤醒序列中不同阶段的电源管理有关、并且可能在首次调用时某些外设仍然被禁用。   

    由于 PowerCC26XX_WAKE_STANDBY 调用回调时、GPIO 寄存器修改的影响将在唤醒序列的稍后部分、回调返回一段时间后生效。 您会看到"START TIMER"行发生了变化、因为您要切换它、但您看不到选通行发生了变化、因为您始终保持回调函数的该引脚处于清零状态、因此该引脚稍后不会更改状态。 如果 由于 PowerCC26XX_AK_STANDBY_Late 而再次调用回调、则所有回调都将按预期工作。 由于 PowerCC26XX_entering_standby 调用回调时、所有操作都按预期工作。

    此致、

    高斯图

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

    你好、Yaki 经过一些调查后、我认为我发现了你的申请中发生的情况。  

    当您从 PowerCC26XX_entering_standby 电源通知中调用 Clock_stop 时、时钟在时钟模块内被标记为不活动、这将防止以后重新安排。  但是、该时钟可能是当前计划的时钟  、将唤醒器件、调用 Clock_stop 不会修改这种情况。 这将在您调用 Clock_stop 后导致器件最后一次唤醒(但不调用时钟回调、因为时钟已停止)。  

    当您重新启动 PowerCC26XX_Alearn_STANDBY 电源通知中的时钟时、刚刚停止的时钟将重新启动、从而生成一个乒乓场景、在这种场景中、器 件在进入睡眠状态时会一直停止时钟、但在唤醒时会再次启动时钟。

    这可以通过以下方式解决:

    -在电源通知内不使用 Clock_start()启动时钟

    -或者通过某种方法来捕获   PowerCC26XX_ALOWK_STANDBY 电源通知中的此附加计划时钟事件 、并避免在这种情况下启动时钟。  

    理想情况是有一种方法来触发 下一个时钟事件的重新计算并在调用 Clock_stop()后立即执行(理想情况下,这将在您的用例中在 clock_stop 内完成)。 但是、目前时钟模块中不存在此类功能。 我将为我们的研发部门提交一个 TT、以添加此类功能或确保在调用 Clock_stop 时重新计算下一个时钟事件。 但是,我现在不能告诉你这是要实施还是要制定时间表。

    此致、

    高斯图  

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

    您好 、Fausto、

    感谢您提供的所有信息和建议。

    目前,我在关闭计时器后有额外唤醒的解决方案 。

    我寻找逐稿轮解决方案。

    是否有默认空闲任务?

    如果是,我可以在此任务中编写代码或插入一些回调函数?

    照烧