В новом проекте решил использовать MSP430F5419. До этого "жил" на MSP430F149.
Исходные данные:
контроллер MSP430F5419 имеет два кварца: XT1 на 32кГц и XT2 на 8МГц(конденсаторы на землю по 22pF).
Порты настроены на служебное использование ножек, к которым подключены кварцы.
Ниже кусок кода, отвечающий за настройку работы UCS Module
CODE
UCSCTL0 = 0x00;
UCSCTL1 = DISMOD;//DCORSEL1+DCORSEL0;
UCSCTL2 = 0x00; //FLLN multiplier
UCSCTL3 = SELREF0+SELREF2;//+FLLREFDIV0;
UCSCTL5 = 0x00;
UCSCTL4 = SELA2+SELS2+SELM2;
UCSCTL6 = XT2DRIVE0+XTS;
UCSCTL8 = 0x00;
do{
UCSCTL7 &= ~XT2OFFG; // Clear OSCFault flag
for (i = 0xFFFF; i > 0; i--); // Time for flag to set
}
while (UCSCTL7 & XT2OFFG); // OSCFault flag still set?
UCSCTL4 = SELA0+SELA2+SELS0+SELS2+SELM0+SELM2;
UCSCTL1 = DISMOD;//DCORSEL1+DCORSEL0;
UCSCTL2 = 0x00; //FLLN multiplier
UCSCTL3 = SELREF0+SELREF2;//+FLLREFDIV0;
UCSCTL5 = 0x00;
UCSCTL4 = SELA2+SELS2+SELM2;
UCSCTL6 = XT2DRIVE0+XTS;
UCSCTL8 = 0x00;
do{
UCSCTL7 &= ~XT2OFFG; // Clear OSCFault flag
for (i = 0xFFFF; i > 0; i--); // Time for flag to set
}
while (UCSCTL7 & XT2OFFG); // OSCFault flag still set?
UCSCTL4 = SELA0+SELA2+SELS0+SELS2+SELM0+SELM2;
почитав умных людей добавил обработку сбоя работы кварца:
CODE
#pragma vector=UNMI_VECTOR
__interrupt void zx6(void)
{
if(UCSCTL7 & XT2OFFG){
Fault=1;//флаг, который обрабатывается в основном цикле программы
UCSCTL4 = SELA2+SELS2+SELM2;
}
}
__interrupt void zx6(void)
{
if(UCSCTL7 & XT2OFFG){
Fault=1;//флаг, который обрабатывается в основном цикле программы
UCSCTL4 = SELA2+SELS2+SELM2;
}
}
Основной цикл программы:
CODE
while(1){
if(Fault){
do{
UCSCTL7 &= ~XT2OFFG; // Clear OSCFault flag
for (i = 0xFFFF; i > 0; i--); // Time for flag to set
}while ((UCSCTL7 & XT2OFFG) != 0); // OSCFault flag still set?
UCSCTL4 = SELA0+SELA2+SELS0+SELS2+SELM0+SELM2;
Fault=0;
}
}
if(Fault){
do{
UCSCTL7 &= ~XT2OFFG; // Clear OSCFault flag
for (i = 0xFFFF; i > 0; i--); // Time for flag to set
}while ((UCSCTL7 & XT2OFFG) != 0); // OSCFault flag still set?
UCSCTL4 = SELA0+SELA2+SELS0+SELS2+SELM0+SELM2;
Fault=0;
}
}
Что меня смущает:
SMCLK и ACLK работают исправно и на ножках контроллера я вижу осцилографом честные 8МГц.
Но MCLK тактируется от DCO, как не боролся, переключение на тактирование от XT2 сделал после проверки стабильной работы кварца -- итог один, не переключается.
Ставил break point в немаскируемом прерывании -- туда не заходит ни разу.
Гуру, что я упустил?