一 遇到的问题
当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();
}