文档介绍:1
3
3
3
第 10 卷第 2 期(2005) 甘肃高师学报 Vol 10No. 2 (2005)
MSP430 单片机 C 语言编程中的退出睡眠问题
王国伟张雷涛祁富燕
(兰州师范高等专科学校,甘肃兰州 730070)
摘要:介绍了 MSP430 进入睡眠后,采用 C 语言与汇编语言混合编程的方法解决系统退出睡眠的问题。
关键词:MSP430 ;汇编语言;C 语言;堆栈
中图分类号: TP368 文献标识码:A 文章编号:1008 - 9020(2005) 02 - 021 - 01
MSP430 在进入睡眠后,如果发生事件产生中断,那么单 P1OU T = 0 ; ∥L ED off
片机会退出睡眠,自动执行中断程序,但是当中断返回时,主}
程序又重新进入睡眠状态。如果要在发生中断后,主程序需
}
要退出睡眠,那么需要在中断程序中修改 SP 堆栈中的内容,
interrupt [ WDT VECTOR]void watchdog timer (void)
C 语言没有指令可以修改堆栈内的内容,可以采用 C 语言与
汇编语言混合编程的方法解决此问题。{
下面是一个 C 语言的例子,程序分 C 语言部分和汇编语 sptr & = ~CPUOFF ; ∥清除压入堆
言两部分。栈中 SR 的 CPUOFF 位
C 语言部分如下: ∥其他用户程序
# include < msp430x11x1. h > }
interrupt [ WDT VECTOR ] void watchdog timer 汇编部分:
(void) ; NAME getsptr
extern void getsptr (void) ; ∥得到堆栈指针 PUBL IC getsptr
unsigned short sptr ; ∥堆栈指针 EXTERN sptr
void main(void) RSEG CODE
{ getsptr :
int i ; mov SP , &sptr ;现行的堆栈指针送给 sptr
BCSCTL1 = DIVA1 ; ∥ACL K/ 4 ret
WDTCTL = WDT ADL Y 1000 ; ∥WDT 1s/ 上面的程序我们可以看到,C 语言部分为了能够操作堆
4 interval timer 栈中的 SR ,首先定义了一个指针变量 sptr ,以存放 SP 数据。
IE1 = WDTIE ; ∥Enable WDT interrupt C 语言主程序调用 getsptr ( ) 这个汇编程序,完成将 SP
送给 sptr 。在调用这个子程序时,PC 进行了一次压栈,所以
P1DIR = 0xFF ; ∥All p1. x outputs
在子程序返回时,当前的 SP = sptr + 2 (返回时执行了一次弹
P1OU T = 0 ; ∥All p1. x reset
出 PC 的操作) ,由于响应 C 语言中断服务程序要分别压入
P2DIR = 0xFF ; ∥All p2. x outputs PC 和 SR ,所以当进入中断程序后 SP = SP - 4 = sptr + 2 - 4
P2OU T