如何设置系统以最低功耗运行,MSP430案例分享
MSP430系列单片机的各个模块都可以独立运行,如定时器、输入/输出端口、A/D转换、看门狗、液晶显示器等都可以在CPU休眠的状态下独立工作。若需要主CPU工作,任何一个模块都可以通过中断唤醒CPU,从而使系统以最低功耗运行。
让CPU工作于突发状态可以充分利用CPU的低功耗性能。通常,使用软件将CPU设定到某一低功耗模式,在需要时使用中断将CPU从休眠状态中唤醒,完成工作后又可以进入相应的休眠状态。如:让CPU工作在LPM3状态,通过中断事件转换到AM活动模式,根据运行需要,又可以从AM状态进入相应的低功耗模式:LPM0/LPM3或LPM4。
系统的这些低功耗特性是靠系统对中断的响应来实现的。系统响应中断的过程:
硬件自动中断服务。包括PC入栈、SR入栈;中断向量赋给PC;GIE、 CPUOFF、OSCOFF和SCG1清除;以及IFG标志位清除(单源中断标志)
执行中断处理子程序。
执行RETI指令(中断返回),包括SR出栈;PC出栈。
例如:系统初始化完成后工作于低功耗模式0,中断事件触发到活动模式,中断处理结束后进入低功耗模式3。
;主程序
……;初始化操作开始
……;
……;初始化结束
BIS #GIE+CPUOFF, SR ; 主程序中设置低功耗模式0,LPM0
;……;程序在这里停止
;中断子程序
……
……; 中断处理结束
BIS #GIE+CPUOFF+SCG1+SCG0, 0(SP) ; 设置SR为低功耗模式3,LPM3
RETI; 中断返回
;系统进入低功耗模式3
……
如果主程序期待在中断返回之后继续执行某些操作,可以在中断处理子程序中改变SR的值为AM模式,系统中断退出后根据恢复的SR和PC的值,来执行设定的某些操作。
L1 操作1
L2 操作2
…… ;中断处理开始
BIS #GIE+CPUOFF, 0(SP) ; 设置SR为活动模式,AM
RETI; 中断返回,系统进入活动模式
……
主程序执行到LPM0处停止执行,L1,L2等语句不执行。之后中断事件保存PC(L1指令地址)和SR(低功耗模式0),中断唤醒CPU,执行中断处理程序;由于在中断处理子程序中将SR设置为活动模式,所以中断返回后CPU处于活动状态,并从PC指向的L1指令处开始继续执行……
MSP430单片机学习小记1--基础定时器
基于MSP430单片机,TI公司采用的是模块化的内部结构,每个模块,在各个不同型号的单片机内都是相同的,相同的寻址,相同的操作方式,模块有限,于是一个一个开始进行整理。
本文引用地址:http://www.eepw.com.cn/article/201608/295905.htm
第一个模块:基础定时器
参考资料:数据手册 ,使用手册 ,示例程序,以及那份特别特别有用的头文件。
Exampli Code:
进入中断示例程序
/************************************************************/
1;时钟源为ACLK,为单片机提供1/4S定时中断,LCD提供512HZ刷新频率
BTCTL=BT_ADLY_250+BT_fLCD_512; //250MS延时加512HZ刷新频率。
备注:MSP430上电复位后,BT的寄存器值并不会恢复成一个默认值
而是保持不变,因此,每次上电的时,均要进行配置,而且最好直接采用赋值
语句。一条语句足矣
/************************************************************/
/************************************************************/
/************************************************************/
/************************************************************/
Void main(void)
{
WDTCTL=WDTPW+WDTHOLD; //close the wdtdog
FLL_CTL0&= ~XTS_FLL; //可省略,默认选择低频晶振
FLL_CTL0|=XCAP18PF; //配置内部晶振
P1DIR|=BIT0; //OUTPUT
BTCTL=BT_ADLY_250+BT_fLCD_512; //250MS延时加512HZ刷新频率。
IE2|=BTIE; //打开中断
__EINT();
While(1)
{;}
}
/************************************************************/
#pragma vector=BASICTIMER_VECTOR
__interrupt void basic_timer_ISR(void)
{
P1OUT ^= 0x01; // Toggle P1.0
}
/************************************************************
参考的头文件:
* BASIC TIMER 基础定时器的功能概述
BASIC TIMER 能在无需CPU干扰的情况下产生2的N次方个定时周期
如果我们采用32768KHZ =1/2^15次方,所以,最长的定时时间可以达到
2S钟
************************************************************/
#define __MSP430_HAS_BT__ /* Definition to show that Module is available */
#define BTCTL_ (0x0040u) /* Basic Timer Control * /SFR
DEFC( BTCTL , BTCTL_)
/* 位定义The bit names have been prefixed with "BT" */
#define BTIP0 (0x01)
#define BTIP1 (0x02)
#define BTIP2 (0x04)
#define BTFRFQ0 (0x08)
#define BTFRFQ1 (0x10)
#define BTDIV (0x20) /* fCLK2 = ACLK:256 */
#define BTHOLD (0x40) /* BT1 is held if this bit is set *,如果这个位置1,则暂停/
利用 BTCTL|=BTHOLD; //可以使其暂停。
#define BTSSEL (0x80) /* fBT = fMCLK (main clock) 位定义*/
备注:BTSSEL ,与BTDIV 确定是否对信号源进行分频。分频后它的最长延时如果使用32768KHZ的话,可以达到2S
注:为LCD提供的刷新频率没有使用分频。
快捷定义:
#define BTCNT1_ (0x0046u) /* Basic Timer Count 1 */
DEFC( BTCNT1 , BTCNT1_)
#define BTCNT2_ (0x0047u) /* Basic Timer Count 2 */
DEFC( BTCNT2 , BTCNT2_)
/* Frequency of the BTCNT2 coded with Bit 5 and 7 in BTCTL */
#define BT_fCLK2_ACLK (0x00)
#define BT_fCLK2_ACLK_DIV256 (BTDIV)
#define BT_fCLK2_MCLK (BTSSEL)
/* Interrupt interval time fINT coded with Bits 0-2 in BTCTL */
#define BT_fCLK2_DIV2 (0x00) /* fINT = fCLK2:2 (default) */
#define BT_fCLK2_DIV4 (BTIP0) /* fINT = fCLK2:4 */
#define BT_fCLK2_DIV8 (BTIP1) /* fINT = fCLK2:8 */
#define BT_fCLK2_DIV16 (BTIP1+BTIP0) /* fINT = fCLK2:16 */
#define BT_fCLK2_DIV32 (BTIP2) /* fINT = fCLK2:32 */
#define BT_fCLK2_DIV64 (BTIP2+BTIP0) /* fINT = fCLK2:64 */
#define BT_fCLK2_DIV128 (BTIP2+BTIP1) /* fINT = fCLK2:128 */
#define BT_fCLK2_DIV256 (BTIP2+BTIP1+BTIP0) /* fINT = fCLK2:256 */
/* Frequency of LCD coded with Bits 3-4 */
#define BT_fLCD_DIV32 (0x00) /* fLCD = fACLK:32 (default) */
#define BT_fLCD_DIV64 (BTFRFQ0) /* fLCD = fACLK:64 */
#define BT_fLCD_DIV128 (BTFRFQ1) /* fLCD = fACLK:128 */
#define BT_fLCD_DIV256 (BTFRFQ1+BTFRFQ0) /* fLCD = fACLK:256 */
/* LCD frequency values with fBT=fACLK */
#define BT_fLCD_1K (0x00) /* fACLK:32 (default) */
#define BT_fLCD_512 (BTFRFQ0) /* fACLK:64 */
#define BT_fLCD_256 (BTFRFQ1) /* fACLK:128 */
#define BT_fLCD_128 (BTFRFQ1+BTFRFQ0) /* fACLK:256 */
//ACLK提供时钟源,来提供LCD的刷新频率。
/* LCD frequency values with fBT=fMCLK */
#define BT_fLCD_31K (BTSSEL) /* fMCLK:32 */
#define BT_fLCD_15_5K (BTSSEL+BTFRFQ0) /* fMCLK:64 */
#define BT_fLCD_7_8K (BTSSEL+BTFRFQ1+BTFRFQ0) /* fMCLK:256 */
////MCLK提供时钟源,来提供LCD的刷新频率。
/* with assumed vlues of fACLK=32KHz, fMCLK=1MHz */
/* fBT=fACLK is thought for longer interval times */
#define BT_ADLY_0_064 (0x00) /* 0.064ms interval (default) */
#define BT_ADLY_0_125 (BTIP0) /* 0.125ms " */
#define BT_ADLY_0_25 (BTIP1) /* 0.25ms " */
#define BT_ADLY_0_5 (BTIP1+BTIP0) /* 0.5ms " */
#define BT_ADLY_1 (BTIP2) /* 1ms " */
#define BT_ADLY_2 (BTIP2+BTIP0) /* 2ms " */
#define BT_ADLY_4 (BTIP2+BTIP1) /* 4ms " */
#define BT_ADLY_8 (BTIP2+BTIP1+BTIP0) /* 8ms " */
#define BT_ADLY_16 (BTDIV) /* 16ms " */
#define BT_ADLY_32 (BTDIV+BTIP0) /* 32ms " */
#define BT_ADLY_64 (BTDIV+BTIP1) /* 64ms " */
#define BT_ADLY_125 (BTDIV+BTIP1+BTIP0) /* 125ms " */
#define BT_ADLY_250 (BTDIV+BTIP2) /* 250ms " */
#define BT_ADLY_500 (BTDIV+BTIP2+BTIP0) /* 500ms " */
#define BT_ADLY_1000 (BTDIV+BTIP2+BTIP1) /* 1000ms " */
#define BT_ADLY_2000 (BTDIV+BTIP2+BTIP1+BTIP0) /* 2000ms " */
//注:ACLK提供定时频率,利用宏定义进行设置延时。
/* fCLK2=fMCLK (1MHz) is thought for short interval times */
/* the timing for short intervals is more precise than ACLK */
/* NOTE */
/* Be sure that the SCFQCTL-Register is set to 01Fh so that fMCLK=1MHz */
/* Too low interval time results in interrupts too frequent for the processor to handle! */
#define BT_MDLY_0_002 (BTSSEL) /* 0.002ms interval *** interval times */
#define BT_MDLY_0_004 (BTSSEL+BTIP0) /* 0.004ms " *** too short for */
#define BT_MDLY_0_008 (BTSSEL+BTIP1) /* 0.008ms " *** interrupt */
#define BT_MDLY_0_016 (BTSSEL+BTIP1+BTIP0) /* 0.016ms " *** handling */
#define BT_MDLY_0_032 (BTSSEL+BTIP2) /* 0.032ms " */
#define BT_MDLY_0_064 (BTSSEL+BTIP2+BTIP0) /* 0.064ms " */
#define BT_MDLY_0_125 (BTSSEL+BTIP2+BTIP1) /* 0.125ms " */
#define BT_MDLY_0_25 (BTSSEL+BTIP2+BTIP1+BTIP0)/* 0.25ms " */
//选择fCLK2=fMCLK (1MHz)来提供时钟源而产生的时钟延时。适合比较短的延时。但是单片机就不能进入LPM3状态了。
/* Reset/Hold coded with Bits 6-7 in BT(1)CTL */
/* this is for BT */
//#define BTRESET_CNT1 (BTRESET) /* BTCNT1 is reset while BTRESET is set */
//#define BTRESET_CNT1_2 (BTRESET+BTDIV) /* BTCNT1 .AND. BTCNT2 are reset while ~ is set */
/* this is for BT1 */
#define BTHOLD_CNT1 (BTHOLD) /* BTCNT1 is held while BTHOLD is set */
#define BTHOLD_CNT1_2 (BTHOLD+BTDIV) /* BT1CNT1 .AND. BT1CNT2 are held while ~ is set */
/* INTERRUPT CONTROL BITS */
/* #define BTIE 0x80 */ 位于IE2中断控制位
/* #define BTIFG 0x80 */
相关问答
【msp 430中断 哪位大大能帮我解释一下中断的写法含义例如:#pr...[最佳回答]MSP430中,不同的型号拥有不同的硬件配置,因此中断源也有所差别,TIMER1_A0_VECTOR表示定时器1A0的中断源,1代表硬件上的定时器,有定时器0定时器1等...
单片机 编程好学吗?看你原来有没有接触过了,第一次学单片机从51开始入手,51是最基础的单片机,编程语言选用C语言比较容易上手,开发软件用keil4forc51!如果想掌握好的话,必须得...
单片机 好不好学?看你原来有没有接触过了,第一次学单片机从51开始入手,51是最基础的单片机,编程语言选用C语言比较容易上手,开发软件用keil4forc51!如果想掌握好的话,必须...
关于msp 430 程序问题#pragmavector=USCIAB0RX_VECTOR__interr...[最佳回答]先说前两句:while(!(IFG2&UCA0TXIFG));//USCI_A0TXbufferready?UCA0TXBUF=UCA0RXBUF;//TX->R...
如何解决硬件 中断 占cpu过多摆脱··systemidleprocess的确是系统空闲资源,但是不一定100-systemidleprocess=cpu占有率,systemidleprocess...
新发电机皮带行驶 中断 了?出现这种情况一般有两种原因。第一发动机皮带长时间没有更换自然老化。第二,发动机皮带轮和发动机皮带上挂的附件。由于轴承损坏或者皮带轮表面有凹槽造成发动...
k 430 次列车经常晚点吗?K430列车不经常晚点。列车是按铺画好的运行图到开的,如没有意外情况是不晚点的,在上段汛期时,由于过多降雨引起泥石流,山体滑坡,水漫路基,冲空道床造成中断...
舒普 430 D-01打结机怎样调速 – 960化工网问答当系统关闭电脑进入重启过程时反复按快捷键以中断电脑启动进入BIOS设置界面。注:不同电脑进入BIOS的快捷键不同,通常为F1、F2、DEL、ESC等。回答舒普430D-01...
扩改后首次大修总结及检修后出现的新问题-盖德问答-化工人互...过热蒸汽温度还是低了不少,想知道的是,扩改前,103透平在当时的进汽温度、压力下,进汽流量还有很大的调整余地么?还有对103本身来说,现在的87%的负荷...
有限责任公司(自然人独资),股东死亡后,股权怎么处理-找法网430自然人独资公司怎样确定股权按照出资比例进行解决人咨询过继续咨询没有想要的答案?立即问在线律师5956位律师在线|平均5分钟获得解答立即获得针对性解答黄...