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.

[参考译文] RTOS/MSP-EXP430FR5994:CAN't从3.5 中返回

Guru**** 2587365 points
Other Parts Discussed in Thread: MSP-EXP430FR5994, MSP430FR5994, ENERGYTRACE

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/621839/rtos-msp-exp430fr5994-can-t-return-from-lpm3-5

部件号:MSP-EXP430FR5994
主题中讨论的其他部件: MSP430FR5994ENERGYTRACE

工具/软件: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配合使用,我还需要添加什么?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Brian,

    我建议您看看附加的msp430fr599x_lpm3-5_01.c示例,而不是CPTL示例。 这一个不那么抽象,因此您可以跟踪正在发生的事情。 从您发布的内容来看,我无法判断出可能存在什么问题。 您是否可以创建一个精简的示例,其中只有一个任务遇到相同的行为,并将其发布到论坛上?

    e2e.ti.com/.../msp430fr599x_5F00_lpm3_2D00_5_5F00_01.c

    此致,

    Caleb Overbay

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Caleb,


    感谢您的帮助。  我确实尝试了这个例子,当RTC中断时,它确实返回到main()。  我启动了一个新的空TI-RTOS (“新CCS项目”菜单中的“空(最小)项目”),然后添加了EnterLPM35(),我能够在RTC中断时使程序跳回main()。  但是,我希望保留状态信息,这就是为什么我要查看CTPL驱动程序的原因。

    我确实看到了另一个应用程序注释,其中包含FRAM部分,我可以将变量声明为FRAM的一部分,然后它们的状态在整个电源循环中是持续的。  我决定,如果我只是在FRAM中保存我关心的任务状态,我可以重新启动TI-BIOS的所有其他操作,它应该对我正常工作。

    我得到了一个工作示例,其中包含一个通过重新启动保存的持久性状态变量。  要试用,请创建新的TI-RTOS“空(最小)项目”,并替换项目中下面的两个文件。  主任务将根据togleCount的值在不同的时间长度内打开LED。  RTC中断每分钟递增TogglCount一次,然后在达到10后重置。  我必须调整akeUpLPM35()函数,因为TI-RTOS根据其配置设置时钟。


    e2e.ti.com/.../empty_5F00_min.c

    e2e.ti.com/.../empty_5F00_min.cfg