Проблемы с часами MSP430 после сброса - PullRequest
0 голосов
/ 05 ноября 2011

Я использую следующую процедуру для настройки часов моего микроконтроллера 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 раз или около того).Есть идеи по настройке часов?

Спасибо!

Пере

Ответы [ 2 ]

1 голос
/ 10 ноября 2011

Сначала вы можете посмотреть на напряжение питания.В случае, если во время запуска наблюдается скачок, 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 примеры программного обеспечения, связанные с настройкой часов.

0 голосов
/ 08 ноября 2011

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

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

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

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

BCSCTL1 = XT2OFF | (CALBC1_1MHZ & 0x0F);

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

...