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.

Tiva 系列MCU 的hibernate 不能正常工作

程序为:

SysCtlPeriEnable(SYSCTL_PERIPH_HIBERNATE); // 使能冬眠模块
SysCtlDelay(2 *(12000000UL)); // 8MHz晶振,延迟约25ms
HibernateEnableExpClk(SysCtlClockGet()); // 无源晶振获取时钟SysCtlClockGet()
SysCtlDelay(25 *(12000000UL / 1000)); // 8MHz晶振,延迟约25ms
HibRTCSet(35920UL);
SysCtlDelay(50 *(12000000UL / 1000));
HibRTCEnable();

当程序到HibernateEnableExpClk(SysCtlClockGet())的时候程序就停止工作了,去掉这一句程序可以跑通,但RTC的赋初值,读出来数据为0。请问这是什么问题?

  • yuanjing ran

    尝试将下面这句代码

    SysCtlPeriEnable(SYSCTL_PERIPH_HIBERNATE);

    修改为

    SysCtlPeripheralEnable(SYSCTL_PERIPH_HIBERNATE);

    具体请参考下面这段代码

    int main(void)

    {

           SysCtlClockSet(SYSCTL_SYSDIV_4|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN);

     

           SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG);

           GPIOPinTypeGPIOOutput(GPIO_PORTG_BASE, GPIO_PIN_2);

           GPIOPinWrite(GPIO_PORTG_BASE, GPIO_PIN_2, 0x04);

     

           SysCtlPeripheralEnable(SYSCTL_PERIPH_HIBERNATE);

           HibernateEnableExpClk(SysCtlClockGet());

           SysCtlDelay(64000000);

     

           HibernateRTCSet(0);

           HibernateRTCEnable();

           HibernateRTCMatch0Set(5);

     

           HibernateWakeSet(HIBERNATE_WAKE_PIN | HIBERNATE_WAKE_RTC);

           GPIOPinWrite(GPIO_PORTG_BASE, GPIO_PIN_2, 0x00);

     

           HibernateRequest();

     

           while(1)

           {

           }

    }

    同时,Tivaware中有提供相应的示例代码,您可以参考。

    http://software-dl.ti.com/tiva-c/SW-TM4C/latest/index_FDS.html

    另外,建议贴主使用最新的API函数,具体API函数请参见TivaWare™ Peripheral Driver Library。下面附下载连接:

    http://www.ti.com/lit/ug/spmu298/spmu298.pdf

  • wellin  zhang  :

              您好,我按照您说的将SysCtlPeriEnable(SYSCTL_PERIPH_HIBERNATE);修改为SysCtlPeripheralEnable(SYSCTL_PERIPH_HIBERNATE);实际上我也是用了SysCtlPeripheralEnable的,只是在宏定义中用SysCtlPeriEnable代替了,我看了HIB_CTL_WRC寄存器的值一直为1,但是我的问题仍然存在,HibernateEnableExpClk(SysCtlClockGet())通过不了,去掉HibernateEnableExpClk(SysCtlClockGet()),所有程序都能执行了,当然这带来RTC赋初值不成功,最后读出来RTC的值为0.困惑很久,实在解决不了,谢谢!

                                                                                     Yuanjin  Ran

                                                                                              

  • 如果有条件,可以换一颗片子,我上次调的时候,去检测HIB管脚的时候,不小心搭错线了,结果冒烟了,后来的调试跟你的现象一样,一执行启动冬眠模块的时钟,系统就飞了,而调其他功能就没问题。

  • Yuanjin Ran,

    是这样的,虽然在宏定义中有申明,我们仍然鼓励客户使用新的API进行新的设计。另外,你可以用我提供的demo测试一下是不是片子有问题 或者如shengping所言, 更换一片芯片测试一下,看是不是硬件的问题

  • 谢谢,我叫了一个哥们来看了一下,他一执行程序,就莫名其妙的好了,百思不得其解啊,只能用诡异来形容了!

  • 呵呵,等我买来新的片子,还要向您讨教一下这个冬眠模块的用法。当时就是因为调不出来,结果把片子搞挂了,

    话也说回来,这个片子这难搞,又贵,我们采购说搞不定,晕死,Ti居然还这样!

  • 谢谢,找到原因了,是我操作的问题,最开始在程序后面加了一句HiberateRequest();运行一次之后程序就进入冬眠状态,当时不清楚这点,以为哪里出问题了。然后把程序化到最简后还是处于冬眠状态,也没有冬眠唤醒,造成始终在获取时钟那一句卡起,最后偶然间断电把备用电池扣掉之后hibernate自动复位在运行程序rtc就ok了!

  • 我也是初学,共同学习!

  • 我现在问题就是老是没法通过WAKE管脚或者RTC定时来唤醒.

     SysCtlPeripheralEnable(SYSCTL_PERIPH_HIBERNATE);  

    if(HibernateIsActive())  { 

      if(ulStatus & HIBERNATE_INT_PIN_WAKE)   {    

          printf("WAKE:\r\n" );   }

      else if (ulStatus & HIBERNATE_INT_RTC_MATCH_0)   {   

        printf("RTC:\r\n" );   }

    }

    else {  //冬眠模块未启动,初始化,然后进入冬眠,等待RTC或者WAKE

     printf("RSTHIB INIT:\r\n" );     

    MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_HIBERNATE);     

    MAP_HibernateEnableExpClk(SysCtlClockGet());    

    SysCtlDelay(5000);

    //MAP_HibernateClockSelect(HIBERNATE_CLOCK_SEL_RAW);     

     MAP_HibernateRTCSet(0); //???RTC??0;     

     MAP_HibernateRTCEnable(); //??RTC         

    HibernateRTCMatchSet(0,5);       

    HibernateWakeSet(HIBERNATE_WAKE_PIN | HIBERNATE_WAKE_RTC);       

     HibernateRequest();   

     SysCtlDelay(5000);

    while(1)     {  ;   }

    }

  • 想法是,系统运行,检查冬眠模块是否启动,启动的话,提示是由什么唤醒的

    没有启动的话,初始化冬眠模块,使能wake和rtc唤醒,然后进入冬眠

     

  • 你好  打扰了。我想请教下,就是当我休眠模块active的 然后printf()也执行之后,系统会自动再进入休眠模式么?

  • 您好 我向请教下:就是检查冬眠模块如果启动,然后我判断是RTC唤醒或者wake唤醒 当我处理完对应需要处理的动作之后,系统还会自动进入冬眠模式么?

  • Jiajie

    你好,系统唤醒,执行完所有操作,需要置位HIBREQ,发送休眠请求,系统才会进入休眠。

  • Dear  Weilin,

    很感谢你的回答,现在我已经可以成功进入Hibernate了,之前我一直以为唤醒之后会从进入休眠的地方继续执行(类似中断),但是应该是从main函数开始执行的。

    thks and best Regards!

    jiajie

  • 补充一点,实际上冬眠唤醒后,MCU相当于执行了一次Power on reset。这个比warm reset复位的更彻底。

    唯一的不同时冬眠唤醒时,冬眠模块中16个32bit寄存器的数值可以维持不变。