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.

[FAQ] 【分享】TI-RTOS 中的MSP432 Timer在深度睡眠模式下的使用

Other Parts Discussed in Thread: SYSBIOS


一 遇到的问题

当MSP432P401定时器处于活动状态时,无法使用深度睡眠模式(即LPM3和LPM4)。

因为默认情况下,TI-RTOS使用MSP432计时器来驱动计时(例如Task_sleep,带有超时的Semaphore_pend等)。通过使用MSP432定时器作为默认定时器,它可以提供良好的粒度,并允许应用程序使用WDT(或RTC)。

二 解决方法

解决方法是在深度睡眠模式下使用看门狗定时器(或RTC)来驱动TI-RTOS中的时序。由于看门狗保持活动状态,因此可以执行DEEPSLEEP_0(又名LPM3)。该方法的缺点是看门狗的粒度比MSP432定时器的粒度小。

三 实施步骤

基本思想是使用看门狗定时器来驱动TI-RTOS的时钟滴答。这可以通过以下步骤完成:

1 告诉TI-RTOS时钟滴答将由应用程序驱动。用户可以在TI-RTOS配置文件(.cfg)中完成。

2 为看门狗定时器创建一个Hwi。用户可以在 runtime execution或通过TI-RTOS配置文件(.cfg)来完成。对于此示例,我们将在配置文件中创建它。

3 在运行时启用看门狗。

4 限制DEEPSLEEP_1(又名LPM4)模式,否则进入该模式时将禁用看门狗。DEEPSLEEP_0和DEEPSLEEP_1之间的节电比较小。

5 让Hwi函数调用Clock_tick()来驱动Clock模块的内部时序。

四 TI-RTOS配置更改

将以下行添加到.cfg文件的底部。

/* Plug the WDT into the Hwi Table. This could have been done

* in the runtime code also.

*/

var hwi0Params = new m3Hwi.Params();

hwi0Params.instance.name = "wdHwi";

Program.global.wdHwi = m3Hwi.create(19, "&kernelClock", hwi0Params);

 

/* Tell the Clock module that the application will supply the tick */

var Clock = xdc.useModule('ti.sysbios.knl.Clock');

Clock.tickSource = Clock.TickSource_USER;

Clock.tickPeriod = 250000; // using WDT gives us less granularity

// used in interval mode here, not traditional watchdog mode

// For SimpleLink MSP432 SDK users, you might need the next line also ClockFreqs = xdc.useModule('ti.sysbios.family.arm.msp432.ClockFreqs');

五 Runtime更改

1 在MSP_EXP432P401R.c文件中的Power_init()之后添加这些行。

Power_init();

   /* Do not go into LPM4 since we need the watchdog to stay active */

   Power_setConstraint(PowerMSP432_DISALLOW_DEEPSLEEP_1);                                                          

   MAP_WDT_A_holdTimer();

   /*

   * Use the BLCK line if the XCLK line gives a compiler error. The XCLK macro was a bug.

   * The define has been removed from driverlib since there is no XCLK on the MSP432.

   */

   //MAP_WDT_A_initIntervalTimer(WDT_A_CLOCKSOURCE_XCLK, WDT_A_CLOCKITERATIONS_8192);

   MAP_WDT_A_initIntervalTimer(WDT_A_CLOCKSOURCE_BCLK, WDT_A_CLOCKITERATIONS_8192);

   MAP_WDT_A_clearTimer();

   MAP_WDT_A_startTimer();

}

2 将睡眠策略更改为PowerMSP432_deepSleepPolicy。

const PowerMSP432_ConfigV1 PowerMSP432_config = {

   .policyInitFxn =&PowerMSP432_initPolicy,

   .policyFxn =&PowerMSP432_deepSleepPolicy,

   .initialPerfLevel = 2,

   .enablePolicy = true,

   .enablePerf = true,

   .enableParking = true

};

3在TI-RTOS配置文件中添加创建的Hwi函数

include <ti/sysbios/knl/Clock.h>

/*

======== kernelClock ========

This will advance the kernel's Clock tick

/

Void kernelClock(UArg arg) {

   Clock_tick();

}