Схемотехника используется из slaa409 (апликейшн счётчика).
Преобразователь уровней на MAX232 работает (проверялось отдельно).
Используется COM-порт на материнке.
Осцила нет

Код (это ваш последний вариант для меня - SMLK от XT2):
CODE
#include <stdint.h>
#include <msp430x471x7.h>
#define FREQMCLK 2097152UL //MCLK
#define FREQSMCLK 16000000UL //SMCLK
#define FREQACLK 32768UL //ACLK
#define BAUDRATE 9600UL //baudrate
#define TICK_MS_ADDVAL 10U //инкремент таймера тиков [мс]
#define BLINK_TM_MS 250U //полупериод мерцания LED [мс]
#define LED_ON P5OUT&=~BIT7//включить LED
#define LED_OFF P5OUT|=BIT7 //выключить LED
#define LED_TOGGLE P5OUT^=BIT7 //переключить LED
int __low_level_init(void)
{ WDTCTL = WDTPW | WDTHOLD; //останов WDTimer
return 1;
}
volatile uint16_t tick_ms; //счетчик миллисекунд
uint8_t uart_buf[]={'0','1','2','3','4','5','6','7','8','9','\n','\r'};//буфер UART
void main(void)
{ uint16_t tickStamp, idx, flag;
uint32_t lTmp;
//Инициализация системы тактирования
FLL_CTL1 = 0; //D=2, MCLK=fDCOCLK/D, SMCLK=fDCOCLK/D, ACLK=LFXT/1, XT2=on
FLL_CTL2 = XT2S1; //для работы XT2=16МГц
FLL_CTL0 = XCAP11PF; //XT1=LF, DCO/D, XCAP=11пФ
while ((FLL_CTL0 & LFOF) != 0); //ждем готовности генератора 32768Гц
SCFI0 = FLLD_2; //D=2, fDCOCLK = 0.65-6.1Mhz
SCFQCTL = (32U-1U); //fDCOCLK=32768*(32)*2=2097152Гц, DCO=fDCOCLK/2
FLL_CTL0 |= DCOPLUS; //MCLK=DCO/1, SMCLK=DCO/1
do
{ IFG1 &= ~OFIFG;
} while ((IFG1&OFIFG) != 0); //ждем готовности всей системы тактирования
FLL_CTL1 |= SELS; //MCLK=fDCOCLK, SMCLK=XT2, ACLK=LFXT/1, XT2=on
//Инициализация 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 &= ~(UCA1TXIE | UCA1RXIE); //запретим прерывания USCI_A1
UC1IFG &= ~UCA1RXIFG; //сбросим флаг готовности буфера приемника
UC1IFG |= UCA1TXIFG; //установим флаг готовность буфера передатчика
//Иницализация TimerA
TACTL = TASSEL_1 | TACLR; //TACLK=ACLK/1
TACCR0=(uint16_t)(FREQACLK*TICK_MS_ADDVAL/1000UL); //период около 10мс
TACCTL0 = CCIE; //разр. прерывание от CCR0
TACCTL1 = 0;
TACCTL2 = 0;
TACTL |= MC_1; //запустить таймер в режиме CountUP
//Инициализация LED
P5DIR |= BIT7;
P5SEL &= ~BIT7;
LED_ON;
//Настройка пинов чтобы посмотреть частоту SMCLK и ACLK
P1DIR |= BIT4 | BIT5;
P1SEL |= BIT4 | BIT5; //P1.4 = SMCLK, P1.5 = ACLK
idx=0;
flag=0;
tickStamp = tick_ms; //зафиксировать временную метку
__enable_interrupt(); //разрешим прерывания
for (;;)
{ if ((UC1IFG & UCA1TXIFG) != 0) //буфер передатчика готов?
{ UCA1TXBUF = uart_buf[idx]; //вывод текущего символа
flag=1; //установим флаг готовности UART
if (idx < (sizeof(uart_buf)-1))//увеличение индекса элемента буфера
idx += 1;
else
idx = 0;
}
if ((tick_ms - tickStamp) >= BLINK_TM_MS)//полупериод мерцания закончился?
{ tickStamp = tick_ms; //запомним новое значение метки времени
if (flag != 0) //проверка флага готовности UART
{ LED_TOGGLE; //включаем LED
flag = 0; //сбросим флаг готовности UART
}
else
LED_OFF; //выключаем LED
}
}
}
#pragma vector=TIMERA0_VECTOR
#pragma type_attribute=__interrupt
void TimerA0_ISR (void)
{
tick_ms += TICK_MS_ADDVAL; //инкремент счтечика тиков [мс]
}
Код, судя по всему, верный и рабочий.
Суть проблемы:
Когда открываю порт в HyperTerminal то по экрану бегут иероглифы. Стоит только "закрыть-открыть" порт тут же всё идёт как надо (бегут цифры "0123456789" столбиком). Иногда "закрыть-открыть" нужно несколько раз тобы получить нужную картину.
Сие чудо наблюдается в ЛЮБОЙ терминальной программе.
Если бы просто не выводилось ничего я бы больше не стал писать (сколько можно уж). Но тут непонятное вовсе явление.