微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI无线射频设计 > CC2530做低功耗设备

CC2530做低功耗设备

时间:10-02 整理:3721RD 点击:
前段时间使用ZigBee做了一款低功耗的产品,因为是电池供电,所以会要求很低的功耗。这也就决定的设备的类型(End Device).
End Device做低功耗设备其中一个很重要的宏定义 ---- POWER_SAVING 是必须得有的。
那么问题来了,定义好了宏定义,设备是怎么进入休眠的呢?下面一一道来。
1.首先在Zmain.c中找到 osal_start_system(); // No Return from here
2.进去之后来到OSAL.c 再去osal_run_system();看看,
我们可以看到下面一段函数。

do {
if (tasksEvents[idx]) // Task is highest priority that is ready.
{
break;
}
} while (++idx < tasksCnt);
上面一段是检测事件列表是否还有事件没执行

if (idx < tasksCnt)
{
uint16 events;
halIntState_t intState;

HAL_ENTER_CRITICAL_SECTION(intState);
events = tasksEvents[idx];
tasksEvents[idx] = 0; // Clear the Events for this task.
HAL_EXIT_CRITICAL_SECTION(intState);

activeTaskID = idx;
events = (tasksArr[idx])( idx, events );
activeTaskID = TASK_NO_TASK;

HAL_ENTER_CRITICAL_SECTION(intState);
tasksEvents[idx] |= events; // Add back unprocessed events to the current task.
HAL_EXIT_CRITICAL_SECTION(intState);
}
如果有事件没有执行,那么就会进入到上面的 if 中去执行相应的事件。
#if defined( POWER_SAVING ) && !defined(USE_ICALL)
else // Complete pass through all task events with no activity?
{
osal_pwrmgr_powerconserve(); // Put the processor/system into sleep
}
#endif

如果没有,就去休眠吧。

3.为了了解更清楚,继续追函数吧。下面进入osal_pwrmgr_powerconserve(); // Put the processor/system into sleep 看看

// Should we even look into power conservation
if ( pwrmgr_attribute.pwrmgr_device != PWRMGR_ALWAYS_ON )
{
// Are all tasks in agreement to conserve
if ( pwrmgr_attribute.pwrmgr_task_state == 0 )
{
// Hold off interrupts.
HAL_ENTER_CRITICAL_SECTION( intState );

// Get next time-out
next = osal_next_timeout();

// Re-enable interrupts.
HAL_EXIT_CRITICAL_SECTION( intState );

// Put the processor into sleep mode
OSAL_SET_CPU_INTO_SLEEP( next );
}
}

当然,红色的不容错过。全局搜一下PWRMGR_ALWAYS_ON 这个宏
我们会看到有地方使用到 osal_pwrmgr_device( PWRMGR_ALWAYS_ON ); 进入这个函数看看,你就会明白。这个使用这个函数会使协议栈不进入休眠。
聪明如你,一定会想到不进入休眠可不行。我们找 PWRMGR_ALWAYS_ON 宏的时候,在它的下面还有一个宏 PWRMGR_BATTERY 看这宏的名字就知道
如果 osal_pwrmgr_device( PWRMGR_BATTERY );一下,就会恢复协议栈进入休眠的功能。 需要说明的是,并不是调用的上面的函数,协议栈就会立刻进入
休眠或唤醒。如果想立刻进入休眠或唤醒,去看看PCON这个寄存器的手册说明吧。

继续说上面的函数吧,看OSAL_SET_CPU_INTO_SLEEP( next );
void halSleep( uint32 osal_timeout )

保存的时候,没想到发帖。
继续上面的。OSAL_SET_CPU_INTO_SLEEP( next ); 这个函数调用之后,实际上回进入void halSleep( uint32 osal_timeout )函数。我们会找到HAL_SLEEP_SET_POWER_MODE();这个宏,这个宏被执行后。会正式进入休眠状态。

说的有点啰嗦,适合新手看看。高手别喷!

TI无线部分很好的经验分享,目前越来越多的人开始关注无线设计啦,但是相关的心得、体会、经验、总结却没有那么多,楼主加油。

后面有空继续写点,希望能帮到别人。

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

网站地图

Top