当前位置:首页 >> 信息与通信 >>

MSP-EXP430G2 例程


LaunchPad 官方例程(无修改)
一切皆为2012TI杯电子设计大赛
1.
//*************************************************************************
// LaunchPad Lab2 - Software Toggle P1.0, 软件切换的P1

.0,
// MSP430G2xx2
// -----------------
// /|\| XIN|-
// | | |
// --|RST XOUT|-
// | |
// | P1.0|-->LED
//*************************************************************************
#include <msp430g2553.h>

void main(void)
{
WDTCTL = WDTPW + WDTHOLD; //停止看门狗定时器

if (CALBC1_1MHZ == 0xFF || CALDCO_1MHZ == 0xFF)
{
while(1); //如果校准常数擦除,捕获的CPU!!

}

// Configure Basic Clock
BCSCTL1 = CALBC1_1MHZ; //设置范围
DCOCTL = CALDCO_1MHZ; //集检查官步+调制
BCSCTL3 |= LFXT1S_2; // 设置LFXT1

P1DIR = BIT6; //P1.6输出(绿色LED)
P1OUT = 0; // LED 关

IFG1 &= ~OFIFG; //清除OSCFault标志
BCSCTL2 |=SELM_1 + DIVM_0; //设置的MCLK

for(;;)
{
P1OUT = BIT6; // P1.6输出(绿色LED) _delay_cycles(100);
P1OUT = 0; //绿色LED关闭
_delay_cycles(5000);
}
}


2.
//*************************************************************************
// LaunchPad Lab3 - Software Port Interrupt Service软件端口的中断服务
// MSP430G2xx2
// -----------------
// /|\| XIN|-
// | | |
// --|RST XOUT|-
// /|\ | |
// --o--|P1.3 P1.0|-->LED
// \|/
//
//*************************************************************************
#include <msp430g2553.h>

void main(void)
{
WDTCTL = WDTPW + WDTHOLD; //停止看门狗定时器
P1DIR |= BIT0; //设定的P1.0输出方向
P1IES |= BIT3; // P1.3可高/低边
P1IFG &= ~BIT3; // P1.3 IFG 清除
P1IE |= BIT3; // P1.3可中断启用

_BIS_SR(LPM4_bits + GIE); //进入LPM4中断
}

// Port 1 interrupt service routine端口1中断服务程序
#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
{
if (P1IFG & BIT3)
{
P1OUT ^= BIT0; // P1.0切换
P1IFG &= ~BIT3; // P1.3 IFG清除
}
}



3.
//*************************************************************************
// LaunchPad Lab5 - ADC10, Sample A10 Temp and Convert to oC and oF ADC10,样品A10的温度和转换
// MSP430G2452
// -----------------
// /|\| XIN|-
// | | |
// --|RST XOUT|-
// | |
// |A10 |
//*************************************************************************
#include "msp430g2553.h"

long temp;
long IntDegF;
long IntDegC;

void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
//Configure ADC10
ADC10CTL1 = INCH_10 + ADC10DIV_3; // 选择ADC通道温度传感器
ADC10CTL0 = SREF_1 + ADC10SHT_3 + REFON + ADC10ON + ADC10IE; //选择ADC号源
__enable_interrupt(); //使能中断。
TACCR0 = 30; // Delay to allow Ref to settle延迟让价解决
TACCTL0 |= CCIE; //比较模式中断。
TACTL = TASSEL_2 | MC_1; // TACLK= SMCLK,最多的模式。
LPM0; //等待延迟。
TACCTL0 &= ~CCIE; //禁用定时器中断

__disable_interrupt();

while(1)
{
ADC10CTL0 |= ENC + ADC10SC; //采样和转换启动
__bis_SR_register(LPM0_bits + GIE); // LPM0与中断功能

// oF = ((A10/1024)*1500mV)-923mV)*1/1.97mV = A10*761/1024 - 468
temp = ADC10MEM;
IntDegF = ((temp - 630) * 761) / 1024;

// oC = ((A10/1024)*1500mV)-986mV)*1/3.55mV = A10*423/1024 - 278
temp = ADC10MEM;
IntDegC = ((temp - 673) * 423) / 1024;

__no_operation(); // SET BREAKPOINT HERE此设置断点

}
}

// ADC10 interrupt service routine
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR (void)
{
__bic_SR_register_on_exit(LPM0_bits); //明确CPUOFF位从0(SR)
}

#pragma vector=TIMER0_A0_VECTOR
__interrupt void ta0_isr(void)
{
TACTL = 0;
__bic_SR_register_on_exit(LPM0_bits); //明确CPUOFF位从0(SR)
}



4.
//*************************************************************************
// MSP430F20xx演示 - 基本时钟,输出缓冲SMCLK,ACLK和MCLK/10/ /
//说明:缓冲区ACLK从P2.0,P1.4脚和MCLK/10默认SMCLK(DCO)
/ / P1.5的。
// ACLK= LFXT1= VLO的,个MCLK= SMCLK=默认的DCO
/ / / /*安装辛XOUT之间的外部晶体需要ACLK* / /

// MSP430F20xx
// -----------------
// /|\| XIN|-
// | | |
// --|RST XOUT|-
// | |
// | P1.4/SMCLK|-->SMCLK = Default DCO
// | P1.5|-->MCLK/10 = DCO/10
// | P1.0/ACLK|-->ACLK = VLO
//*************************************************************************

#include <msp430x20x3.h>

unsigned char s;

void main(void)
{
WDTCTL = WDTPW +WDTHOLD; // 关闭看门狗
BCSCTL3 |= LFXT1S_2; // LFXT1 = VLO
//DCOCTL = 0;
//BCSCTL1 = CALBC1_16MHZ;
//DCOCTL = CALBC1_16MHZ;
P1DIR |= 0x31; // P1.0,和P1.4输出
P1SEL |= 0x11; // P1.0,4 ACLK/ VLO的,SMCLK/ DCO输出
//SMCLK Sub-System Main Clk, ACLK和SMCLK可以通过复用引脚输出,MCLK不能直接输出体现, MCLK可以配置为VLO或者DCO

while(1)
{
P1OUT |= 0x20; // P1.5 = 1, 通过开关P1.5来体现MCLK,这两条指令的周期大概为SMCLK的1/10
P1OUT &= ~0x20;//20;
}
}



5.
//*************************************************************************
// MSP430xG46x演示 - FLL的内部运行,在8MHz检查官
//说明:此程序演示设置内部DCO运行
/ /为8MHz由FLL+自动校准。
// ACLK= LFXT1=32768Hz的,个MCLK= SMCLK=检查官=(121+1)×2×ACLK=7995392Hz
/ / / /*辛与XOUT之间的外部钟晶振需要ACLK* / /

//
// MSP430xG461x
// -----------------
// /|\| XIN|-
// | | | 32kHz
// --|RST XOUT|-
// | |
// | P1.1|--> MCLK = 8MHz
// | |
// | P1.5|--> ACLK = 32kHz
// | |
//
//*************************************************************************
#include <msp430xG46x.h>

void main(void)
{
WDTCTL = WDTPW + WDTHOLD; //停止看门狗定时器
FLL_CTL0 |= DCOPLUS + XCAP18PF; // DCO+ set, 频率 = xtal x D x N+1
SCFI0 |= FN_4; // x2 DCO freq, 8MHz nominal DCO
SCFQCTL = 121; // (121+1) x 32768 x 2 = 7.99 MHz
P1DIR = 0x22; // P1.1口和P1.5的输出方向
P1SEL = 0x22; // P1.1口和P1.5的输出MCLK和ACLK

while(1); //循环到此

}



6.
//*************************************************************************
// MSP430xG46x演示 - Flash在系统编程,复制世嘉SegB
/ /
/ /说明:此程序首先擦除闪烁赛格A,那么它的增量
/ /赛格一个值,然后擦除赛格B,然后复制赛格一个赛格B。
//假设的MCLK的550kHz - 900kHz的。
/ / / /* NOP指令集在主循环中断点,以避免强调的Flash *//

//
// MSP430xG461x
// -----------------
// /|\| XIN|-
// | | |
// --|RST XOUT|-
// | |
//*************************************************************************

#include <msp430xG46x.h>

char value; // 8位值写段

// Function prototypes
void write_SegA (char value);
void copy_A2B (void);

void main(void)
{
WDTCTL = WDTPW + WDTHOLD; //停止看门狗定时器
FCTL2 = FWKEY + FSSEL0 + FN0; //的MCLK/2闪存时序发生器
value = 0; //初始化值

while(1) //永远重复
{
write_SegA(value++); //写段,增量值
copy_A2B(); // 复制段A到B
_NOP(); //此设置断点
}
}

void write_SegA (char value)
{
char *Flash_ptr; //闪存的指针
unsigned int i;

Flash_ptr = (char *) 0x1080; //初始化闪存的指针
FCTL1 = FWKEY + ERASE; //设置擦除位
FCTL3 = FWKEY; //清除锁定位
*Flash_ptr = 0; //空写,擦除闪存段
FCTL1 = FWKEY + WRT; //为写操作的WRT位
for (i=0; i<128; i++)
{
*Flash_ptr++ = value; //写入值闪烁
}

FCTL1 = FWKEY; //清除WRT的位
FCTL3 = FWKEY + LOCK; //设置锁定位
}


void copy_A2B (void)
{
char *Flash_ptrA; //段指针
char *Flash_ptrB; // B段指针
unsigned int i;

Flash_ptrA = (char *) 0x1080; //初始化闪存段A指针
Flash_ptrB = (char *) 0x1000; //初始化闪存段B指针
FCTL1 = FWKEY + ERASE; //设置擦除位
FCTL3 = FWKEY; //清除锁定位
*Flash_ptrB = 0; //空写,擦除闪存段B
FCTL1 = FWKEY + WRT; //为写操作的WRT位
for (i=0; i<128; i++)
{
*Flash_ptrB++ = *Flash_ptrA++; //复制值段A到段B
}

FCTL1 = FWKEY; //清除WRT的位
FCTL3 = FWKEY + LOCK; //设置锁定位
}




7.
//*************************************************************************
// MSP430xG46x演示 - 软件P1.0口从LPM4中断
/ /
/ /说明:P1.0的高/低的过渡会引发P1_ISR
/ /切换P2.1。正常模式LPM4?0.1uA。 LPM4电流可测
/ /与LED删除所有未使用的P1.x/P2.x配置为输出或输入
/ /拉高或低,确保P2.0的中断输入不浮动。
// ACLK=32.768kHz的,个MCLK= SMCLK=默认的DCO

// MSP430xG461x
// -----------------
// /|\| |
// | | |
// --|RST |
// /|\ | |
// --o--|P1.0 P2.1|-->LED
// \|/
//*************************************************************************
#include <msp430xG46x.h>

void main(void)
{
WDTCTL = WDTPW + WDTHOLD; //停止看门狗
FLL_CTL0 |= XCAP14PF; //配置负载帽
P2DIR = BIT1; //设置P2.1为输出方向
P1IES = BIT0; // H-L过渡
P1IE = BIT0; //使能中断
_BIS_SR(LPM4_bits + GIE); // LPM4,使中断
}


// Port 1 interrupt service routine端口1中断服务程序
#pragma vector=PORT1_VECTOR
__interrupt void Port1_ISR (void)
{
unsigned volatile int i;
for (i=10000; i>0; i--); //防抖动延时
P1IFG &= ~BIT0; //清除P1IFG
if ((P1IN & 0x01) == 0)
P2OUT ^= 0x02; //使用专用或切换P2.1
}



8.
//*************************************************************************
// MSP430xG46x演示 - 软件P1.0口从LPM4中断
/ /
/ /说明:P1.0的高/低的过渡会引发P1_ISR
/ /切换P2.1。正常模式LPM4?0.1uA。 LPM4电流可测
/ /与LED删除所有未使用的P1.x/P2.x配置为输出或输入
/ /拉高或低,确保P2.0的中断输入不浮动。
// ACLK=32.768kHz的,个MCLK= SMCLK=默认的DCO

// MSP430xG461x
// -----------------
// /|\| |
// | | |
// --|RST |
// /|\ | |
// --o--|P1.0 P2.1|-->LED
// \|/
//
//*************************************************************************
#include <msp430xG46x.h>

void main(void)
{
WDTCTL = WDTPW + WDTHOLD; //停止看门狗
FLL_CTL0 |= XCAP14PF; //配置负载帽
P2DIR = BIT1; //设置P2.1为输出方向
P1IES = BIT0; // H-L过渡
P1IE = BIT0; //使能中断
_BIS_SR(LPM4_bits + GIE); // LPM4,使中断
}


// Port 1 interrupt service routine端口1中断服务程序
#pragma vector=PORT1_VECTOR
__interrupt void Port1_ISR (void)
{
unsigned volatile int i;
for (i=10000; i>0; i--); //防抖动延时
P1IFG &= ~BIT0; //清除P1IFG
if ((P1IN & 0x01) == 0)
P2OUT ^= 0x02; //使用专用或切换P2.1

9.
//*************************************************************************
// MSP430xG46x演示 - USCI_A0,UART ISR的回声,检查官SMCLK115200
/ /(修改后的代码示例“msp430xG46x_uscia0_uart_01_115k.c”)
/ /
//说明:回声一个接收到的字符,接收的ISR使用。正常模式LPM0。
/ / USCI_A0 RX中断触发的TX回声。
(01H009h)//1048576hz= 1048576/115200=9.1波特率分频器
// ACLK= LFXT1=32768Hz的,个MCLK= SMCLK=默认的DCO=32×ACLK=1048576Hz
/ / / /*辛与XOUT之间的外部钟晶振需要ACLK* / /

// MSP430FG4619
// -----------------
// /|\| XIN|-
// | | | 32kHz
// --|RST XOUT|-
// | |
// | P2.5/UCA0RXD|<------------
// | | 115200 - 8N1
// | P2.4/UCA0TXD|------------>
//
//*************************************************************************
#include "msp430xG46x.h"

void main(void)
{
volatile unsigned int i;

WDTCTL = WDTPW+WDTHOLD; //停止看门狗
FLL_CTL0 |= XCAP14PF; //配置负载帽
do
{
IFG1 &= ~OFIFG; //清除OSCFault标志
for (i = 0x47FF; i > 0; i--); //标志设置时间
}
while ((IFG1 & OFIFG)); // OSCFault flag still set?

P2SEL |= 0x030; // P2.4,5 = USCI_A0 RXD/TXD
UCA0CTL1 |= UCSSEL_2; // SMCLK
UCA0BR0 = 18;0x09; // 1MHz 115200
UCA0BR1 = 0;0x00; // 1MHz 115200
UCA0MCTL = 0;0x02; //调制
UCA0CTL1 &= ~UCSWRST; // **初始化USCI状态机**
IE2 |= UCA0RXIE; //启用USCI_A0 RX中断

_BIS_SR(LPM0_bits + GIE); //进入LPM0,启用中断
}

// 回显RXed字符,确认TX缓冲区是准备先
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCIA0RX_ISR (void)
{
while(!(IFG2&UCA0TXIFG));
UCA0TXBUF = UCA0RXBUF; // TX -> RXed character
}



10.
/******************************************************************************* MSP-EXP430G2-LaunchPad软件用户的应用体验
*
* 1。设备开始在LPM3模式+闪烁的LED显示设备是活着
*后的第一个按钮记者,设备过渡到应用模式
* 2。应用模式
*+连续采样ADC的温度传感器通道,比较的结果,对
*初始值
*+设为PWM基于测量ADC偏移:红色的LED积极偏移,绿
* LED为负偏移
*通过TimerA的UART发送温度值到PC
*+按钮按下 - >校准使用当前温度
*发送字符“,通知PC机通过UART
***************************************************************************
#include "msp430g2553.h"

#define LED0 BIT0
#define LED1 BIT6
#define LED_DIR P1DIR
#define LED_OUT P1OUT

#define BUTTON BIT3
#define BUTTON_OUT P1OUT
#define BUTTON_DIR P1DIR
#define BUTTON_IN P1IN
#define BUTTON_IE P1IE
#define BUTTON_IES P1IES
#define BUTTON_IFG P1IFG
#define BUTTON_REN P1REN

#define TXD BIT1 // P1.2上的TXD
#define RXD BIT2 //P1.2上的RXD
#define APP_STANDBY_MODE 0
#define APP_APPLICATION_MODE 1

#define TIMER_PWM_MODE 0
#define TIMER_UART_MODE 1
#define TIMER_PWM_PERIOD 2000
#define TIMER_PWM_OFFSET 20

#define TEMP_SAME 0
#define TEMP_HOT 1
#define TEMP_COLD 2

#define TEMP_THRESHOLD 5

// Conditions for 9600/4=2400 Baud SW UART, SMCLK = 1MHz
#define Bitime_5 0x05*4 // ?0.5位长度+小调整
#define Bitime 13*4//0x0D

#define UART_UPDATE_INTERVAL 1000


unsigned char BitCnt;


unsigned char applicationMode = APP_STANDBY_MODE;
unsigned char timerMode = TIMER_PWM_MODE;

unsigned char tempMode;
unsigned char calibrateUpdate = 0;
unsigned char tempPolarity = TEMP_SAME;
unsigned int TXByte;

/*使用8值,采样ADC值的移动平均滤波器*/
long tempMeasured[8];
unsigned char tempMeasuredPosition=0;
long tempAverage;

long tempCalibrated, tempDifference;

void InitializeLeds(void);
void InitializeButton(void);
void PreApplicationMode(void); //闪烁的LED,等待按下按钮
void ConfigureAdcTempSensor(void);
void ConfigureTimerPwm(void);
void ConfigureTimerUart(void);
void Transmit(void);
void InitializeClocks(void);

void main(void)
{
unsigned int uartUpdateTimer = UART_UPDATE_INTERVAL;
unsigned char i;
WDTCTL = WDTPW + WDTHOLD; //停止看门狗
InitializeClocks();
InitializeButton();
InitializeLeds();
PreApplicationMode(); //闪烁发光二极管,等待按下按钮
/* Application Mode begins */
applicationMode = APP_APPLICATION_MODE;
ConfigureAdcTempSensor();
ConfigureTimerPwm();

__enable_interrupt(); //使能中断。

/* Main Application Loop */
while(1)
{
ADC10CTL0 |= ENC + ADC10SC; //采样和转换启动
__bis_SR_register(CPUOFF + GIE); // LPM0与中断功能

/* 8个值的移动平均滤波器,有些稳定采样的ADC */
tempMeasured[tempMeasuredPosition++] = ADC10MEM;
if (tempMeasuredPosition == 8)
tempMeasuredPosition = 0;
tempAverage = 0;
for (i = 0; i < 8; i++)
tempAverage += tempMeasured[i];
tempAverage >>= 3; //除以8得到的平均
if ((--uartUpdateTimer == 0) || calibrateUpdate )
{
ConfigureTimerUart();
if (calibrateUpdate)
{
TXByte = 248; //具有高价值以外的字符
of temp range
Transmit();
calibrateUpdate = 0;
}
TXByte = (unsigned char)( ((tempAverage - 630) * 761) / 1024 );
Transmit();
uartUpdateTimer = UART_UPDATE_INTERVAL;
ConfigureTimerPwm();
}


tempDifference = tempAverage - tempCalibrated;
if (tempDifference < -TEMP_THRESHOLD)
{
tempDifference = -tempDifference;
tempPolarity = TEMP_COLD;
LED_OUT &= ~ LED1;
}
else
if (tempDifference > TEMP_THRESHOLD)
{
tempPolarity = TEMP_HOT;
LED_OUT &= ~ LED0;
}
else
{
tempPolarity = TEMP_SAME;
TACCTL0 &= ~CCIE;
TACCTL1 &= ~CCIE;
LED_OUT &= ~(LED0 + LED1);
}

if (tempPolarity != TEMP_SAME)
{
tempDifference <<= 3;
tempDifference += TIMER_PWM_OFFSET;
TACCR1 = ( (tempDifference) < (TIMER_PWM_PERIOD-1) ? (tempDifference) : (TIMER_PWM_PERIOD-1) );
TACCTL0 |= CCIE;
TACCTL1 |= CCIE;
}
}
}

void PreApplicationMode(void)
{
LED_DIR |= LED0 + LED1;
LED_OUT |= LED0; //为了使LED的切换效果
LED_OUT &= ~LED1;

BCSCTL1 |= DIVA_1; // ACLK/2
BCSCTL3 |= LFXT1S_2; // ACLK = VLO

TACCR0 = 1200; //
TACTL = TASSEL_1 | MC_1; // TACLK= SMCLK,最多的模式。
TACCTL1 = CCIE + OUTMOD_3; // TACCTL1捕捉比较
TACCR1 = 600;
__bis_SR_register(LPM3_bits + GIE); // LPM0与中断功能
}

void ConfigureAdcTempSensor(void)
{
unsigned char i;

/* Configure ADC Temp Sensor Channel配置ADC温度传感器通道*/

ADC10CTL1 = INCH_10 + ADC10DIV_3; //温度传感器ADC10CLK/ 4
ADC10CTL0 = SREF_1 + ADC10SHT_3 + REFON + ADC10ON + ADC10IE;
__delay_cycles(1000); //等待ADC的参考解决
ADC10CTL0 |= ENC + ADC10SC; //采样和转换启动
__bis_SR_register(CPUOFF + GIE); // LPM0与中断功能
tempCalibrated = ADC10MEM;
for (i=0; i < 8; i++)
tempMeasured[i] = tempCalibrated;
tempAverage = tempCalibrated;
}


void ConfigureTimerPwm(void)
{
timerMode = TIMER_PWM_MODE;

TACCR0 = TIMER_PWM_PERIOD; //
TACTL = TASSEL_2 | MC_1; // TACLK= SMCLK,最多的模式。
TACCTL0 = CCIE;
TACCTL1 = CCIE + OUTMOD_3; // TACCTL1捕捉比较
TACCR1 = 1;
}

void ConfigureTimerUart(void)
{
timerMode = TIMER_UART_MODE; //配置TimerA0 UART发送

CCTL0 = OUT; // TXD Idle as Mark
TACTL = TASSEL_2 + MC_2 + ID_3; // SMCLK/ 8,连续模式
P1SEL |= TXD + RXD; //
P1DIR |= TXD; //
}

// Function Transmits Character from TXByte
void Transmit()
{
BitCnt = 0xA; //负载位计数器,8data+ ST/遣散
while (CCR0 != TAR) //防止异步捕获
CCR0 = TAR; // TA的计数器的当前状态
CCR0 += Bitime; //一些时间,直到第一个位
TXByte |= 0x100; //标志着停止位TXByte
TXByte = TXByte << 1; //添加空间的起始位
CCTL0 = CCIS0 + OUTMOD0 + CCIE; // TXD = mark = idle
while ( CCTL0 & CCIE ); //等待发送完成
}



// Timer A0 interrupt service routine
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A (void)
{
if (timerMode == TIMER_UART_MODE)
{
CCR0 += Bitime; //到CCR0的地址偏移
if (CCTL0 & CCIS0) //上CCI0B的TX?
{
if ( BitCnt == 0)
CCTL0 &= ~ CCIE; //位TXed,禁用中断
else
{
CCTL0 |= OUTMOD2; // TX Space
if (TXByte & 0x01)
CCTL0 &= ~ OUTMOD2; // TX Mark
TXByte = TXByte >> 1;
BitCnt --;
}
}
}
else
{
if (tempPolarity == TEMP_HOT)
LED_OUT |= LED1;
if (tempPolarity == TEMP_COLD)
LED_OUT |= LED0;
TACCTL0 &= ~CCIFG;
}
}

#pragma vector=TIMER0_A1_VECTOR
__interrupt void ta1_isr(void)
{
TACCTL1 &= ~CCIFG;
if (applicationMode == APP_APPLICATION_MODE)
LED_OUT &= ~(LED0 + LED1);
else
LED_OUT ^= (LED0 + LED1);

}

void InitializeClocks(void)
{

BCSCTL1 = CALBC1_1MHZ; //设置范围
DCOCTL = CALDCO_1MHZ;
BCSCTL2 &= ~(DIVS_3); // SMCLK = DCO / 8 = 1MHz
}

void InitializeButton(void) //配置按钮
{
BUTTON_DIR &= ~BUTTON;
BUTTON_OUT |= BUTTON;
BUTTON_REN |= BUTTON;
BUTTON_IES |= BUTTON;
BUTTON_IFG &= ~BUTTON;
BUTTON_IE |= BUTTON;
}


void InitializeLeds(void)
{
LED_DIR |= LED0 + LED1;
LED_OUT &= ~(LED0 + LED1);
}

/* *************************************************************
*按下按钮端口中断
* 1。在待机模式:退出和进入应用模式
* 2。在应用模式:重新校准温度传感器
* *********************************************************** */
#pragma vector=PORT1_VECTOR
__interrupt void PORT1_ISR(void)
{
BUTTON_IFG = 0;
BUTTON_IE &= ~BUTTON; /*去抖*/
WDTCTL = WDT_ADLY_250;
IFG1 &= ~WDTIFG; /*清除中断标志 */
IE1 |= WDTIE;

if (applicationMode == APP_APPLICATION_MODE)
{
tempCalibrated = tempAverage;
calibrateUpdate = 1;
}
else
{
applicationMode = APP_APPLICATION_MODE; //从待机切换到应用程序模式
__bic_SR_register_on_exit(LPM3_bits);
}
}

#pragma vector=WDT_VECTOR
__interrupt void WDT_ISR(void)
{
IE1 &= ~WDTIE; /*禁止中断 */
IFG1 &= ~WDTIFG; /*清除中断标志 */
WDTCTL = WDTPW + WDTHOLD; /*把WDT的保持状态*/
BUTTON_IE |= BUTTON; /*去抖完整 */
}

// ADC10 interrupt service routine
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR (void)
{
__bic_SR_register_on_exit(CPUOFF); //返回到主动模式
}

相关文章:
更多相关标签: