Это рукодство посвящено тому как запустить аппаратный UART на плате
MSP430-Launchpad. Мы будем рассматривать старый Launchpad для контроллеров
ValueLine. Он идёт в комплекте с двумя МК: MSP430G2452 и MSP430G2553.
Аппаратный UART имеется только в микроконтроллере MSP430G2553, поэтому
использовать будем его. Все действия я буду выполнять для ОС Linux, поэтому
используется компилятор msp430-gcc. Предполагается что читатель знаком с
базовыми принципами работы с MSP430 в ОС Linux, про которые можно прочитать
например в серии статей вот
здесь . Итак, под катом будет пример работающего кода для коммуникации
MSP430 по UART.
Плата Launchpad иммет в своём составе преобразователь USB/UART. За эту функцию отвечает микросхема TUSB3410. UART выведен на джамеперы, котрыми соединяется верхняя и нижняя чать платы. Далее линии RX и TX апаратного UART подведены к ножкам P1.1. и P1.2 микроконтроллера. Возможна установка джамперов для аппартного и программного UART. Для работы с аппаратным UART они должны быть установлены горизонтально, так как показано на картинке, иначе ничего не зарботает. К сожалению, разработчики платы Launchpad ввели ограничение на скорость работы UART. Поэтому номально работает эта плата только на скоростях ниже 9600 бод. Более высокие скорости не работают.
В ОС Linux Launchpad опознаётся как виртуальный последовательный порт /dev/ttyACM0. Вот вывод dmesg при поключении платы к USB:
В микроконтроллерах MSP430 за UART, SPI и I2C отвечает модуль USCI, и чтобы настроить UART нужно правильно установить его регистры. Возможна работа модуля только в одном из этих трёх режимах. То есть на одном канале можно задействовать или UART, или SPI, или I2C. За работу UART отвечает модуль UCA, а за I2C и SPI --- модуль UCB. Более подробно обо всех этих режимах можно прочитать в даташите
Теперь рассмотрим пример, реализующий работу с UART на скорости 9600 бод. Пример для работы с UART взят с сайта gpio.kaltpost.de и немного адаптирован. Автор оригинального пооекта --- Stefan Wendler. Пример состоит из четырёх файлов uart.h uart.c main.c и Makefle. Привожу их содержание с комментариями здесь.
Файл uart.h
Baud = (Fclk)/(UCA0BR0 + 256*UCA0BR1)
То есть в нашем случае для источника тактирования SMCLK тактовая частота Fclk=1 MHz=1000000 Hz. Получаем:
Baud = (1000000)/(104 + 256*0)=9615
Это примерно равно скорости 9600 бод. Для другой скорости нужно пересчитать значения данной пары регистров. Для типовых скоростей они указаны в даташите.
Файл main.c
Для проверки работы нашей программы требуется терминальная программа. Для начинающего можно использовать например простую и понятную программу CuteCOM. В ней нужно установить скорость и параметры порта. Она уже наверняка есть в вашем дистрибутиве Linux. В openSUSE её можно установить командой
MSP430 harduart
***************
Green led toggled
Red led toggled
Вот скриншот CuteCOM:
В следующей части будет рассказано, как управлять последовательным портом на плате Launchpad из консоли Linux.
Исходники для данного проекта доступны на Гитхабе.
Плата Launchpad иммет в своём составе преобразователь USB/UART. За эту функцию отвечает микросхема TUSB3410. UART выведен на джамеперы, котрыми соединяется верхняя и нижняя чать платы. Далее линии RX и TX апаратного UART подведены к ножкам P1.1. и P1.2 микроконтроллера. Возможна установка джамперов для аппартного и программного UART. Для работы с аппаратным UART они должны быть установлены горизонтально, так как показано на картинке, иначе ничего не зарботает. К сожалению, разработчики платы Launchpad ввели ограничение на скорость работы UART. Поэтому номально работает эта плата только на скоростях ниже 9600 бод. Более высокие скорости не работают.
В ОС Linux Launchpad опознаётся как виртуальный последовательный порт /dev/ttyACM0. Вот вывод dmesg при поключении платы к USB:
vvk@linux-bmx0:~/MSP430/msp430-examples/uart> dmesg|tail [ 6993.966349] usb 2-1.2: USB disconnect, device number 4 [ 6997.205366] usb 2-1.2: new full-speed USB device \ number 5 using ehci_hcd [ 6997.315988] usb 2-1.2: New USB device found, \ idVendor=0451, idProduct=f432 [ 6997.315999] usb 2-1.2: New USB device strings: \ Mfr=1, Product=2, SerialNumber=3 [ 6997.316005] usb 2-1.2: Product: Texas Instruments MSP-FET430UIF [ 6997.316012] usb 2-1.2: Manufacturer: Texas Instruments [ 6997.316017] usb 2-1.2: SerialNumber: 56FF49ABB1C31F4B [ 6997.322097] cdc_acm 2-1.2:1.0: This device cannot \ do calls on its own. It is not a modem. [ 6997.322107] cdc_acm 2-1.2:1.0: No union descriptor,\ testing for castrated device [ 6997.322151] cdc_acm 2-1.2:1.0: ttyACM0: USB ACM deviceЗдесь видим, что обнаружено новое USB-устройство и для него создан файл устройства виртуального последовательного порта /dev/ttyACM0.
В микроконтроллерах MSP430 за UART, SPI и I2C отвечает модуль USCI, и чтобы настроить UART нужно правильно установить его регистры. Возможна работа модуля только в одном из этих трёх режимах. То есть на одном канале можно задействовать или UART, или SPI, или I2C. За работу UART отвечает модуль UCA, а за I2C и SPI --- модуль UCB. Более подробно обо всех этих режимах можно прочитать в даташите
Теперь рассмотрим пример, реализующий работу с UART на скорости 9600 бод. Пример для работы с UART взят с сайта gpio.kaltpost.de и немного адаптирован. Автор оригинального пооекта --- Stefan Wendler. Пример состоит из четырёх файлов uart.h uart.c main.c и Makefle. Привожу их содержание с комментариями здесь.
Файл uart.h
#ifndef __UART_H #define __UART_H //Инициализация UART void uart_init(void); //Установить обработчик прерывания по приёму данных на UART void uart_set_rx_isr_ptr(void (*isr_ptr)(unsigned char c)); //Считать один символ с UART unsigned char uart_getc(); //Переслать один символ по UART void uart_putc(unsigned char c); //Переслать строку на UART void uart_puts(const char *str); #endifФайл uart.с Здесь собственно и производится настройко UART.
#include "msp430.h"
#include "uart.h"
#define RXD BIT1 // линии порта P1
#define TXD BIT2 // задействованные под UART
/**
* Callback handler for receive
*/
void (*uart_rx_isr_ptr)(unsigned char c);
void uart_init(void)
{
uart_set_rx_isr_ptr(0L);
P1SEL = RXD + TXD; // настраиваем линии порта
P1SEL2 = RXD + TXD;
UCA0CTL1 |= UCSSEL_2; // Источник тактирования UART --- SMCLK
UCA0BR0 = 104; // Настраиваем скорость 1MHz 9600
UCA0BR1 = 0; // 1MHz 9600
UCA0MCTL = UCBRS0; // Модуляция UCBRSx = 1
UCA0CTL1 &= ~UCSWRST; // Инициализируем модуль USCI
IE2 |= UCA0RXIE; // Разрешаем прерывания от UART.
}
void uart_set_rx_isr_ptr(void (*isr_ptr)(unsigned char c))
// Назначает обработчик прерывания от UART
{
uart_rx_isr_ptr = isr_ptr;
}
unsigned char uart_getc()
{
while (!(IFG2&UCA0RXIFG)); // Буфер приёмника USCI_A0 готов?
return UCA0RXBUF;
}
void uart_putc(unsigned char c)
{
while (!(IFG2&UCA0TXIFG)); // Буфер передатчика готов
UCA0TXBUF = c; // TX
}
void uart_puts(const char *str)
{
while(*str) uart_putc(*str++);
}
void usci0rx_isr(void) __attribute((interrupt(USCIAB0RX_VECTOR)));
void usci0rx_isr(void)
{
if(uart_rx_isr_ptr != 0L) { // Если пришёл символ
(uart_rx_isr_ptr)(UCA0RXBUF); // то вызывам обработчик
}
}
Нужно обратить внимание как настраивается скорость UART. Она задаётся
регистрами UCA0BR0 и UCA0BR1 и вычисляется по формуле:
Baud = (Fclk)/(UCA0BR0 + 256*UCA0BR1)
То есть в нашем случае для источника тактирования SMCLK тактовая частота Fclk=1 MHz=1000000 Hz. Получаем:
Baud = (1000000)/(104 + 256*0)=9615
Это примерно равно скорости 9600 бод. Для другой скорости нужно пересчитать значения данной пары регистров. Для типовых скоростей они указаны в даташите.
Файл main.c
#include "msp430.h"
#include "uart.h"
#define LED_RED BIT0
#define LED_GREEN BIT6
void uart_rx_isr(unsigned char c)
{
switch (c) { // Обработчик прерывания от UART
case '1': P1OUT ^=LED_RED; // Если пришла единица
uart_puts("Red led toggled\n"); // то переключим красный
break; // светодиод
case '2': P1OUT ^= LED_GREEN; // Если пришла двойка
uart_puts("Green led toggled\n"); // то переключим зелёный
break;
default: uart_putc(c);
break;
}
}
int main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Стопорим WatchDog Timer
BCSCTL1 = CALBC1_1MHZ; // Тактовая частота 1MHz
DCOCTL = CALDCO_1MHZ;
P1DIR = LED_RED + LED_GREEN; // Настраиваем GPIO
P1OUT = LED_RED + LED_GREEN; // Включим светодиоды
uart_init(); // Инициализируем UART
// register ISR called when data was received
uart_set_rx_isr_ptr(uart_rx_isr);
// Регистрируем обработчик прерывания по UART
__bis_SR_register(GIE);
uart_puts("\n***************\n"); // Напечатем приветствие
uart_puts("MSP430 harduart\n");
uart_puts("***************\n");
__bis_SR_register(LPM0_bits+GIE);
// уходим в спячку и ждём прерывания
for(;;);
}
Файл Makefile
CC=msp430-gcc LD=msp430-gcc MCU=msp430g2553 CFLAGS= -mmcu=$(MCU) -Wall -Os -c TARGET=demo-uart.elf $(TARGET): main.o uart.o $(LD) -mmcu=$(MCU) main.o uart.o -o $(TARGET) main.o: main.c $(CC) $(CFLAGS) main.c -o main.o uart.o: uart.c uart.h $(CC) $(CFLAGS) uart.c -o uart.o install: mspdebug rf2500 "prog $(TARGET)" clean: rm -f *.o *.elfВсе четыре файла нужно положить в один каталог. Компилируем проект командой make.
Для проверки работы нашей программы требуется терминальная программа. Для начинающего можно использовать например простую и понятную программу CuteCOM. В ней нужно установить скорость и параметры порта. Она уже наверняка есть в вашем дистрибутиве Linux. В openSUSE её можно установить командой
zypper in cutecomТеперь прошиваем плату командой make install и в итоге мы должны получить вот такой вывод в эмуляторе терминала. В качестве устройства последовательного порта в CuteCOM нужно указать /dev/ttyACM0 : ***************
MSP430 harduart
***************
Green led toggled
Red led toggled
Вот скриншот CuteCOM:
В следующей части будет рассказано, как управлять последовательным портом на плате Launchpad из консоли Linux.
Исходники для данного проекта доступны на Гитхабе.


т.е. в самом типовом случае применения микроконтроллеров: аппаратный интерфейс/конвертер USBSerial->GPIO/SPI вся линейка MSP430G в пролете т.к. не умеет аппаратно в UART+SPI?
ОтветитьУдалить