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.

[参考译文] MSP430FR5994:从 LPM3.5唤醒以执行 main 的第一个函数的时间比数据表时间长

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1174365/msp430fr5994-the-time-to-wake-up-from-lpm3-5-to-execute-the-first-function-of-main-is-longer-than-the-data-sheet-time

器件型号:MSP430FR5994

编程 RTC 时间100ms、将 P3.7引脚拉至低电平、进入睡眠模式。

RTC 唤醒后、停止看门狗、将 P3.7引脚拉高、

测试 P3.7引脚低电平时间实际时间112.9ms、超过350us、如手册中所述

程序串行接口和某些程序屏蔽初始化后的测试低电平时间为104.4ms

当芯片唤醒时、首先初始化、然后解锁的外部晶振、并且等待时钟稳定的问题已经被消除。

void RTCinit()
{

	//设置RTC为计数器模式,32KHZ外部晶振,32BIT计数值
	RTC_C_initCounter(RTC_C_BASE,RTC_C_CLOCKSELECT_32KHZ_OSC,RTC_C_COUNTERSIZE_32BIT);
	RTC_C_setCounterValue( RTC_C_BASE,0X0);
	//Enable interrupt for RTC Ready Status, which asserts when the RTC	
	//Calendar registers are ready to read.
	//Also, enable interrupts for the Calendar alarm and Calendar event.
	RTC_C_enableInterrupt(RTC_C_BASE, RTCTEVIE);
	//RTC_C_disableInterrupt(RTC_C_BASE, RTCTEVIE );
	 __enable_interrupt();
}


int8_t Timeing(float fnextTime )
{
	uint32_t ulcounterValue =0;
	if(fnextTime > RTC_MAX_SECOND) //判断时间是否合格
	{
		return -1;
	}
	else if(fnextTime < FLOATERR)
	{
		return -2;
	}
	else
	{
		upMcuState(MCU_SLEEP);
		ulcounterValue = 4294967296 - (uint32_t)((fnextTime)*32768.0);
		RTC_C_holdClock(RTC_C_BASE);
		RTC_C_initCounter(RTC_C_BASE,RTC_C_CLOCKSELECT_32KHZ_OSC,RTC_C_COUNTERSIZE_32BIT);
		RTC_C_setCounterValue(RTC_C_BASE,ulcounterValue);
		RTC_C_enableInterrupt(RTC_C_BASE, RTCTEVIE);
		RTC_C_startClock(RTC_C_BASE);
}

int main(void)
{
// Stop watchdog timer
WDT_A_hold(WDT_A_BASE);

//FRAMCtl_A_enableWriteProtection();

	gIF_GPIOinit();
	io_On;
	RTCinit();                                                      //初始化RTC
	gIF_SystemClockConfig();										//初始化系统时钟



    while(1)
    {

		Timeing(0.1);
      
		io_OFF;
		PMM_turnOffRegulator();
		LPM3;
    }
}

这是我的测试演示。

具体的时间间隔为102.96ms-100ms=2.96ms

我将在 IO_ON 中拉为高电平;首次拉为低电平到首次拉为高电平的时候是休眠前的 IO_OFF 到唤醒后的 IO_ON。

您可以帮助检查此案例吗?

此致、

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

    很抱歉,我无法清楚地理解你。 您的意思是、根据规格、测试值为350uS、但测试值为2.96ms 吗?

    可能是初始化变量所花费的时间。

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

    您好、伊斯天、

    客户将 -rom_model 更改为  -ram_model、唤醒时间与规范相同。 但有一个新问题:唤醒后、调用 printf 时会飞。

    此致、

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

    您好、伊斯天、

    在将--rom_model 修改为--ram_model 后进入 LPM3.5睡眠模式,指针在使用 printf 唤醒后运行以打印数据。  

    上面的红色字表示进入 LPM3.5睡眠之前的地址。

    上面的红色字表示唤醒后的地址。   执行此汇编语句时、跳转到该地址会导致程序运行。

    如何解决此问题?  

    此致、

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

    您好 Ben、

    在何处设置 RAM 模型?

    您可以看到、RAM 将在 LPM3.5中丢失。 我建议检查 LPM3中的问题是否会得到解决。

    伊斯天

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

    您好、伊斯天、

    我在 MSP430LINK 的 CCS 中设置它。

    LPM3中不会出现此问题、包括最后一个较长的唤醒时间。 由于 LPM3的内核未断电、RAM 和 ROM 的设置没有问题、只有内核断电时才可能出现此问题。  

    此更改基于以下内容  

    此致、

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

    您好、伊斯天、

    我下午又做了测试、电路板没睡着、用 RST 引脚复位电路板也没有触发这个问题。 断电和上电会触发此问题。 目前、断电和 LPM3.5会触发此问题。 复位和 LPM3不会触发此问题。 请参阅手动启动程序。 下图显示了 LPM3.5和 RESET 的相同流程。 那么、我想知道 MCU 内核是否通过复位断电?  

    此致、

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

    您好 Ben、

    当我检查时、锁定函数地址位于 RAM 上。  

    您能帮助检查一下:我认为这可能是 RAM 初始化问题造成的。

    1.进入主函数时、0x2C14处的值是否固定

    当0x2C14的值始终为该值时:

    这个问题有点难理解。  

    伊斯天

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

    您好、伊斯天、

    现在0x2c14的值为2300、我重新加载或复位仍然是该地址。

    2.运行地址在当前的几个测试中将发生变化,但变化模式不清楚。  

    3.我将 ROM 更改为 RAM 的更改操作、 它会带来全局变量更改、我不明白为什么函数地址会更改?  

    此致、

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

    您好 Ben、

    1.您能在地址进入 LPM3.5之前、在地址退出 LPM3.5并跳转到主函数/int00之后检查一下吗?

     2.我想确保地址由 MCU 或项目中的代码设置。

    伊斯天

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

    您好、伊斯天、

    询问您 所讨论的地址是 intt00的地址还是 lock 的地址。

    什么决定了 CMD 中的中断优先级、我可以自己更改这种类型吗?  

    此致、

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

    您好 Ben、

    1、int00就像这个。 入口写入0xFFFE。 按下系统重置键后、您可以输入此功能。 抱歉、我手上没有 MSP430板。

    不可以、您不能更改优先级。  

    伊斯天

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

    您好、伊斯天、

    地址未更改。

    图中的第一个地址。

    下图是从 LPM3.5唤醒后的情况。

    如何确定我自己设置了它? 地址现在与映射文件的地址匹配。  

    此致、

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

    您好 Ben、

    很抱歉让你感到困惑。

    我的意思是:

    问题在于 _lock 的值错误。 我假设这个问题只发生在这个函数上。

    2.我想检查_lock 函数地址是在 main 函数之前还是在 main 函数之后固定/更改。 如果它位于主函数之后、这意味着您可以对代码进行一些更改以解决它。 如果是在 main 函数之前和 int00之后、这意味着您只能通过更改编译器配置来解决它(例如、降低优化级别、更改堆栈大小)。  

    3.我认为您可以在 调试模式下检查_lock 值:

    伊斯天

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

    您好、伊斯天、

    当我检查时、该值会发生变化。

    问题是、我更改了编译器的选项、导致了问题、问题的根本原因不清楚、因此在其他地方存在问题、使代码崩溃。

    此致、

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

    您好 Ben、

    根本原因在于模型选项。 您可以在以下位置找到更多详细信息:文档:coecsl.ece.illinois.edu/.../TI_CompilerReference.pdf

    在运行时不会初始化全局可行。 它看起来会在加载程序之前进行初始化。 但是、它不适用于该变量。 此问题与编译器有关。 解决此问题的简单方法是自行初始化_lock 地址。

    加电或 LPM3.5会导致此问题的原因、因为执行这些操作后 RAM 将被清除。 如果地址正确 、 并且不会在复位时断电和清除、您将看到差异。