MSP430, учимся программировать и отлаживать железо (часть 3)


    Возможно Вы уже не первый раз садитесь за программирование Вашего MSP430. Если это не так, то рекомендую ознакомиться с предыдущими статьями по данной тематике: часть 1, часть 2.
    В этой статье мы рассмотрим инструмент для графической настройки периферии нашего микроконтроллера — Grace, познакомимся с принципом работы watchdog и поработаем с виртуальным COM-портом (через программатор). Уже традиционно будет рассмотрен небольшой пример кода, и предоставлены все необходимые для понимания ссылки.



    Введение


    В первой статье я упоминал Code Composer Studio, от рассмотрения которого отказался, но недавно моё внимание, благодаря Соколову А.В., привлёк один плагин для неё — Graphical Peripheral Configuration Tool (Grace).

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

    Grace


    Скачать и установить этот инструмент можно вместе с Code Composer Studio v5 по следующей ссылке. Для этого потребуется зарегистрироваться на сайте Texas Instruments.

    После установки CCS выбираем Project→New CCS Project, в облати Project templates and examples выбираем Empty Project→Empty Grace (MSP430) Project, в области Device не забудьте указать микроконтроллер из списка.

    Как только появится экран «Grace — Welcome», нажимаем клавишу Device Overview. Перед Вами появится следующая картинка.

    Кликнув по конкретному устройству на ней, Вы перейдёте к его настройке, которую можно производить в нескольких режимах. Режимы могут отличаться для разных устройств, но обычно это Basic User, Power User и Registers. Basic User и Power User предназначены для быстрой настройки периферийного устройства интуитивно. Registers отображает список всех регистров устройства и позволяет менять их значения.

    Совет: в datasheet к микроконтроллеру не всегда содержится полная информация об интересующем устройстве, про все регистры и параметры обычно можно прочитать в файле MSP430xxxx Family User's Guide, который можно скачать на сайте Texas Instruments.

    Поскольку для работы я уже привык использовать Workbench, после завершения настройки, все конфигурационные данные требуется перенести туда. Для этого нажимаем Project→Build All, находим в папке проекта директорию /src/csl/, в ней и находятся все *.c файлы с конфигурацией каждого устройства.

    Пример кода


    Следующий код работает с USB-UART мостом встроенным в программатор, так же в код включено использование watchdog, но обо всём по порядку.
    1.  
    2. #include "msp430f2274.h"
    3. #include <string>
    4.  
    5. void UARTWriteString(string str);
    6.  
    7. bool watchdogReset = true;
    8.  
    9. void main(void)
    10. {
    11.   WDTCTL = WDT_MRST_32; // Watchdog автоматически
    12.                         // перезапустит систему через 32ms.
    13.  
    14.   BCSCTL1 = CALBC1_1MHZ; // Устанавливаем тактовую частоту Basic Clock System.
    15.   DCOCTL = CALDCO_1MHZ; // Устанавливаем тактовую
    16.                         // частоту Digital Controlled Oscillator.
    17.  
    18.   P3SEL = BIT4 + BIT5; // Выбираем функцию P1.4/P1.5 как TXD/RXD для UART.
    19.  
    20.   UCA0CTL1 |= UCSWRST; // Этот бит блокирует работу прерываний от UART и работу 
    21.                        // сдвигового регистра чтобы не мешать
    22.                        // настройке (грубо говоря отключает UART).
    23.   UCA0CTL1 |= UCSSEL_2; // Наш UART будет работать от 
    24.                         // SMCLK (Sub-main clock), тоесть от 1MHZ.
    25.   UCA0BR0 = 0x68; // Делитель частоты для SMCLK (1000000 / 9600).
    26.   UCA0BR1 = 0x00;
    27.   UCA0MCTL = 0x04; // Определяет маску модуляции.
    28.                   // Это помогает минимизировать ошибки.
    29.   UCA0CTL1 &= ~UCSWRST; // Включаем UART обратно.
    30.  
    31.   P1DIR |= BIT0; // Настройка светодиодов.
    32.   P1DIR |= BIT1;
    33.   P1OUT &= ~BIT0;
    34.   P1OUT &= ~BIT1;
    35.  
    36.   UARTWriteString("---Привет, Хабр!---");
    37.  
    38.   unsigned char data;
    39.   while(true)
    40.   {
    41.     while (!(IFG2&UCA0RXIFG)) // Проверка готовности буфера приёма.
    42.       if(watchdogReset)
    43.         WDTCTL = WDTPW + WDTCNTCL; // Сброс таймера watchdog в ноль.
    44.     data = UCA0RXBUF;
    45.     if(data == 0x01)
    46.     {
    47.       UARTWriteString("---Погасить зеленый светодиод.---");
    48.       P1OUT &= ~BIT1;
    49.     }
    50.     else if(data == 0x02)
    51.     {
    52.       UARTWriteString("---Зажечь зеленый светодиод.---");
    53.       P1OUT |= BIT1;
    54.     }
    55.     else if(data == 0x03)
    56.     {
    57.       UARTWriteString("---Переключить состояние красного светодиода.---");
    58.       P1OUT ^= BIT0;
    59.     }
    60.     else
    61.     {
    62.       UARTWriteString("---Принятые данные не соответствуют.---");
    63.       watchdogReset = false;
    64.     }
    65.   }
    66. }
    67.  
    68. void UARTWriteString(string str)
    69. {
    70.   int strSize = str.length();
    71.   for(int i = 0; i < strSize; i++)
    72.   {
    73.     WDTCTL = WDTPW + WDTCNTCL; // Сброс таймера watchdog в ноль.
    74.     while (!(IFG2&UCA0TXIFG)); // Проверка готовности буфера отправки.
    75.     UCA0TXBUF = str[i];
    76.   }
    77. }
    78.  

    Для работы с COM-портом со стороны компьютера нам потребуется программное обеспечение, мой выбор пал на COM Port Toolkit. Что именно выберите Вы — не имеет значения.

    Небольшое видео, которое позволит понять что именно делает пример.


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

    1. Для расчёта значений UCA0BR0, UCA0BR1 и UCA0MCTL существует неплохой онлайн калькулятор.
    2. SMCLK — сигнал, который поступает из внешнего резонатора (если установлен) или из DCO с применением делителей 1, 2, 4 или 8. Используется как тактовый сигнал для периферии.
    3. В примере, watchdog используется не совсем по назначению, данный код лишь объясняет принцип его работы. Смысл заключается в том, что если Ваша программа в течении 32ms (WDT_MRST_32) не установит бит WDTCNTCL в регистре WDTCTL в единицу, то система будет перезагружена. Watchdog требуется для предотвращения зависания Вашего программного обеспечения.
    4. Регистр WDTCTL имеет 16 бит, первые 8 необходимо устанавливать в WDTPW каждый раз когда производится запись в него. Это механизм защиты регистра от случайной записи в случае программных сбоев.
    5. Описание и настройка Basic Clock System это повод для целой статьи, пока следует понять, что MSP430 имеет очень гибкую систему тактовых генераторов, которую, в упрощенном виде, можно настроить с помощью Grace.
    6. Использование такого метода отладки сильно замедляет работу программы в целом, однако это позволяет достоверно определить порядок выполнения кода, в том числе в обработчиках прерываний.


    Заключение


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

    Я надеюсь, что эта статья оказалась полезна тебе, читатель.
    Поделиться публикацией

    Комментарии 0

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

    Самое читаемое