This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

cc2540 定时器1ms

Other Parts Discussed in Thread: CC2540

各位:

我现在要每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不是数字部分已经被关掉了吗,那除了睡眠定时器外的其他定时器应该不能工作了吧?