Механик08 (02.11.2011 12:13, просмотров: 284) ответил rezident на Прошу пояснений. У вас все-таки используется внешний кварц 7,3728МГц или вы планируете работать от DCO, настроенный на 8МГц? Если внешний кварц, то почему функция настройки в прерывании по вектору NMI вызывается только один раз при старте
Я хочу использовать внешний кварц 7,3728МГц, но если с ним что-то случится, то переключиться на DCO, так сказать в аварийном режиме. Как организовать калибровку в этом случае пока не знаю. С инициализацией BCSCTL3 после проверки ошибки LFXT1OF, Вы правы, напортачил. Теперь всё исправил.
#pragma vector = NMI_VECTOR
__root __interrupt void OSCFault (void) {
unsigned char i;
BCSCTL1 = XTS + CALBC1_8MHZ; // ACLK = LFXT1 = HF XTAL, DCOCLK=8MHz
DCOCTL = CALDCO_8MHZ;
BCSCTL2 = 0; //MCLK=DCO;
BCSCTL3 = LFXT1S1; // 3 – 16MHz crystal or resonator
do
{
IFG1 &= ~OFIFG; // Clear OSCFault flag
for (i = 0xFF; i > 0; i--); // Time for flag to set
}
while ((IFG1 & OFIFG)&i); // OSCFault flag still set?
if((BCSCTL3&LFXT1OF)==0){
BCSCTL2 = SELM_0 + SELS; // MCLK = DCO, SMCLK = LFXT1
IE1 |= OFIE;
rfstate=0; // все в порядке, ошибок нет
}else{
rfstate |= BIT1; //установка ошибки резонатора
BCSCTL1 = CALBC1_8MHZ;
BCSCTL2 = 0;
BCSCTL3 = LFXT1S_2;
do
{
IFG1 &= ~OFIFG; // Clear OSCFault flag
for (i = 0xFF; i > 0; i--); // Time for flag to set
}
while (IFG1 & OFIFG); // OSCFault flag still set?
UCA0CTL1 |= UCSWRST;
UCA0CTL1 |= UCSSEL1+UCSSEL0; //SMCLK
UCA0CTL0 = 0x00;
UCA0BR0 = 0xA0; // 8000000Hz/19200 = 0x01A0
UCA0BR1 = 0x01;
UCA0MCTL = 6<<1; // Modulation UCBRSx = 6
P3DIR |= 0x10;
P3SEL |= 0x30;
UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
IE2 |= UCA0RXIE;
}
}