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

关于CC2540进入PM3

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

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

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

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

感谢回答!!!!

Yan:

Hi wang,

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

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

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

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

wang jhon:

回复 Yan:

Hi,Yan,

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

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

十分感谢!

wang jhon:

回复 Yan:

Hi Yan,

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

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

wang jhon:

回复 Yan:

还有一点就是,如果我把我自己设置的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();}

这我不明白的是:

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

Yan:

回复 wang jhon:

Hi wang,

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

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

wang jhon:

回复 Yan:

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,有没有什么接口可以设定这个呢?

谢谢!!!

wang jhon:

回复 Yan:

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

谢谢!!!

key dongle:

回复 Yan:

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值。

谢谢你回复!

key dongle:

回复 key dongle:

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

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

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

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

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

赞(0)
未经允许不得转载:TI中文支持网 » 关于CC2540进入PM3
分享到: 更多 (0)