переделал код. Теперь работает по прерываниям.
CODE
#include <msp430x471x7.h>
#include <stdint.h>
#define FREQMCLK 9830400UL //MCLK
#define FREQSMCLK 9830400UL //SMCLK
//#define FREQSMCLK 16000000UL //SMCLK
#define FREQACLK 32768UL //ACLK
#define BAUDRATE 9600UL //baudrate
#define TICK_MS_ADDVAL 100U //инкремент таймера тиков [мс]
#define BLINK_TIME_MS 500U //полупериод мерцания LED [мс]
int __low_level_init(void)
{ WDTCTL = WDTPW | WDTHOLD; //останов WDTimer
return 1;
}
void main(void)
{
uint32_t lTmp;
//Инициализация системы тактирования
// FLL_CTL1 = XT2OFF; //D=2, MCLK=fDCOCLK/D, SMCLK=fDCOCLK/D, ACLK=LFXT/1, XT2=off
FLL_CTL1 = 0; //D=2, MCLK=fDCOCLK/D, SMCLK=fDCOCLK/D, ACLK=LFXT/1
FLL_CTL2 = XT2S1; //для работы XT2=16МГц
FLL_CTL0 = XCAP0PF; //XT1=LF, DCO/D, XCAP=11пФ
while ((FLL_CTL0 & LFOF) != 0); //ждем готовности генератора 32768Гц
// while ((FLL_CTL0 & XT2OF) != 0); //ждем готовности генератора 16МГц
SCFI0 = FLLD_4 | FN_2; //D=4, fDCOCLK = 1.4-12MHz
SCFQCTL = SCFQ_M + (75U-1U); //fDCOCLK=32768*(75)*4=9830400Гц, DCO=fDCOCLK/4
while ((FLL_CTL0 & DCOF) != 0); //ждем готовности FLL
// FLL_CTL0 |= DCOPLUS; //MCLK=DCO/1, SMCLK=DCO/1
FLL_CTL1 |= SELS; //MCLK=DCO, SMCLK=XT2, ACLK=LFXT/1
do
{ IFG1 &= OFIFG ^ 0xFF;
} while ((IFG1&OFIFG) != 0); //ждем готовности всей системы тактирования
P5OUT ^= BIT7;
//Инициализация UART
UCA1CTL1 |= UCSWRST; //Reset USCI
UCA1CTL0 = 0; //Parity=disable, 8bit, 1stop-bit
UCA1CTL1 = UCSSEL_2 | UCSWRST; //BRCLK=SMCLK
lTmp=FREQSMCLK/BAUDRATE;
UCA1BR1 = (uint8_t)(lTmp>>8UL); //
UCA1BR0 = (uint8_t)(lTmp); //BITCLK=BRCLK/(UCAxBR1*256+UCAxBR0)
UCA1MCTL = 0; //регистр модуляции
UCA1STAT = 0; //сброс всех битов ощибок
UCA1IRTCTL = 0; //IRDA disable
UCA1CTL1 &= ~UCSWRST;
P1SEL |= BIT6 | BIT7; //P1.6 = USCI TXD, P1.7 = USCI RXD
UC1IE |= UCA1RXIE; //разрешить прерывания от приёмника USCI_A1
UC1IFG |= UCA1RXIFG; //сбросим флаг готовности буфера приемника
// UC1IFG |= UCA1TXIFG; //установим флаг готовность буфера передатчика
//Инициализация LED
P5DIR |= BIT7;
P5SEL &= ~BIT7;
P5OUT &= ~BIT7;
__enable_interrupt(); //разрешим прерывания
}
// Echo back RXed character, confirm TX buffer is ready first
#pragma vector=USCIAB1RX_VECTOR
__interrupt void USCIA1RX_ISR (void)
{
if ((UC1IFG&UCA1TXIFG)!=0);
UCA1TXBUF = UCA1RXBUF; // TX -> RXed character
P5OUT ^= BIT7;
}
Но наблюдается очень странное поведение. Некоторые символы отлично проходят в "эхо", другие возвращаются с ошибками(непонятные символы приходят). Например символ "a" не возвращается как положено, а символ "z" всегда возвращается как надо.
При каждом прерывании светодиод должен менять своё состояние, но, для случая с "a" состояние меняется, а для случая отправки "z" состояние не меняется. То есть со светодиодом ситуация наоборот... КАК ТАК?