这份文档没用
运行多次,每次都卡死在HibernateEnableExpClk(ROM_SysCtlClockGet());函数,上网搜索无果,无法进入休眠状态。知道解决方法的人希望您能与我联系,感激不尽。
休眠模块
简介
休眠模块允许通过软件来关闭微控制器,再通过软件或者外部WAKE引脚来打开微控制器。官方提供了一些函数可以配置唤醒条件,管理中断,读取状态,保存和恢复程序状态信息,以及打开休眠模式。
特征
- 32位RTC,配有15位亚秒级计数器(部分设备)
- 内部低频振荡器
- 休眠计数器的日历模式
- 篡改检测与反应 ??
- 调整寄存器来微调RTC速率
- 一个RTC匹配寄存器来产生RTC事件
- 外部WAKE引脚来触发唤醒
- 外部RST或者四组GPIO引脚作为可选的唤醒源
- 在休眠期间维持GPIO状态
- 低电量检测
- 16个32字节依靠电池的内存
- 可编程的中断源
头文件
driverlib/hibernate.h细节描述
休眠模式使用前要使能。使用HibernateEnableExpClk()
函数来使能它。配置晶振
如果我们要用到晶振来作为时钟源,我们就需要在调用HibernateEnableExpClk()
函数后等待一段时间,使晶振稳定。通过查看date sheet可以查询到使晶体稳定时间。如果要用到振荡器,我们就不需要等待。在这个模块使能了之后,时钟源一定要通过调用HibernateClockConfigure()
来配置它。RTC配置
为了使用休眠模块的RTC功能,要先调用HibernateRTCEnable()
函数来使能RTC(之后我们可以使用HibernateRTCDisable()
来失能RTC)。这些函数可以在任何时候被调用来开启、关闭RTC。
通过调用HibernateRTCGet()
和HibernateRTCSet()
可以读取、设定RTC的值。
通过调用HibernateRTCMatchGet()
和HibernateRTCMatchSet()
可以读取、设定RTC的匹配值。
通过使用trim寄存器可以调整RTC频率,我们要用到的函数时HibernateRTCTrimGet()
和HibernateRTCTrimSet()
RTC亚秒级计数器(subseconds counter)配置
通过调用HibernateRTCSSGet()
可以读取亚秒级计数器的值。
亚秒级计数器的匹配值可以通过调用HibernateRTCSSMatchSet()
和HibernateRTCSSMatchSet()
来完成。RTC的日历模式
有一些设备支持针对RTC的日历模式。在日历模式下,RTC的值可以使用HibernateCalendarGet()
和HibernateCalendarSet()
来进行读取和设置。
匹配值可以使用HibernateCalendarMatchGet()
和HibernateCalendarMatchSet()
来进行读取和配置破坏
破坏机制提供了检测、响应、记录破坏事件的功能。破坏事件可以通过检测特定GPIO的状态转换或者是检测外部振荡器的错误来探测。注意:那些破坏GPIO不需要设置就可以用作破坏功能。查询 data sheet 来确定那些GPIO支持破坏功能。
破坏GPIO可以通过使用HibernateTamperIOEnable()
和HibernateTamperIODisable()
来配置。设置过程中我们不需要调用GPIO API,并且这种配置会覆盖其他GPIO API。外部振荡器状态可以通过函数HibernateTamperExtOscValid()
来获取。如果检测到了外部振荡器错误,我们可以通过调用HibernateTamperExtOscRecover()
来进行恢复。
当出现破坏事件时,模块会给系统控制模块发送一个破坏事件信号。破坏特征还能够被配置去清除全部或者部分休眠内存、恢复状态,使用的是HibernateTamperEventConfig()
。探测到的事件会用一个RTC时间戳记录下来。记录到的时间可以使用HibernateTamperEventsGet()
和HibernateTamperEventsClear()
来管理。
总的破坏状态可以通过HibernateTamperStatusGet()
来获取。破坏特性可以通过函数HibernateTamperEnable()
和HibernateTamperDisable()
来进行。电池供应内存
当处理器关闭时,应用状态信息可以储存在电池供应内存里。使用HibernateDataSet()
和HibernateDataGet()
来使用电池供应内存。唤醒
模块可以配置成当外部WAKE引脚触发、RTC匹配出现或者是电池电量达到某一特定水平时。在一些设备上,这个模块可以配置成当一个GPIO引脚被触发或者RESET引脚被触发时被触发。在那些支持破坏探测的设备上,模块还能在发生破坏事件时唤醒。使用HibernateWakeSet()
函数来设置唤醒条件,通过调用HibernateWakeGet()
可以获取当前的配置。低电量检测
休眠模块可以检测到电池电量过低并能给处理器发信号,他还能通过设置实现电池电量过低时终止休眠请求,使用HibernateLowBatSet()
和HibernateLowBatGet()
来配置这些功能,电池电量可以使用HibernateBatCheckStart()
和HibernateBatCheckDone()
函数来进行检测。中断
和其他外设的中断函数形式类似。最终配置
当模块被正确配置,状态都被保存,软件应用也准备好休眠时,我们就可以调用HibernateRequest()
函数。这个函数可以给处理器断电。重新供电之后,我们可以调用函数HibernateIsActive()
来看一看处理器是从休眠中唤醒过来的还是冷启动的。这样,我们之后就可以使用HibernateIntStatus()
和HibernateDateGet()
来发现唤醒的原因,获取保存的系统状态。说明
老的HibernateEnable()
函数已经被新的HibernateEnableExpClk()
函数所代替。hibernate.h
中提供了旧API到新API的定义,允许现有的应用连接到新API上来运行,我们推荐使用新API。例程
怎样开始休眠
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27uint32_t ui32Status;
uint32_t pui32NVData[64];
//使能休眠外设
SysCtlPeripheralEnable(SYSCTL_PERIPH_HIBERNATE);
while(!SysCtlPeripheralReady(SYSCTL_PERIPH_HIBERNATE)){}
//使能休眠外设时钟
HibernateEnableExpClk(SysCtlClockGet());
//此处用户应该加入一段延时以等待晶体上电并稳定。
//配置时钟源,使能RTC
HibernateClockConfig(HIBERNATE_OSC_LOWDRIVE);
HibernateRTCEnable();
//设定RTC初值
HibernateRTCSet(0);
//设定匹配值 为30秒后
//设定match0寄存器为30秒后
HibernateRTCMatchSet(0, HibernateRTCGet() + 30);
//清除待办中断
ui32Status = HibernateIntStatus(0);
HibernateIntClear(ui32Status);
//保存程序状态,程序状态保存在我们声明的一个数组里,直接将这个数组指针扔进去即可,第二个变量是数组长度,以32位计。
HibernateDataSet(pui32NVData, 16);
//设置为RTC match模式
HibernateWakeSet(HIBERNATE_WAKE_RTC);
//开始休眠,断电之前可能要等一会。
HibernateRequest();
//我们使用一个循环来等待断电。
for(;;){}唤醒后怎样处理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27uint32_t ui32Status;
uint32_t pui32NVData[64];
//使能休眠模块
SysCtlPeripheralEnable(SYSCTL_PERIPH_HIBERNATE);
while(!SysCtlPeripheralReady(SYSCTL_PERIPH_HIBERNATE)){}
//单片机是不是从休眠状态唤醒的
if(HibernateIsActive()){
//如果单片机确实是从次面状态唤醒的,确认唤醒原因
//读取唤醒原因
ui32Status = HibernateIntStatus(false);
//如果是WAKE引脚唤醒
if(ui32Status & HIBERNATE_INT_PIN_WAKE)
{
}
//如果是RTC match唤醒
if(ui32Status & HIBERNATE_INT_RTC_MATCH_0)
{
}
//恢复程序信息,提供给函数的参数是要存储的位置,以及要读取的word数,以32位计
HibernateDataGet(pui32NVData, 64);
//现在唤醒步骤已经完成,程序可以进行正常运行了。
}
else{
//执行冷启动后的初始化
}