msp430中斷疑問

2019-03-24 11:34发布


中断的使用是否一定要进入LPM模式?
使用TI范例TA来做修改


int ta=0;
int main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  P1DIR |= 0x01;                            // P1.0 output
  CCTL0 = CCIE;                             // CCR0 interrupt enabled
  CCR0 = 50000;
  TACTL = TASSEL_2 + MC_1;                  // SMCLK, upmode

// _BIS_SR(LPM0_bits + GIE);                 // Enter LPM0 w/ interrupt

  if(ta == 10)
    {
       P1OUT ^= 0x01;                            // Toggle P1.0
       ta = 0;
    }
}

// Timer A0 interrupt service routine
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A (void)
{
  ta = ta+1;
}


(1)运行时发现TA动作,但没有进入中断

加入_BIS_SR(LPM0_bits + GIE);                 // Enter LPM0 w/ interrupt
(2)如进入LPM模式,则进入中断 ta 增加
但ta会远大于10,无法进入if回圈

求指教,谢谢
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
jk4857
1楼-- · 2019-03-24 15:07
lingergz 发表于 2014-5-8 11:31
现在明白了MSP430低功耗应用的程序模板了吧。

程序确实是依照这样的流程走没错,学习了!
EETUX
2楼-- · 2019-03-24 16:05
< :TI_MSP430_内容页_SA7 --> try:
while(1)
{
if(ta == 10)
    {
       P1OUT ^= 0x01;                            // Toggle P1.0
       ta = 0;
    }
}
jk4857
3楼-- · 2019-03-24 17:46
 精彩回答 2  元偷偷看……
EETUX
4楼-- · 2019-03-24 23:12
我在launchpad 上式了下,看上去完全可以.
#include "io430.h"
int ta=0;  //add volatile ??
int main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  P1DIR |= 0x01;                            // P1.0 output
  CCTL0 = CCIE;                             // CCR0 interrupt enabled
  CCR0 = 50000;
  TACTL = TASSEL_2 + MC_1;                  // SMCLK, upmode
  //ta=0;
  asm ("EINT;");                           /////////// Enter LPM0 w/ interrupt
  
  while(1)
  {
    if(ta == 10)               
    {
       P1OUT ^= 0x01;                            // Toggle P1.0
       ta = 0;
    }
  }
}

// Timer A0 interrupt service routine
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A (void)
{
  ta = ta+1;
}
lingergz
5楼-- · 2019-03-25 04:00
老兄,你这个程序肯定有问题啦,
  1. int ta=0;
  2. int main(void)
  3. {
  4.   WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  5.   P1DIR |= 0x01;                            // P1.0 output
  6.   CCTL0 = CCIE;                             // CCR0 interrupt enabled
  7.   CCR0 = 50000;
  8.   TACTL = TASSEL_2 + MC_1;                  // SMCLK, upmode

  9.    _BIS_SR(LPM0_bits + GIE);                 // Enter LPM0 w/ interrupt

  10.     while(1)
  11. {
  12.   if(ta == 10)
  13.     {
  14.        P1OUT ^= 0x01;                            // Toggle P1.0
  15.        ta = 0;
  16.     }
  17. }
  18. }

  19. // Timer A0 interrupt service routine
  20. #pragma vector=TIMER0_A0_VECTOR
  21. __interrupt void Timer_A (void)
  22. {
  23.   ta = ta+1;
  24. LPM0;
  25. }


复制代码
jk4857
6楼-- · 2019-03-25 07:53
 精彩回答 2  元偷偷看……

一周热门 更多>

相关问题

    相关文章