主题中讨论的其他器件: CC2544、 CC2545
您好!
我正在使用 TI 的示例代码在功率模式 PM2中测试 CC2543的功耗,我发现:
μA 数据表中所述、关于 CC2543、电源模式2 (睡眠定时器打开):电流消耗0.9 μ A、
-我在 PM2中使用了30秒的睡眠时间。 但 电流 μA 仍不会降低<30 μ A
-请检查代码,并告诉我问题的位置?
#include
#include
#include
#include
#include "ioCC2543.h"
/
*局部变量
*
//用于存储24位睡眠定时器值的 union。
typedef union{
无符号长整型值;
无符号字符字节[4];
} UNION 32位;
静态 union_32位 sleep_timer;
/
*本地函数
*
/
*@fn sleep_isr
*
*@睡眠定时器的简短中断服务例程、用于唤醒
*系统处于电源模式。 当唤醒时、标志被清除、然后
* LED1已切换。
*
*@param void
*
*@返回 void
*
#pragma vector = ST_vector
_interrupt void sleep_ISR (void)
{
/*请注意,以下标志的清除顺序很重要。
对于脉冲或 egde 触发的中断、必须清除 CPU 中断
在清除模块中断标志之前的中断标志。 *
//切换 SRF05EB LED1。
P1_0 ^= 1;
//清除[IRCON.STIF](睡眠定时器 CPU 中断标志)。
stif = 0;
}
/
*@fn main
*
*@简短设置睡眠定时器和睡眠定时器中断。 进出
*功率模式1。
*
*@param void
*
*@返回0
*
int main (空)
{
/
*设置时钟和频率
*
*使用的系统时钟源是速度为32MHz 的 HS XOSC。
*
//将系统时钟源更改为 HS XOSC 并将时钟速度设置为32MHz。
CLKCONCMD =(CLKCONCMD 和~(CLKCON_CLKSPD | CLKCON_OSC))| CLKCON_CLKSPD_32M;
//等待直到系统时钟源变为 HS XOSC (CLKCON.OSC = 0)。
while (CLKCONSTA 和 CLKCON_OSC);
//我们需要等待大约2ms、直到32kHz RCOSC 被校准。
halMcuWaitM(2);//给定32MHz 系统时钟源。
/
*设置 I/O
*
/*
//初始化 SRF05EB LED1的 P1_0。
P1SEL &=~BIT0;//用作通用 I/O
P1_0 = 1;// LED1打开。
P1DIR |= BIT0;//输出。
*
/
*设置睡眠定时器中断
*
//清除[IRCON.STIF](睡眠定时器 CPU 中断标志)。
stif = 0;
//设置单独的中断使能位[IEN0.STIE=1。
stie = 1;
//通过设置[IEN0.EA=1]启用全局中断。
Ea = 1;
/
*在 PM2中设置功率模式。
*当睡眠时间超过3ms 时、通常使用电源模式2。
* CC2544不支持 PM2和 PM3!
*
//设置功率模式、PM2。
SLEEPCMD =(SLEEPCMD 和~SLEEPCMD_MODE)| SLEEPCMD_MODE_PM2;
/
*设置睡眠定时器
*
*睡眠定时器在32kHz RC 振荡器上运行。 CC2545有的
*可以使用外部32kHz 晶体、LS XOSC 可以是
通过清零 CLKCONCMD.OSC32K 位选择*。 这将启动时钟
*源更改、CLKCONSTA.OSC32K 反映了当前设置。 请注意这一点
必须在系统时钟源为 HS RCOSC 时完成*。
*
//要确保读取更新的值,请等待上的正转换
//通过轮询 SLEEPSTA.CLK32K 位实现32kHz 时钟。
while (!(SLEEPSTA 和 SLEEPSTA_CLK32K));//等待睡眠计时器上的正极闪存。
//读取睡眠定时器的当前值。
SLEEP_TIMER.BYTE[0]= ST0;//必须首先读取 ST0。
SLEEP_TIMER.BYTE[1]= ST1;
SLEEP_TIMER.BYTE[2]= ST2;
SLEEP_TIMER.VALUE = 0;
while (1)
{
//用32753个周期递增睡眠定时器值以创建新的
//在大约1秒内比较匹配。
SLEEP_TIMER.VALUE += 327530;
//加载睡眠定时器的新比较值时、
// ST2和 ST1寄存器必须在 ST0之前加载。
ST2 = SLEEP_TIMER.BYTE[2];
ST1 = SLEEP_TIMER.BYTE[1];
//等待加载准备就绪,然后再写入 STO。
while (!(STLOAD & STLOAD_LDRDY));
ST0 = SLEEP_TIMER.BYTE[0];
//PCON = 0x01;
//强制器件进入 SLEEPCMD.MODE 设置的电源模式。
//LLECTRL = 0x00;//建议在进入 PM2/PM3之前将 LLECTRL 设置为0
EnterSlepModeProcessInterruptsOnWake();
//LLECTRL = 0x01;//从 PM2/PM3返回后将其设置回1
SLEEP_TIMER.VALUE = 0;
}
}