Я использую следующий код, чтобы мигать светодиодами с помощью прерывания таймера:
#include <msp430.h>
#define LED1 BIT0 //define LED1 as bit 0 (0x00)
#define LED2 BIT6 //define LED2 as bit 6 (0x40)
int main(void)
{
//stop watchdog timer
WDTCTL = WDTPW | WDTHOLD;
//P1 initialization code
P1OUT &= 0x00; //clear all bits on P1
P1DIR |= (LED1|LED2); //set P1.0 and P1.6 to output direction
//Timer_0A3 initialization
TA0CCR0 = 12e3; //count limit (16 bit)
TA0CCTL0 = 0x10; //enable counter interrupts, set bit 4 high
TA0CTL = TASSEL_1 + MC_1; //Timer A0 with ACLK @ 12KHz (TASSEL_1), count UP (MC_1)
//low power mode
_BIS_SR(LPM0_bits + GIE); //LPM0 (low power mode) with interrupts enabled
}
#pragma vector = TIMER0_A0_VECTOR
__interrupt void Timer0_A0 (void) //service routine for Timer0 A0 interrupt
{
P1OUT ^= (LED1|LED2); //toggle P1.0 using exclusive-OR
}
И знаете что, это работает! Но только когда я запускаю отладчик. Когда я закрываю отладчик, он прекращает свои действия, и какой бы светодиод ни горел в это время, он продолжает гореть. Сброс платы совсем не помогает.
После небольшого исследования в Интернете я попытался пойти Tools -> Debugger Options -> MSP430 Debugger Options -> Clock Control
, чтобы снять отметку с соответствующего таймера. У меня есть такие варианты: []ACLK []SMCLK []TACLK
. Я пробовал каждую комбинацию проверок / снятий, и, похоже, ничто не позволяет моим прерываниям работать после того, как отладчик перестает работать.
Если бы мне пришлось угадывать, я бы сказал, что таймер работает, но почему-то флаги прерывания не устанавливаются должным образом. Есть идеи, что здесь происходит?