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.

[参考译文] TM4C1292NCZAD:休眠中断唤醒器件时的多状态

Guru**** 2615645 points

Other Parts Discussed in Thread: EK-TM4C1294XL

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/768073/tm4c1292nczad-hibernation-interrupt-multiple-statuses-at-the-wake-of-the-device

器件型号:TM4C1292NCZAD
Thread 中讨论的其他器件:EK-TM4C1294XL

您好!

我是微处理器固件开发的新手。

到目前为止、我为 tm4c129器件开发了休眠部件。

在微外设的初始化阶段、休眠外设初始化如下:

启用休眠模块的时钟。

等待晶体加电和稳定

-配置休眠模块的时钟源(用于连接到 XOSC1和 XOSC0的外部晶振)

启用 RTC 功能

设置两个备用唤醒源:HIBERNATE_WAKE_PIN | HIBERNATE_WAKE_RTC

读取 HIBCTL、它指示 VDD3ON、PINWEN、CLK32EN、RTCEN 位设置为1 (调试指令)。

清除任何挂起状态。

 当向器件询问重新启动序列时:

RTC 设置为0  

-自现在起,匹配0寄存器设置为10秒

休眠请求已完成。

当微唤醒时、会读取 HIBRIS 寄存器值以根据导致微唤醒的源执行操作。

我希望检测到的唯一唤醒源是 RTC、它实际上导致了微控制器的唤醒、但也检测到了其他源。

 

分析 HIBRIS 位可以注意到:

1) 1)    RTCALT 位被设定为1

2)    VDDFAIL 位设置为1:如数据表所述:“由于任意断电或一个或多个电源(VDD、VDDA、VDDC)降至定义的工作范围以下,中断被发送到中断控制器”

3)    3) RSTWK 位设置为1:如数据表中所述:“由于 RESET 引脚已编程为将器件从休眠状态唤醒,中断被发送到中断控制器”

4)    PADIOWK 位设为1:如数据表中所述:“由于其中一个启用唤醒功能的 GPIO 引脚或外部复位引脚已被置为有效,中断被发送到中断控制器”

 

1)这正是我所期望的、将 RTC 设置为唤醒源、启用 RTC 并设置微休眠状态和微唤醒时间(10秒)之间的间隔。

2) 2)实际上 HIB 信号会下降、并从 VDD 微型引脚上移除3.3V 电源。 VBAT 保持在3.3V

3) 3)我无法理解为什么我没有将 RESET 引脚编程为唤醒源

4) 4)可以通过唤醒序列进行解释、我认为唤醒序列包含微复位、可能会发送到0复位引脚、但这不是我编程的内容。 此外、我不会对任何 GPIO 引脚进行编程

  用作唤醒源。

您是否会想到这种情况? 我所做的事有什么问题吗?

----------------------------------------------------
extern "C"{
#include 
}
int main (void)
{
//将计时设置为在120MHz
uint32_t freqSet = SysCtlClockFreqSet (((SYSCTL_XTAL_25MHz | SYSCTL_OSC_main | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、120000000);
SysCtlPeripheralEnable (sysctl_Periph_HIBERNATE);
while (!SysCtlPeripheralReady (sysctl_Periph_HIBERNATE)
{}

静态休眠外设休眠内置 Tiva (120000000);
HibernatePeripheralTiva;}-->Init());}-->init();}-->-----------


HibernatePeripheralTiva.cpp
#include 
#include 
#include 

HibernatePeripheralTiva::HibernatePeripheralTiva (uint32_t HibernatePeripheralThiva):myclient (NULL)、myClockFrequency (clockFrequency)
{}
HibernatePeripheralTiva:::~HibernatePeripheralTiva (uintleHibernatePeripheralThiva)
{
DisableHibernateHibernateHibernatePeripheralPeripheralPeripheral (natePeripheralThiva);
}HibernateTime_TimernatewakeFlag


:0)与 UernateWRTCLK_Time_Time_TimereT_HIBERR //bit 0 reg HIBRS/HIBIC
{
//打印"RTC 匹配寄存器"
}
if (wakeFlag 和 HIBERNATE_INT_LOW_BAT) //bit 2 reg HIBRS/HIBIC
{
//打印“低电量”
}
if (wakeFlag & HIBERNATE_INT_PIN_WAKE) //bit 3 reg HIBRS/HIBIC
{
//打印“WAKE 管脚置位”
}
if (wakeFlag & HIBERNATE_INT_WR_COMPLETE) //bit 4 reg HIBRS/HIBIC
{
//打印“HIBCTL 中的 WRC 位集”
}
if (wakeFlag & HIBERNATE_INT_GPIO_WAKE) //bit 5 reg HIBRS/HIBIC
{
//打印“GPIO 引脚置位”
}
if (wakeFlag 和 HIBERNATE_INT_RESET_WAKE) //bit 6 reg HIBRS/HIBIC
{
//打印“复位引脚置位”
}
if (wakeFlag & HIBERNATE_INT_VDDFAIL) //bit 7 reg HIBRS/HIBIC
{
//打印“VDD FAIL”
}

int HibernatePeripheralTiva::Init()
{
if (HibernateIsActive())
{
ui32Status = HibernateIntStatus (false);//读取状态以确定唤醒原因。
//打印 ui32Status
onWakeEvent (ui32Status);
HibernateRTCEnable();//启用 RTC 功能。
HibernateWakeSet (HIBERNATE_WAKE_PIN | HIBERNATE_WAKE_RTC);//配置为在外部 WAKE 管脚有效或 RTC 匹配时唤醒。
HibernateIntClear (ui32状态);
返回0;
}
EnableHibernatePeripheral ();
返回0;
}

void HibernatePeripheralTiva::EnableHibernatePeripheral ()
{
HibernateEnableExpClk (120000000);//启用休眠模块的计时
等待(100);//延迟允许晶振加电和稳定
HibernateClockConfig (120000000);//启用
休眠模块的 HIGRSC 功能;//启用休眠模块的休眠模块。
HibernateWakeSet(. HIBERNATE_WAKE_PIN | HIBERNATE_WAKE_RTC );//配置为在外部 WAKE 管脚有效或 RTC 匹配时唤醒。
ui32Status = HibernateIntStatus (false);
//打印 ui32Status
HibernateIntClear (ui32Status);
}
void HibernatePeripheralTiva::::DisablePeripheralPeripheral()
{
nateDisable ();
}
void HibernateIntClear:::HibernateWakePeripheralWake (UINT32_Hit)当请求

将此函数设置为0或 RT0时、即为1个中断。
HibernateRTCMatchSet (0、HibernateRTCGet ()+ hibTime);//将匹配0寄存器设置为从现在开始的时间等于 hibTime。
StartHibernate();
}

void HibernatePeripheralTiva::StartHibernate() //按下开关按钮
时调用此函数{
HibernateRequest();//请求休眠。
for (;;)//需要此处的循环来等待断电。 在该循环中执行时断电。
{
}

无效休眠外设 Tiva::等待(int 毫秒)
{
//一个计数或节拍将导致3个系统时钟的延迟(也称为机器周期)。
//系统时钟为120MHz。 3个周期等效于120 x 10^6/3或40000000 Hz
// 40000000/1000 =每毫秒40000个周期
SysCtlDelay (毫秒* 40000);}--><!--kadov_tag{</spaces>}}-->



HibernatePeripheralTiva.h
#include 
类休眠外设 Tiva
{
public:
HibernatePeripheralTiva (uint32_t clockFrequency);
virtual ~HibernatePeripheralTiva ();
int Init();
void StartPeripheralation ();
void HibernateAndWake (uint32_t sec);
void EnableHibernatePeripheral();
void DisableHibernatePeripheral();
void wait (int milliseconds );
void onWakeEvent(UINT32_t WakeFlag);
private:
HibernatePeripheralClient* myclient;
uint32_t myClockFrequency;
uint32_t ui32Status;
};

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

    如果您还可以发布您的源代码、那么我们可以更轻松地为您提供反馈、以便我们可以详细查看所有调用(或许不调用)的 API。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢 Ralph。 我使用文件(.h、.cpp)或部分文件(main.cpp)编辑了帖子、有助于了解我的操作
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Ludovico、

    谢谢、我明天会尝试向您提供反馈、对我来说还没有什么问题、所以我想在结束时运行几个测试、然后再做进一步的评论。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    再次感谢您的帮助

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

    我还没有能够重复这一具体情况。 您经常看到这种情况吗? 是在定制板上还是在 LaunchPad 上? 重新创建的容易程度如何?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、我发布的代码和介绍代码的说明中描述的硬件总是会发生这种情况

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

    我看到、这对我来说有点问题、因为我无法在我的身边重复、如果不能这样做、这实际上限制了我对这个问题的看法。

    是否可以让您的代码项目在 EK-TM4C1294XL LaunchPad 上运行? 如果您可以在 LaunchPad 上重新创建 CCS 项目、则只需向我发送 CCS 项目、我就可以从该项目继续调查。 这是否可行?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Ralph、

    很抱歉耽误您的回答。

    我很难做到这一点、因为目前我没有  EK-TM4C1294XL LaunchPad。  

    无论如何、您有经验的人认为、即使在休眠使能代码部分中未设置复位/GPIO 唤醒、仍有可能实现复位/GPIO 唤醒?

    Ludovico

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

    很抱歉我耽误了回答。 我的理解是、我们将能够帮助为您提供一个 LaunchPad 供您使用。

    我们以前没有看到过您观察到的行为、尽管尝试在 LaunchPad 上模拟您的休眠模块配置、但我在尝试在我的终端重新创建此类行为时没有成功、 因此、在我们最终观察到这种现象以进一步调试之前、我们无法确认这种可能性是否应该存在。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Ludovico、

    您是否能够获得 LaunchPad? 您是否能够在尝试将项目移植到 LaunchPad 上取得任何进展?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Ludovico、

    我没有听到您的反馈、您在这方面是否取得了任何进展?

    我现在将继续并关闭此主题、但如果您已经取得了进展并想要报告进一步的调查结果、请在下面发布回复。 否则、如果该线程由于超时而锁定、请打开一个新线程、方法是使用"提出相关问题"按钮、该按钮将自动链接回该问题以供参考。