В функцию uart_init добавьте третьей строкой
Код
UCA0CTL1 |= UCSWRST;
Потому, что бит UCSWRST должен быть установлен на время инициализации регистров модуля USCI.
В обработчик прерывания USCI0RX_ISR добавьте вторую ветку ветвления для
else потому, что биты ошибок сами не сбрасываются. Если возникла ошибка на приеме, то нужно либо прочитать регистр UCA0RXBUF, либо регистр UCA0STAT почистить "вручную" (программно).
Кроме того, настоятельно рекомендую инициализировать все регистры
явными значениями, а не накладывать маски на дефолтные состояния, возникающие при подаче питания или после сброса.
Ну и насчет MCLK. Надежнее тактировать MCLK от DCO. Потому, что после сброса или включения питания MCLK тактируется от DCO. И даже если вы переключили его тактирование на кварцевый генератор, но в его работе произошел сбой, то MCLK автоматически переключается на DCO. После этого нужно обрабатывать прерывание по вектору NMI и восстанавливать работу модуля тактирования. У вас же такого обработчика прерывания нет. Так что все может случиться, особенно при неудачной трассировке платы. Я обычно рекомендую MCLK тактировать именно от DCO. Для этого нужно настроить регистры DCOCTL и BCSCTL1. Если вы еще не успели запортить сегмент INFO, то можно загружать калиброванные значения для этих регистров из TLV структуры, расположенной в INFO_A.
Еще один нюанс. Как именно вы проверяете работу UART? Если у вас в дебаггере открыто окно с регистрами USCI, то могут теряться прерывания от него. Чтение регистра UCA0RXBUF для отображения в этом окне, сбрасывает UCA0RXIFG. Следует иметь в виду этот факт.
Эскизы прикрепленных изображений