Перейти к содержанию
    

dsPIC33FJ128MC802 странности с переключением клока

Одна и та же плата. Один и тот же код переключения на внешний кварц в двух разных прошивках. XC16 1.31. MPLAB X 5.50

void ConfigureOscillator(void)
{
    RCONbits.SWDTEN = 0;    
    // Configure PLL prescaler, PLL postscaler, PLL divisor
    PLLFBD=41; // M = 32
    CLKDIVbits.PLLPOST=0; // N1 = 2
    CLKDIVbits.PLLPRE=0; // N2 = 2
    // Initiate Clock Switch to Primary Oscillator with PLL (NOSC = 0b011)
    __builtin_write_OSCCONH(0x03);
    __builtin_write_OSCCONL(0x01);
    // Wait for Clock switch to occur
    while (OSCCONbits.COSC != 0b011);
    // Wait for PLL to lock
    while(OSCCONbits.LOCK!=1) {};
}

В обеих прошивках вызывается первой строчкой в main().
Но первая прошивка работает нормально, а вторая - зависает на строчке ожидания готовности переключения источника клока - "while (OSCCONbits.COSC != 0b011);". Даже в новом пустом проекте, только со скопированной функцией переключения клока - не работает. А в старом проекте, сделанном в старой 4.х версии и XC16 1.24 и импортированной в 5.х - работает.
Совсем голову поломал, может, кто сможет подсказать, где может быть причина?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В отсуствии volatile у OSCCONbits и присуствии уровня оптимизации >0. Проверьте, что в системных хидерах написано по поводу OSCCONbits.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...