Как вы определяете, что ничего не выводится? Осциллографом выход смотрели или в программе-терминале ничего не принимается? По свечению светодиода в данном случае вы ничего не поймете, т.к. темп вывода на скорости 9600 будет давать ему подсветку постоянно. В моем первоначальном примере вепеключение светодиода было синхронизирован по времени с таймаутом в 0,5с, что позволяло определить работоспособность. А у вас - нет.
Я нашел еще одну свою ошибку в инициализации FLL. Битом SCFQ_M модуляция
выключается. И-за этого частота DCO может отличаться от расчетной. Попробуйте еще раз вот такой пример.
CODE
#include <msp430x471x7.h>
#include <stdint.h>
#define FREQMCLK 9830400UL //MCLK
#define FREQSMCLK 9830400UL //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;
}
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;
uint32_t lTmp;
//Инициализация системы тактирования
FLL_CTL1 = XT2OFF; //D=2, MCLK=fDCOCLK/D, SMCLK=fDCOCLK/D, ACLK=LFXT/1, XT2=off
FLL_CTL2 = XT2S1; //для работы XT2=16МГц
FLL_CTL0 = XCAP11PF; //XT1=LF, DCO/D, XCAP=11пФ
while ((FLL_CTL0 & LFOF) != 0); //ждем готовности генератора 32768Гц
SCFI0 = FLLD_4 | FN_3; //D=4, fDCOCLK = 2.2-17Mhz
SCFQCTL = (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
do
{ IFG1 &= ~OFIFG;
} while ((IFG1&OFIFG) != 0); //ждем готовности всей системы тактирования
//Инициализация 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/10UL); //период около 100мс
TACCTL0 = CCIE; //разр. прерывание от CCR0
TACCTL1 = 0;
TACCTL2 = 0;
TACTL |= MC_1; //запустить таймер в режиме CountUP
//Инициализация LED
P5DIR |= BIT7;
P5SEL &= ~BIT7;
P5OUT &= ~BIT7;
idx=0;
tickStamp = tick_ms; //зафиксировать временную метку
__enable_interrupt(); //разрешим прерывания
for (;;)
{ if ((tick_ms - tickStamp) >= BLINK_TIME_MS)//полупериод мерцания закончился?
{ tickStamp = tick_ms; //запомним новое значение метки времени
if ((UC1IFG & UCA1TXIFG) != 0)//буфер передатчика готов?
{ UCA1TXBUF = uart_buf[idx]; //вывод текущего символа
P5OUT |= BIT7; //включаем LED
if (idx < (sizeof(uart_buf)-1))//увеличение индекса
idx += 1;
else
idx = 0;
}
else
P5OUT &= ~BIT7; //выключаем LED
}
}
}
#pragma vector=TIMERA0_VECTOR
#pragma type_attribute=__interrupt
void TimerA0_ISR (void)
{
tick_ms += TICK_MS_ADDVAL; //инкремент счтечика тиков [мс]
}
Кстати, насчет ESR часового кварца. В
errata присутствует описание бага XOSC8, про который я упоминал выше.
Цитата
XOSC8 LFXT1 Module
Function ACLK failure when crystal ESR is below 40 kΩ
Description When ACLK is sourced by a low-frequency crystal with an ESR below 40 kΩ, the duty
cycle of ACLK may fall below the specification; the OFIFG may become set or, in some
instances, ACLK may stop completely.
Workaround See the application report XOSC8 Guidance (
SLAA423) for information regarding
working with this erratum.