Part Number: MSP430FR6989
I'm trying to achieve the following:
I want to flash an LED when the TAR rolls back to zero event happens, and also i want to flash the red LED when channel 1's compare event occurs.
Channel 1 and TAR share the same vector TIMER_A1_VECTOR, thus we would only need one ISR. Is this statement correct?
My implementation:
#include <msp430.h>
#define redLED BIT0 // Red at P1.0
#define greenLED BIT7 // Green at P9.7
int main(void)
{
WDTCTL = WDTPW | WDTHOLD; // Stop WDT
PM5CTL0 &= ~LOCKLPM5; // Enable GPIO pins
P1DIR |= redLED;
P9DIR |= greenLED;
P1OUT &= ~redLED;
P9OUT &= ~greenLED;
TA0CCR1 = (12000 - 1);
TA0CCTL1 &= ~CCIFG;
TA0CCTL1 |= CCIE;
TA0CTL = TASSEL_1 | ID_0 | MC_2 | TACLR;
while (1) {}
return 0;
}
#pragma vector = TIMER0_A1_VECTOR
__interrupt void T0A1_ISR()
{
if ((TA0CTL & TAIFG) != 0){
P1OUT ^= greenLED;
TA0CTL &= ~TAIFG;
}
if ((TA0CCTL1 & CCIFG) != 0){
P1OUT ^= redLED;
TA0CCR1 += 12000;
TA0CCTL1 &= ~CCIFG;
}
}
// Configures ACLK to 32 KHz crystal
void config_ACLK_to_32KHz_crystal() {
// By default, ACLK runs on LFMODCLK at 5MHz/128 = 39 KHz
// Reroute pins to LFXIN/LFXOUT functionality
PJSEL1 &= ~BIT4;
PJSEL0 |= BIT4;
// Wait until the oscillator fault flags remain cleared
CSCTL0 = CSKEY; // Unlock CS registers
do {
CSCTL5 &= ~LFXTOFFG; // Local fault flag
SFRIFG1 &= ~OFIFG; // Global fault flag
} while((CSCTL5 & LFXTOFFG) != 0);
CSCTL0_H = 0; // Lock CS registers
return;
}