|
Поделитесь соображениями, как лучше на msp430f149 реализовать режим защиты от сбоя генерации основного кварца (допустим, он висит на XT2, а на LFXT1 висит часовой)? Нужно чтобы в такой ситуации прибор продолжал работать на максимальной скорости до стабилизации кварца (т.е. было прозрачным для программы) и чтобы все это занимало минимум ресурсов. Я написал следующий драфт. Вроде работает, но может кто выскажет какие-нибудь дополнительные соображения:
// This routine handles NMI
interrupt[NMI_VECTOR] void NMI_handler (void) {
// process oscillator fault - switch to DCO if XT2 is failed
if (IFG1&OFIFG) {
BCSCTL2=0; // ! not sure whether I need this
IFG1&=~OFIFG;
if (!(IFG1&OFIFG)) {
_BIC_SR(OSCOFF); // ! not sure whether I need following 3 lines as well
BCSCTL1=RSEL2+RSEL1+RSEL0;
BCSCTL2=SELM1+SELS;
}
}
return;
}
// This routine handles WDT (works as RTC)
interrupt[WDT_VECTOR] void WDT_handler (void) {
IE1=WDTIE|OFIE;
return;
}
void main(void) {
unsigned int i;
// configure watchdog timer
IE1|=WDTIE;
WDTCTL=WDT_ADLY_1000;
// configure DCO (it will be used in case of XT2 crystal failure)
DCOCTL=DCO2+DCO1+DCO0;
// configure LFXT1 (32KHz) and XT2 (8MHz) oscillators
_BIC_SR(OSCOFF);
BCSCTL1=RSEL2+RSEL1+RSEL0;
do {
IFG1&=~OFIFG;
for (i=0xff;i>0;i--);
}
while ((IFG1&OFIFG)!=0);
BCSCTL2=SELM1+SELS;
// enable some system interrupts
IE1|=OFIE;
_EINT();
...
}
E-mail: info@telesys.ru