微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI蓝牙设计交流 > 关于CC2540进入PM3

关于CC2540进入PM3

时间:10-02 整理:3721RD 点击:

请问,如何确定进入PM3状态。

我在阅读别的帖子的时候看到说如果没有后续的定时时间,芯片会自动进入PM3,但是由于我不清楚是否还有后续事件,我想在芯片自动做出断开反应后就自动进入PM3状态。

或者说,如果说这种情况不可行的话,像osal_stop_timeEx()函数可以清空一个函数,是否有一次性清空所有的事件的函数?

还有就是说osal_pwrmgr_powerconserve()这个设置模式的函数不能乱用,可能出问题,但是我使用之后也没有进入sleep状态,是怎么回事?

感谢回答!

Hi wang,

目前没有特别的函数可以一下清空所有事件.

所以请在编写代码的时候注意一定要在适当的时候能把事件处理完.

当有未完成的定时事件时, 系统会进入PM2 模式.

osal_pwrmgr_powerconserve()这个函数不能乱用, 这个只是给osal去自动调用的, 用户不能调用.

Hi,Yan,

我在OSAL的API中看到有一个函数为osal_self()用来指出目前OSAL中活动的task,我实验了一下其返回值为0x0B,是不是就是在tasksArr数组中的第11项GATTServApp_ProcessEvent还有任务。

关键就是在编写代码的时候我都是使用osal_set_timeEx来进行task的设定,为什么这些task都执行完了还有很多任务没有执行完成,这些我就不太清楚了,请问你在编写这种task时,有什么方法可以是所有事件在适当的时候处理完成吗?

十分感谢!

Hi wang,

没osal_set_timeEx 这个函数吧?

osal_set_event() 还是 osal_start_timerEx()?

osal_start_timerEx() 你必须在其他地方调用 osal_stop_timerEx() 才能停止.

Hi Yan,

sorry,时间仓促犯了这样的低级错误。

这个osal_start_timerEx()不是只设定一次吗,难道在设定并执行完之后,这个计时器不会自动停止吗,是这个意思吗?

还有一点就是,如果我把我自己设置的osal_start_timerEx()所设置的event,全部stop timer了,确实没有事件了,

但是出现的问题是,我再点击按钮的时候就没啥反映了,使用断点调试,发现程序一直停在:

void halSetSleepMode(void)
{
  // WARNING: DO NOT ADD ANY ADDITIONAL CODE; THIS IS A FIXED SIZED SEGMENT!
  PCON = halSleepPconValue;
  // Disallow waking ISR from running in order to give the highest priority to LL_PowerOnReq().
  HAL_DISABLE_INTERRUPTS();
}

这我不明白的是:

当程序重新烧录,在没有按键时,点击停止,程序也是停在上述函数处,但是为什么此时按键就能广播呢?

Hi wang,

这是系统进入低功耗模式的地方, 这之后系统就睡眠了.

如果是PM3模式下的话, 只有通过外部IO, 也就是你的按键能唤醒, 你得确保你的按键中断功能设置正确.

Hi,Yan

经过修改,我的程序是可以进入休眠,并且通过再次按键来唤醒,但是经过跟踪我发现除了初始化的时候程序会进入的PM3,等到连接断开之后程序进入的是PM2.

原因在于在halSleep( uint32 osal_timeout )函数中,

  // HAL_SLEEP_PM3 is entered only if the timeout is zero
  halPwrMgtMode = (timeout == 0) ? HAL_SLEEP_DEEP : HAL_SLEEP_TIMER;

用来设定进入PM3,但是这个 timeout = llTimeout;并且llTimeout是通过:LL_TimeToNextRfEvent( &sleepTimer, &llTimeout )来设定的,

当我除了初始化会见到timeout = 0 外,当连接断开再次进入到休眠模式的时候这个timeout就不为0了,也就是不进入PM3了,

但是我找不到这个LL_TimeToNextRfEvent()这个函数到底是怎么修改这个llTimeout,有没有什么接口可以设定这个呢?

谢谢!

还有1点就是,PM3只能通过外部中断来唤醒,那PM2除了外部中断,还能通过那些手段唤醒呢?

谢谢!

Hi, Yan,  “osal_start_timerEx() 你必须在其他地方调用 osal_stop_timerEx() 才能停止.”这句话怎样理解,其他地方是什么意思?

我现在在SimpleBLEPeripheral_ProcessEvent()函数中,以下面方式调用osal_start_timerEx(),

if ( events & SBP_PERIODIC_EVT_XX)
{
// Restart timer
if ( SBP_PERIODIC_EVT_PERIOD_XX )
{
osal_start_timerEx( simpleBLEPeripheral_TaskID, SBP_PERIODIC_EVT, 2 );  //2ms
}

....

}

但是,在同一个文件的peripheralStateNotificationCB(),调用osal_stop_timerEx()停止不了该周期事件。

调试发现,osal_stop_timerEx()的返回值为0x06,不为0值。

谢谢你回复!

各位好,在调试时,发现一个问题:

项目环境为BLE 1.4, cc2540, IAR 8051 v8.2,基于SimpleBLEPeripheral例程。

在程序中调用osal_start_timerEx()函数,时间周期大于或等于5ms的时候,调用osal_stop_timerEx()可以停止该周期事件。

但当时间周期小于5ms时,调用osal_stop_timerEx()就不能停止该周期事件。

由于程序需要执行周期为2ms/3ms的事件,怎样才可以自由控制呢?即是可以自主关闭定时器事件。有什么办法可以解决?谢谢您耐心的回复!

stop应该和时间没有关系,分析下是不是代码执行先后错了。
还有运行时尽量不要使用中断,让程序一直保持运行状态,使用延迟运行来处理等待的事务

Hi,wang jhon

能请教下你是修改了哪些地方使程序进入休眠态么?

谢谢

就是把设置的事件全部清空了,就进入休眠了

我是这样做的。

我把TI的keyfob这个程序烧了一下 测下电流大概有0.2mA左右 貌似还是有点高 可能并未进入休眠态 不知道是哪些事件还在运行呢

Cheryl Wong,

 

   你好!

   请问你是如何测量电流的啊?谢谢!

Frank Xu

请参阅此文档: http://www.ti.com/general/docs/lit/getliterature.tsp?baseLiteratureNumber=swra347&fileType=pdf

建议直接阅读电源管理的代码,不算太难

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top