Проблемы с часами MSP430 после сброса

Я использую следующую процедуру для настройки часов моего микроконтроллера MSP430 (msp430g2231):

void configure_clock(void) {
if (CALBC1_1MHZ == 0xFF || CALDCO_1MHZ == 0xFF) { // Checks the clock constants
        while(TRUE); // If callibration constants are erased, TRAP!
    }

    BCSCTL1 |= CALBC1_1MHZ; // Sets DCO range
    DCOCTL |= CALDCO_1MHZ; // Set DCO step and modulation

    BCSCTL1 &= ~(XTS | XT2OFF); // Disables XT2 and sets low frequency mode
    BCSCTL3 |= (LFXT1S_0 | XCAP_3); // Selects LFXT1 crystal with 12,5pF

    do {
        IFG1 &= ~OFIFG;
        __delay_cycles(1000);
    } while (IFG1 & OFIFG); // Waits until crystal stabilizes

    BCSCTL2 |= (SELM_2 | SELS); // Selects SMCLK and MCLK from LFXT1CLK
}

Проблема в том, что при первом запуске кода (сразу после включения микроконтроллера) все работает, как и ожидалось, и я получаю тактовую частоту 32768 кГц. Но если я нажму кнопку сброса на плате (MSP430 Launchpad), часы не будут работать правильно, код будет выполняться очень медленно (примерно 10 раз или около того). Есть идеи по настройке часов?

Спасибо!

Пере


person Pere Tuset    schedule 05.11.2011    source источник


Ответы (2)


Во-первых, вы можете посмотреть на напряжение питания. Если во время запуска есть какой-то всплеск, DCO не будет работать. В этом случае попробуйте использовать задержку непосредственно перед выравниванием значений по BCSCTL1.

   __delay_cycles(10000);
   BCSCTL1 = CALBC1_1MHZ; // Sets DCO range

Это гарантирует, что всплеск запуска будет подавлен.

Следующим подозреваемым будет развязка на вашей целевой доске. Я имею в виду конденсатор на VCC, а также тот, который используется в сбросе. TI рекомендует 1 нФ-2 нФ для линии сброса и 0,1 мкФ для VCC. Но если вы используете LaunchPad в качестве платформы, это не должно быть проблемой.

Также для присваивания значения калибровки используйте операторы присваивания, а не логические операторы. Поскольку другие значения, равные 0, являются значением по умолчанию.

  BCSCTL1 = CALBC1_1MHZ;               // Set DCO
  DCOCTL = CALDCO_1MHZ;

Если вы планируете запустить XT2, он недоступен в G2231. Это LFXT1 напрямую. Вам не нужна явная инициализация для работы кристалла 32,768 кГц. Он просто работает, когда вы включаете питание. Таким образом, дополнительный этап инициализации не требуется.

Чтобы получить более качественную помощь, посмотрите slac463a, где приведены примеры программ, связанных с настройкой часов. .

person Boseji    schedule 10.11.2011

Единственное, что я могу предложить с вашим кодом, приведено ниже. Решат ли они вашу проблему, я не знаю, так как кажется странным, что первый запуск в порядке, но после сброса это не так. Вы получаете доступ к конфигурации часов где-либо еще? Какой код вы называете при сбросе?

Вы всегда используете битовые манипуляции для включения или исключения значений в регистры. Вы должны начать с известного значения, а затем настроить биты оттуда, иначе вы можете включить биты из предыдущего состояния. Например, вместо:

BCSCTL1 |= CALBC1_1MHZ;
BCSCTL1 &= ~(XTS | XT2OFF);

Вы можете установить его в окончательное значение, выполнив что-то вроде этого:

BCSCTL1 = XT2OFF | (CALBC1_1MHZ & 0x0F);

Другое предложение состоит в том, что XT2OFF должен быть установлен, чтобы выключить XT2. Вы очищаете бит, поэтому оставляете его включенным. Это противоречит вашему комментарию, поэтому может быть ошибкой.

person tinman    schedule 08.11.2011