#include "msp430x14x.h" #include "config.h"
void init(); int main() {WDTCTL = WDTPW + WDTHOLD;init();_eint();while(1) ;
} void init() {p6sel=0x00;p6dir=0xff;p6out=~0x01;p6out=0xff;p1sel=0x00;p1dir=0x00;p1ies=0xff;p1ie=0x0f;p1ifg=0x00; } #pragma vector=PORT1_VECTOR __interrupt void PORT1_ISR(void) {switch(p1ifg&0x0f){case 0x01: p6out=~0x01; fig=1; break;case 0x02: p6out=~0x02; break;case 0x04: p6out=~0x04; break;case 0x08: p6out=~0x08; lpm0_exit; break;}p1ifg=0x00; } 此程序原目的是按下第一个按键进进入中断执行LPM0
按下第四个按键进入中断执行LPM0_EXIT
但是按下第一个后程序,程序就不动了,按第四个无法退出低功耗模式。无论如何按P6的灯都不会变化。
一个好心网友帮我解决程序如下
#include "msp430x14x.h" #include "config.h"
unsigned char fig=0; void init(); int main() {WDTCTL = WDTPW + WDTHOLD;init();_eint();lpm0;while(1){ if(fig==1) { lpm0; fig=0; }p6out=0xff;delay(50);p6out=0x00;delay(50);} } void init() {p6sel=0x00;p6dir=0xff;p6out=~0x01;p6out=0xff;p1sel=0x00;p1dir=0x00;p1ies=0xff;p1ie=0x0f;p1ifg=0x00; } #pragma vector=PORT1_VECTOR __interrupt void PORT1_ISR(void) {switch(p1ifg&0x0f){case 0x01: p6out=~0x01; fig=1; break;case 0x02: p6out=~0x02; break;case 0x04: p6out=~0x04; break;case 0x08: p6out=~0x08; lpm0_exit; break;}p1ifg=0x00; } 程序编译烧录执行没有问题,他的解释是这样的
进入中断前PC会被压入堆栈 jmp到中断服务函数执行完后才弹出PC
据需执行
进入功耗模式前PC也会被压入堆栈 知道退出低功耗模式才弹出据需执行
PC是指针
但不理解的是,LPMx设置的主要是SCG1 SCG0 OSCOFF CPUOFF这个几个寄存器这个寄存器在430应该
有固定的内存位置,不像函数里面的局部变量用完就没有了,及时我在中断中修改也是能生效的,所以我
最近一直在研究到是哪里的问题。
user4073852:
程序编译烧录执行没有问题,他的解释是这样的
进入中断前PC会被压入堆栈 jmp到中断服务函数执行完后才弹出PC据需执行进入功耗模式前PC也会被压入堆栈 知道退出低功耗模式才弹出据需执行PC是指针但不理解的是,LPMx设置的主要是SCG1 SCG0 OSCOFF CPUOFF这个几个寄存器这个寄存器在430应该有固定的内存位置,不像函数里面的局部变量用完就没有了,及时我在中断中修改也是能生效的,所以我最近一直在研究到是哪里的问题