簡體   English   中英

TIMER0 不執行多個比較匹配寄存器中斷請求。(MSP430)

[英]TIMER0 not executing multiple compare match register interrupt requests.(MSP430)

好的,所以我一直在嘗試使用 MSP430FR5994 TI 啟動板創建一些代碼,該啟動板利用 Timer0 和 3 個單獨的比較寄存器來觸發 3 個單獨的 isr。 我已經成功地讓一個工作,但是一旦我添加另一個比較寄存器,CCIFE 標志設置並且永遠不會競爭第二個 isr 的執行。 我已經在 CCstudio 和 IAR 的調試器中觀察了代碼,兩者都發生了同樣的事情,設置寄存器是正確的,TA0R 寄存器正在計數,並將觸發基於 TA0CCR0 的第一個 isr,但所有其他比較 regs R1 2 3 等不會觸發和執行成功。 代碼如下,非常感謝我做錯了什么。

#include "msp430.h"
#include <stdbool.h>
#define COUNT_1 12000 
#define COUNT_2 800


int main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;

  PM5CTL0 &= ~LOCKLPM5;

  P1DIR |= BIT0 + BIT1;
  P1OUT = BIT0 + BIT1; 


   //set up and enable timer A or TA0 for continous mode 

  TA0CCR0 = COUNT_1;
  TA1CCR1 = COUNT_2;  
  TA0CTL = TASSEL__ACLK + MC_2;  //set the max period for 16bit timer operation
  TA1CTL = TASSEL__ACLK + MC_2;
  TA0CCTL0 = CCIE;  //enable compare reg 0
  TA1CCTL1 = CCIE;  //enable compare reg 1
  //TA0CTL |= TAIE;

  _BIS_SR( GIE); //ENABLE GLOBAL INTERRRUPTS

  //set the max period for 16bit timer operation


  while(true){}


  }

#pragma vector= TIMER0_A0_VECTOR    //compare interrupt 0 flahse red led
__interrupt void TIMER0_A0(void) {
  P1OUT ^= BIT1 ;

}

#pragma vector = TIMER1_A1_VECTOR   //compare interrupt 1 flashes green led
__interrupt void TIMER1_A1(void) {

 P1OUT ^= BIT0;

}

用戶指南在第 25.2.6.1 節中說:

當 TAxCCR0 中斷請求被處理時,TAxCCR0 CCIFG 標志自動復位。

但是,其他 CCRx 中斷不會發生這種情況,因為多個中斷使用相同的中斷向量。 第 25.2.5.2 節說:

啟用的最高優先級中斷在 TAxIV 寄存器中生成一個數字(參見寄存器說明)。 […]
對 TAxIV 寄存器的任何訪問(讀取或寫入)都會自動復位最高掛起的中斷標志。

因此,您始終必須讀取 TAxIV 寄存器(並且對於三個或更多 CCR,您需要它來找出哪個 CCR 觸發了中斷):

__interrupt void TIMER1_A1(void) {
    switch (TA1IV) {
    case TAIV__TACCR1:
        P1OUT ^= BIT0;
        break;
    case TAIV__TACCR2:
        ...
        break;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM