×
单片机 > 单片机程序设计 > 详情

MSP430中断的一个细节问题

发布时间:2020-09-01 发布时间:
|

关于中断标志:


从SPI发送一字节数据:


void SPI_Set_SD_Byte(unsigned char txData)


{


UCB0TXBUF = txData; // 写入发送缓冲区


         while ((UCB0IFG & UCTXIFG) == 0); // 等待发送完毕


}


分析:以9600bps 发送一字节 1ms估算,而以12MHz时钟执行(UCB0TXBUF = txData;)需要时间大概1us,


因此可怕的事情发生了,要等待发送完毕需要浪费3999个CPU周期去查询。如果等待过程换成休眠多好啊!


看下面程序:


void SPI_Set_SD_Byte(unsigned char txData)


{


UCB0TXBUF = txData; // 写入发送缓冲区


       LPM3;


}


#pragma vector=USCI_B0_VECTOR   



__interrupt void USCI_B0_ISR(void)

{

  //order interrupt service

  switch (__even_in_range (UCB0IV,8))

  {


        case 0: break;


        case 2: break;


case 8: while (!(UCB0IFG&UCTXIFG)); 


break;


        LPM3_EXIT;

  }


巧妙地事情发生了,你CPU先歇着,让我SPI单独工作。

但系统中开启仅SPI发送中断时,上面是OK的,可问题来了,只发送不接受吗?有时候SPI通信未必


只有一个外设,为了实现低功耗,常常会唤醒低功耗在中断。


你怎能保证其他终端唤醒CPU时,SPI已发送完毕呢?


本文的重点来了,全局通信变量标志位是一把利剑。


void SPI_Set_SD_Byte(unsigned char txData)


{


UCB0TXBUF = txData; // 写入发送缓冲区


       SPI_TxFlag_sd = 0;// 清除全局标志位


        while (SPI_TxFlag_sd == 0 ) // 发送过程中CPU才唤醒


        {


LPM3;


        }


}


__interrupt void USCI_B0_ISR(void)

{

  //order interrupt service

  switch (__even_in_range (UCB0IV,8))

  {


        case 0: break;


        case 2: break;


case 8: SPI_TxFlag_sd = 1; 


     LPM3_EXIT;


     break;    


  }


分析:任何中断都可能把CPU唤醒,但是只有SPI发送完毕后,SPI_TxFlag_sd 才置1 。


小编看过很多MSP430文章,可诸如小编这样的看待中断的角度展开叙述的,颇少!



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
如何为单片机选择合适的负载电容