cc2540 定时器1ms
各位:
我现在要每1ms处理一个事件。我不知道如何获取1ms时间。
请问:如果我使用void buzzerInit(void) timer3设置1ms中断一次的话。中断函数在哪里?
在从机代码中,频繁键入hal_sleep 的PM2模式,这时候timer3 的时钟源会被停止。这样会导致timer3不准确,而如果不频繁进入PM2 功耗又比较大?
请问还有其他方式能准确的获取到1ms么?
HI T_MAC:
我尝试使用halSleep进入PM3模式,可是经过测试之后发现,程序并没有进入PM3模式,你能指导一下我怎么样控制程序运行在PM3或者
PM2模式吗?你的回复将是我无尚的荣幸。
谢谢你
hi :
1、你必须确保能在osal_run_system函数中调用如下红色代码。
#if defined( POWER_SAVING )
else // Complete pass through all task events with no activity?
{
osal_pwrmgr_powerconserve(); // Put the processor/system into sleep
}
#endif
2、在osal_pwrmgr_powerconserve中确保能执行到如下红色代码
{
uint32 next;
halIntState_t intState;
// 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 );
}
}
}
#endif /* POWER_SAVING */
3、如果能进入OSAL_SET_CPU_INTO_SLEEP( next );后,里面变量halPwrMgtMode 可设置进入PM2或Pm3.
Hi T_MAC,
osal_start_timerEx() 的单位就是1ms 的.
osal timer 的计数实际上用的是timer 2 的 记时值(通过轮询寄存器状态, 并非中断), 在PM2 模式下 timer 2 的记时功能照常工作, 所以如果只是1ms 事件的话, 用osal_start_timerEx() 就应该可以, 而且不费电.
HI T_MAC:
非常感谢你的回复,我现在尝试按你的指导去验证一下代码,验证完成之后再向你请教,谢谢你。
hi T_MAC:
我调了一下我自己的代码,发现你所说的两个地方都是调到了的,#define OSAL_SET_CPU_INTO_SLEEP(m) halSleep(m) /* interface to HAL sleep */
我不是很清楚为什么在halSleep(m)里它问什么会调用LL_PowerOnReq( wakeForRF )这个函数?这个函数调用之后,定时器2就被打开了,程序也就不能进入
PM2或者PM3,请问你的代码里是不是也调用了这个函数?假如调用了,你测试出来的电流是0.04毫安吗?
希望你能回复,谢谢
Hi ,
cc2540芯片资料上说,进入PM3后,要关闭所以的时钟,振荡器,然而进入PM3后打印的寄存器的值如下:
CLKCONSTA:0x0
CLKCONCMD:0x0
SLEEPCMD:0x7
SLEEPSTA:0x4D
在设置成PM3后,所以的时钟与振荡器是不是自动关闭,还是程序来手动关闭,如果是程序来关闭的话,这么关闭啊
hi
LL_PowerOnReq控制RF射频开关,这函数在Pm2、PM3唤醒后才调用的。
HI YAN:
我试过用osal_start_timerEx设置1ms 定周期,功耗挺大的,不适用我这项目。请问还有其他能准确获取1ms 定周期,而且功耗影响不大的么?
我之前自己写了一个timer3的,结果也是功耗比较大
我也需要在睡眠状态下的1ms的定时器,用于计算脉冲间隔,但是PM2不是数字部分已经被关掉了吗,那除了睡眠定时器外的其他定时器应该不能工作了吧?