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.

[参考译文] TM4C123GH6PGE:尝试睡眠、由于 HIBERNATE_INT_WR_COMPLETE 而唤醒。 EEPROM 程序问题

Guru**** 2473260 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/681557/tm4c123gh6pge-trying-to-sleep-waking-up-due-to-hibernate_int_wr_complete-eepromprogram-question

器件型号:TM4C123GH6PGE
主题中讨论的其他器件:TM4C123

正在将代码库移植到新硬件。   新硬件更好地利用休眠模块并关闭 TM4C123电源。

所发生的情况是、当应用程序进入睡眠状态时、它会再次唤醒。   问题的原因似乎是"写入完成"中断。   我曾尝试屏蔽该中断、但不是以正确的方式执行、就是重新启用了其他中断。

if (ROM_HibernateIsActive ())
{
uiStatus = ROM_HibernateIntStatus (false); //读取状态以确定唤醒原因。 
ROM_HibernateIntClear (uiStatus); //清除休眠中断
(笑声) 否则、如果(uiStatus & HIBERNATE_INT_WR_COMPLETE)// 0x00000010 <<--此位有效 { uprintf ("\n 由 HIB INT WR 完成唤醒"); SYS_DATA.STACD=空闲;//转到主菜单 } ...

我要寻找的是处理 EEPROMProgram 的正确方法。   请参阅下面的 EEPROMProgram 语句、是否有方法轮询'Write Complete'?   有人能给我举个例子吗?  谢谢

//让消息输出
UARTFlushTx(0);
ROM_SysCtlDelay (millimonde*250);
console_off();

//在休眠之前保存 sys_data 变量!
//将 sys_data 结构复制到 EEPROM 中。 最后一个参数确保字节数是4
if (EEPROMProgram ((uint32_t*)&sys_data、0x400、(sizeof (sys_data)+ 3)&~3))
{
uprintf ("存储系统数据时出错。\n");
error_store ("存储系统数据时出错。");
return;
}<-<-<-<-<-<-<-<-<


在这里应该放置什么代码来等待'Write Complete'

//清除任何挂起的中断
ulStatus = ROM_HibernateIntStatus (0);
ROM_HibernateIntClear (ulStatus);

ROM_HibernateRTCTrimSet (0x7FFF);//确保将 TRIM 设置为默认值以防止锁定(请参阅勘误表)

//禁用 GPIOLETE 控制集
(GPORTEON);

//告诉休眠模块我们想要睡眠
ROM_HibernateRequest ();

ROM_SysCtlDelay (毫秒);//给休眠时间。

//不应该到达这一点,uprintf 出错
("\n\n\n Hybernation 错误!\n\n");
error_store (" Hybernation 错误");

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

    写入完成信号与 EEPROM 无关。 当休眠模块准备好接受另一个写入时、该位被置位。 该位由写入休眠模块位的 TivaWare 例程读取。 它不是阻止器件进入休眠模式的屏蔽写完成中断位。

    您设置的是哪种唤醒源? 如果未配置唤醒源、器件将不会进入休眠模式。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢指针、唤醒源是 RTC 和 WAKE 引脚。

    由于旧硬件没有关闭稳压器、而新硬件确实关闭了、因此问题似乎是由 VDD3ON 位引起的。

    由于新硬件在深度睡眠期间关闭电源、因此 VDD3ON 位不应置位。 删除设置该位的行、然后允许发生深度睡眠。 WC 中断看起来是由于 VDD3ON 设置不正确而产生的。 我仍在阅读 TRM (硬件用户指南)、以确保正确管理休眠模块。

    在我之前发布的代码中-删除以下行将使睡眠工作正常。

    //禁用 GPIO 引脚的 CPU 控制(设置 VDD3ON 位)
    HibernateGPIORetentionEnable();