本帖最后由 TI_MCU 于 2011-12-2 13:12 编辑
TI Stellaris LM4F 休眠模块指南
[作者: Richard Ma]
=============================================
如今低功耗要求越来越高,休眠模块越来越有用。Texas Instruments的StellarisLM4F提供了全新的休眠模块,在使用了RTC时钟的情况下,功耗也可以达到1.7uA。本文将对TI LM4F的休眠模块做一个简单介绍。
1.功能介绍
休眠模块的作用就是停止LM4F的工作,而将有用的数据保存在休眠模块中,以降低能量消耗,并在需要LM4F工作的时候,恢复其工作。
LM4F支持的停止方式有两种:
(1)完全切断供电,即在系统中直接切断MCU的VDD供电
(2)不切断供电,关掉芯片内绝大部分功能,但IO电平保持不变
唤醒LM4F(即恢复LM4F工作)有三种方式,可同时或单独使用:
(1)唤醒(wake)脚
(2)实时时钟(RTC)定时
(3)低电源
LM4F休眠模块使用了独立与内核的时钟,只要使用到休眠模块,无论是否启用RTC功能,都必须提供独立的32.768kHz时钟(时钟源或晶振)。
休眠模块中最重要的几个管脚:
GNDX 休眠模块地端,用法请参考后面电路
VBAT 休眠时外部供电电源
HIB 休眠状态输出
WAKE 休眠唤醒
XOSC0 外部晶振接口/时钟输入
XOSC1 外部晶振接口
==============================
2.工作方式
2.1.进入休眠
在工作状态下,任何时刻,LM4F可以将需要的数据存入休眠模块,然后进入休眠状态。休眠状态下,休眠模块有一个休眠状态信号输出(HIB管脚),可以控制电源芯片的使能(EN管脚),切断LM4F的供电。当LM4F切断供电后,休眠模块的从外接电源(VBAT管脚)获得电能,外接电源可以是电池也可以是电源芯片中没有被切断的供电脚。
2.2.唤醒
当处理器被唤醒的时候,相当于重新启动(重新初始化),需要判断休眠模块是否启动。若未启动,则说明是正常上电,可以正常进行初始化;若已启动,则是从休眠模式中恢复,需从休眠模块中取回保存的数据,进行处理。
2.3.常见用法
1) 切断LM4F的供电电源
【电池作为后备电源供电】
【直接从电源芯片取电】
2) 保留LM4F供电
在这种模式下,芯片IO脚电平会保持不变,芯片进入休眠状态停止工作,等待唤醒。
==============================
3.程序设计
3.1.休眠模块使用
以下部分,展示了设置、使用休眠模块的流程,使用了StellarisWare驱动库。代码只是部分代码。
// =================================================
// Code Begin
// =================================================
// StellarisWare休眠模块驱动头文件
#include
"driverlib/hibernate.h"
void main()
{
// BBData为需要在休眠时保存的数据
unsigned long ulBBData=0;
unsigned long ulStatus;
// 设置时钟
SysCtlClockSet(SYSCTL_SYSDIV_4| SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ | SYSCTL_OSC_MAIN);
// (1)使能休眠模块。
// 调用休眠模块的任何函数前,必须保证休眠模块被使能,否则会导致错误。
SysCtlPeripheralEnable(SYSCTL_PERIPH_HIBERNATE);
// (2)判断休眠模块是否被启用。
// (2.1)如果被启用则是从休眠状态唤醒,否则为正常上电启动。
if(HibernateIsActive())
{
// 如果是休眠唤醒,可以查看唤醒源
ulStatus=HibernateIntStatus(false);
// 唤醒源为WAKE管脚
if(ulStatus &HIBERNATE_INT_PIN_WAKE){ … }
// 唤醒源为RTC
else if (ulStatus& HIBERNATE_INT_RTC_MATCH_0){ … }
// 唤醒源为其它
else{ … }
// 如果是正常唤醒则从休眠模块读取保存的数据
HibernateDataGet(&ulBBData,1);
}
// (2.2)如果休眠模块未启用则正常初始化。
else
{
// 初始化…
}
// (3)关闭休眠模块,进入正常工作。
HibernateDisable();
// (4)正常工作。
…
// (5)工作完成,准备休眠。
HibernateEnableExpClk(SysCtlClockGet());
// (6)保存数据到休眠模块。
HibernateDataSet(&ulBBData,1);
// (7)设置唤醒源。RTC和WAKE管脚可单独使用。
// 使用RTC模块
// 首先使能RTC模块
HibernateRTCEnable();
// 设置当前RTC值(默认RTC会每秒从当前值往上增加1)
HibernateRTCSet(0);
// 设置RTC匹配值,当前值与匹配相等时则退出休眠
// (当前设置为5秒后退出休眠)
HibernateRTCMatch0Set(5);
// 使能唤醒源
HibernateWakeSet(HIBERNATE_WAKE_PIN| HIBERNATE_WAKE_RTC);
// (8)发送休眠请求。
// 若LM4F正在进行Flash写操作则会等到操作完成再进入休眠。
HibernateRequest();
while(1);
}
// =================================================
// Code End
// =================================================
在执行上面代码时,ulBBData在每次休眠之前都被保存,当被唤醒时从休眠模块中重新读取,在正常执行中继续对数据进行更新修改。整个过程中可以保证数据的连续性和不丢失,同时持续的休眠也节约了电量。
==============================
4. 休眠模块补充说明
4.1.系统断电与休眠状态
1)正常工作状态下,若突然断电,休眠模块没有启动,重新上电后会正常启动。
2)休眠状态下,若VDD和VBAT同时断电,则所有信息丢失,重新上电后会重新正常启动。
3)休眠状态下,若休眠模块(VBAT)供电正常,VDD彻底断开,而唤醒条件被满足,LM4F无法启动。当VDD重新上电,系统将识别为上一次休眠结束(休眠模块仍在工作)。
4.2.休眠模块数据保存
当前LM4F休眠模块可以保存的数据为16个32-bit数据(根据不同的器件这个数字可能有差异),HibernateDataSet中第一个参数是要保存数据的地址,第二个参数是长度。休眠模块保存数据也是需要电源的,VDD和VBAT任一都可以提供;若VDD和VBAT同时移除,保存的数据将丢失。 |