主题中讨论的其他部件: MSP430FR5994, ENERGYTRACE
工具/软件:TI-RTOS
我正在使用TI-RTOS,并已构建了一个运行多个任务的应用程序。 完成所有工作任务后,主任务将调用Task_Sleep(),MSP430将在设定的时间内进入LPM3。 我想进入3.5 并使用RTC警报在设定的时间后从3.5 返回。 我可以让MSP430进入3.5 ,但无法使其返回正常操作。
我一直在使用示例项目"ctpl_ex2_rtc_lpm35_MSP-exp430fr5994"作为如何使用CTPL接口进入3.5 并在系统状态从LONA返回3.5 时存储系统状态的起点。 我可以运行此示例应用程序,它可以在不出现问题的情况下进入和退出3.5。 我从该示例中复制了CTPL文件并将其添加到我的项目中。 为了确保我没有错过所需的外设,我正在以启用ctpl msp430fr5994.c的所有"CTPL SAVE"宏开始,因此,所有外设设置和FRAM数据都应在从3.5 返回时检索。 我在main.c中添加了以下内容以支持RTC中断和CTPL接口:
static void Board_initrtc (void)
{
/*配置RTC_C,每2秒中断一次*/
RTCCTL0_H = RTCKEY_H;
RTCCTL0_L = RTCTEVIE;
RTCCTL1 = RTCSSEL_2 | RTCTEV_0 | RTCHOLD;
RTCPS0CTL = RT0PSDIV0 | RT0PSDIV1;
RTCPS1CTL = RT1SSEL1 | RT1PSDIV0 | RT1PSDIV1;
/*启动RTC日历模式*/
RTCCTL1 &=~(RTCHOLD);
}/*
此函数将在main和初始化变量之前调用。
* ctpl_init()函数必须在开始时调用才能通过
断电库启用计算*。 如果您的应用程序已声明此
*函数,您可以删除此文件,并在
函数的*开头将调用添加到ctpl_init()。
*/
#if defined(__TI_Compiler_version__)
int _system_pre_init(void)
#Elif defined(__IAR_systems_icc__)
int __low_level_init(void)
#endif
{
/*初始化ctpl库*/
ctpl_init();
/*在此处插入应用程序预初始化代码。 */
Return 1;
}
void rtc_c_hwiIntFxn(void){
静态int secCount = 0;
Switch(__偶 数_in_range(RTCIV, RTCIV__RT1PSIFG))
{
案例RTCIV__none: 中断; //不中断
CASE RTCIV__RTCOFIFO:中断; // RTCOFIFO
案例RTCIV__RTCRDYIFG: // RTCRDYIFG
secCount++;
__no_operation(); //每秒中断一次
中断;
案例RTCIV__RTCTEVIFG: // RTCEVIFG
__no_operation(); //每分钟中断一次-在此处设置断点
中断;
案例RTCIV__RTCAIFG:中断; // RTCAIFG
Case RTCIV__RT0PSIFG:中断; // RT0PSIFG
案例RTCIV__RT1PSIFG:中断; // RT1PSIFG
默认值:break;
}
}
在我的主要任务中,我将呼叫更改为Task_Sleep,以便:
ctpl_enterLpm35 (CTPL_enable_restore_on_reset);
我已向EnergyTrace++确认,MSP430在此次呼叫中确实进入了3.5。 但是,它从3.5 返回。 要将3.5 与TI-RTOS配合使用,我还需要添加什么?