打印

MSP430的外部中断能否用查询方式实现

[复制链接]
4120|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tancm|  楼主 | 2011-11-5 22:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请问MSP430的IO口设置为外部中断引脚时,必须用中断子程序实现,而用主程序中查询PxIFGx的方法处理外部中断事件是无法实现的吗,每次调试都不对,程序如下:

#include  <msp430x24x.h>
char data;
#define LED_ON  P2OUT &=~0x04;
#define LED_OFF  P2OUT |= 0x04;
void delay(unsigned long int dl)
{
    while(dl--);
}
void clock_init()
{
  WDTCTL = WDTPW+WDTHOLD;                   // Stop WDT

  //set CPU clock
  if (CALBC1_16MHZ ==0xFF || CALDCO_16MHZ == 0xFF)                                    
  {  
    while(1);                              
  }
  BCSCTL1 = CALBC1_16MHZ;                    // Set DCO to 16MHz
  DCOCTL = CALDCO_16MHZ;
  
  //set UART clock
  BCSCTL1 &= ~XT2OFF;                       // Activate XT2 high freq xtal
  BCSCTL3 |= XT2S_2;                        // 16MHz crystal or resonator
  BCSCTL2 |= SELS;                        // SMCLK = XT2 HF XTAL (safe)
}
void IO_init()
{
  P2DIR |= 0x20;                            // Set P2.5(RESET) to output direction
  P2DIR |= 0x40;                            // Set P2.6(START) to output direction
  P3DIR |= 0x01;                            // Set P3.0(CS) to output direction
  P2OUT &=~0x20;
  delay(1000);
  P2OUT |= 0x20;                           //RESET=1
  P2OUT |= 0x40;                           //START=1
  P3OUT &=~0x01;                           //CS=0
  
  P2DIR |= 0x04;                           //Set P2.2 to output direction,this is LED
}
void UARTA1_init()
{
  P3SEL |= 0x0C0;                           // Use P3.6/P3.7 for USCI_A1
  UCA1CTL1 |= UCSSEL_2;            // 01000001,ACLK,32.768k
  UCA1BR0 = 139;                             // 16000000/115200=139;
  UCA1BR1 = 0;
  //UCA1CTL0=0x00;                 //00000000,8bits,no parity,1 stop bit,UART
  UCA1CTL1 &= ~UCSWRST;                     // Resume operation
}
void UARTA1_send(unsigned char TxByte)
{
   while (!(UC1IFG & UCA1TXIFG));            // USCI_A1 TX buffer ready?
   UCA1TXBUF = TxByte;                     // TX and Rx character
}
void SPIB0_init()
{
  P3SEL |= 0x0E;                            // P3.3,2 USCI_B0 option select
  UCB0CTL0 |= UCMSB + UCMST + UCSYNC;       // 3-pin, 8-bit SPI mstr, MSB 1st
  UCB0CTL1 |= UCSSEL_2;                     // SMCLK
  UCB0BR0 = 0x08;
  UCB0BR1 = 0;
  UCB0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
}
void ADS1246_init()
{
  delay(1000000);
  UCB0TXBUF=0x43;         //写SYS0寄存器
  delay(1000000);
  UCB0TXBUF=0x00;         //待设置的寄存器数量为1
  delay(1000000);
  UCB0TXBUF=0x08;         //内部增益为1,采样率为1k
  delay(1000000);
}
void P27interrupt_init()
{
  P2IE |= 0x80;                             // P2.7 interrupt enabled
  P2IES |= 0x80;                            // P2.7 Hi/lo edge
  P2IFG &= ~0x80;                           // P2.7 IFG cleared
  __bis_SR_register(GIE);       //interrupt enable
}
void main(void)
{
  clock_init();
  IO_init();
  UARTA1_init();
  SPIB0_init();
  ADS1246_init();
  P27interrupt_init();
  while(1)
  {
    while(P2IFG&0x80)
    {
      UCB0TXBUF = 0xFF;
      while (!(IFG2 & UCB0RXIFG));            // RXBUF ready?, data received??
      data = UCB0RXBUF;
      UARTA1_send(data);                      //MSB
      
      UCB0TXBUF = 0xFF;
      while (!(IFG2 & UCB0RXIFG));            // RXBUF ready?, data received??
      data = UCB0RXBUF;
      UARTA1_send(data);                      //Mid-Byte
      
      UCB0TXBUF = 0xFF;
      while (!(IFG2 & UCB0RXIFG));            // RXBUF ready?, data received??
      data = UCB0RXBUF;
      UARTA1_send(data);                      //LSB
      
      P2IFG &= ~0x80;                         // P2.7 IFG cleared
    }
  }
}

相关帖子

沙发
tancm|  楼主 | 2011-11-6 11:43 | 只看该作者
问题解决,删掉P2IE |= 0x80;                             // P2.7 interrupt enabled即可

使用特权

评论回复
板凳
永远的不知| | 2011-11-6 13:57 | 只看该作者
这样就不用进入中断程序,但是依然有标志可供查询。

使用特权

评论回复
地板
午后苦丁茶| | 2011-11-6 16:49 | 只看该作者
就这样? 2# tancm

使用特权

评论回复
5
TI_MCU| | 2011-11-6 18:33 | 只看该作者
4# 午后苦丁茶

2楼是正确的~去掉中断允许免得进入中断把标志位清除了

使用特权

评论回复
6
tancm|  楼主 | 2011-11-9 14:37 | 只看该作者
对就这样,更深层次的原因我还解释不清楚。不过也不是进入中断会清标志位,这个标志位在中断中不会自动清。 4# 午后苦丁茶

使用特权

评论回复
7
一般首席| | 2014-12-24 13:54 | 只看该作者
学习了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

20

帖子

0

粉丝