MSP430 макросы для работы с GPIO + бонус: режим Open Drain

Вдохновившись макросами для работы с линиями ввода-вывода для STM32 уважаемого ZiB , написал похожие для MSP430. Данный набор макросов упрощает работу с линиями ввода-вывода, позволяет писать более читаемый код, исключает некоторые ошибки (например — попытка изменения состояния порта, настроенного на вход) и в качестве бонуса — добавляет эмуляцию режима «открытый сток» (Open Drain).

Присваиваем линии ввода-вывода имя

Для работы с линией ввода-вывода первым делом необходимо её объявить, присвоив ей имя, с которым мы будем дальше работать. Выглядит это так:
#define PIN_NAME PORT, PIN, MODE
где PORT — имя порта (P1, P2, P3, P4 и т.д.),
PIN — номер бита в порте (0, 1,… 6, 7),
MODE — режим работы линии.
Примеры объявлений:
#define BUTTON1 P1, 1, MODE_INPUT_PULL_UP
#define LED1    P1, 0, MODE_OUTPUT_PUSH_PULL_0
#define UARTTX  P4, 5, MODE_PERIPHERAL_FUNCTION
Обычно я завожу отдельный заголовочный файл, в котором объявляю все используемые в проекте GPIO, и в остальной программе обращаюсь к ним только по именам (LED1, BUTTON1, UARTTX и т.д.).

Режимы работы линии ввода-вывода

Доступные режимы работы (цифра в конце — состояние линии после инициализации):
MODE_INPUT_FLOATING — вход без подтягивающих резисторов,
MODE_INPUT_PULL_UP, MODE_INPUT_PULL_DOWN — вход с подтягивающими резисторами,
MODE_OUTPUT_PUSH_PULL_0, MODE_OUTPUT_PUSH_PULL_1 — выход в режиме push-pull,
MODE_OUTPUT_OPEN_DRAIN_0, MODE_OUTPUT_OPEN_DRAIN_1 — выход в режиме открытого стока,
MODE_PERIPHERAL_FUNCTION — линия используется модулем перифирии.

Доступные операции

С помощь макросов реализованы следующие команды:
PIN_CONFIGURATION(PIN_NAME) — настроить линию,
PIN_ON(PIN_NAME) — включить (установка лог. 1),
PIN_OFF(PIN_NAME) — выключить (установка лог. 0),
PIN_TOGGLE(PIN_NAME) — переключить состояние,
PIN_ISSET(PIN_NAME) — Проверить состояние, используется в конструкциях вида if(PIN_ISSET(PIN_NAME)){}

Как это реализовано

PIN_CONFIGURATION — в зависимости от выбранного режима работы настраиваются 4 регистра, отвечающие за ражим работы линии. Например:
#define _GPIO_CONFIGURATION_MODE_INPUT_FLOATING(PORT, PIN, MODE) \
{ \
    PORT##REN &= ~(1UL << PIN); \ 
    PORT##DIR &= ~(1UL << PIN); \
    PORT##OUT &= ~(1UL << PIN); \
    PORT##SEL &= ~(1UL << PIN); \
}

Похожим образом реализованы остальные функции:
#define _GPIO_PIN_ON_MODE_OUTPUT_PUSH_PULL_0(PORT, PIN, MODE) \
    { PORT##OUT |=  (1UL << PIN); }

#define _GPIO_PIN_ISSET_MODE_INPUT_FLOATING(PORT, PIN, MODE) \
    ( PORT##IN & (1UL << PIN) )

Для некоторых операций сделана проверка — например, если попытаться выполнить операцию PIN_ON() для порта, настроенного как INPUT_FLOATING, компилятор выдаст ошибку:
#define _GPIO_PIN_ON_MODE_INPUT_FLOATING(PORT, PIN, MODE) \
    { ##error Invalid operation }

Эмуляция режима OpenDrain

Для работы в режиме OpenDrain достаточно настроить порт на выход и установить его в логический 0, что будет соответствовать открытому на землю транзистору. После этого можно оперировать регистром направления (PORTxDIR) — настраивая его на вход транзистор «закрываем», настраивая на выход — «открываем». Для портов, настроенных в этот режим не реализована функция ISSET, т.к. не ясно с чем оперировать — с состоянием порта в микроконтроллере или с состоянием линии, к которой этот порт подключен. Если вдруг эти функции потребуются, их можно реализовать так:
#define _GPIO_PIN_ISSET_MODE_OUTPUT_OPEN_DRAIN_0(PORT, PIN, MODE) \
    { (~PORT##DIR) & (1UL << PIN) }
или так:
#define _GPIO_PIN_ISSET_MODE_OUTPUT_OPEN_DRAIN_0(PORT, PIN, MODE) \
    { PORT##IN & (1UL << PIN) }
  • +1
  • 04 ноября 2015, 00:13
  • arhiv_6
  • 1
Файлы в топике: gpio_macros.h.txt

Комментарии (28)

RSS свернуть / развернуть
Неужели народ позабыл про ARMы и ломанулся в степи и пустыни Техаса?=))
Количество постов о MSP430 приятно возрастает
+2
В свете последних тенденций, появление любых постов в сообществе — это приятно) Вряд ли кто-то забыл про АРМы, уже просто рассказывать нечего.
+1
Никогда не бывает мало! Я бы о АЦП в F030 почитал бы… уж больно разрозненная информация.
0
В каком смысле разрозненная? Референс мануал, даташит и эррату уже за основную информацию по мк не принято считать?)
0
Более чем! Но разрозненная в смысле статей по этому направлению… все не стыкуется между собой, полная анархия
0
я вот недавно поработал с RTC на FR серии, и был приятно удивлен )
ИМХО, архитектура MSP430 самая продуманная
0
Так RTC это отдельный периферийный блок, который можно по сути к любому ядру подключить. Причем здесь архитектура ядра MSP430? Или я чего-то непонимаю?
Я без вызова спрашиваю, реально интересно.
0
интересно то, насколько изящно и юзабельно реализован alarm
0
дело не только в RTC, справедливо для любых модулей. За многие годы TI действительно отточил камни до идеала, своих денег они стоят
+1
Если я все правильно понял, то на STM8L можно тоже самое делать. RTC на STM32 не смотрел, но не думаю что там сильно хуже.
Не знаю как конкретно ядро MSP430, но, чтоит отметить, что те IP блоки, которые TI использует в своих СБИС весьма добротно сделаны.
0
При всем уважении к STM если выбирать между STM8 и MSP430, предпочту по многим параметрам MSP430.
хотя бы потому, что для STM8 привязка к платформе Win вбита гвоздями, на Linux чем скомпилить с грехом пополам найдется, чем прошить тоже, а вот в плане отладки полный швах.
0
Не спорю. В полной мере я осознал скудность opensource возможностей компиляции и отладки stm8 лишь после того, как приобрел кучку stm8l152 и stm8s003 под все мелкие нужды. Если б я, когда думал чем аврки заменить, знал бы об этом семействе, то может быть и stm8 обошли бы меня стороной. А сейчас уже ничего не поделаешь, жаба задушит еще одно семейство осваивать.
Да и вообще, в последнее время не покидают шальные мысли забить на все эти 8/16 битки, и пересесть на попсовые АРМы — покроют все мои задачи гарантированно. Примерно как микроскоп — и гвоздь забить можно, и пылинки порасматривать.
+1
Как замена AVR может быть PSoC 4 кипарисовские. С опенсорсом там так же печально, но возможности интересные.
0
О них уже тоже думал, как раз Verilog и С являются для меня основными языками)
0
Если б я, когда думал чем аврки заменить, знал бы об этом семействе, то может быть и stm8 обошли бы меня стороной. А сейчас уже ничего не поделаешь, жаба задушит еще одно семейство осваивать.
А зачем ты их заменял, собственно? MSP430 по большей части дороже, чем AVR, и более спартанские притом. Так что если рассматривать STM8 как дешевую замену с достаточно богатым фаршем — то MSP430 ему не альтернатива.
+1
Хотелось мяса побольше, да подешевле, да чтоб с отладкой. А еще меня бесил мой usbasp с прошивкой avrdopper, который как-то криво работал под win7x64.

Про msp340 не берусь ничего утверждать, знаю о них поверхностно и только с хорошей стороны. Так что поверю тебе наслово)
0
Я MSP430 тоже знаю поверхностно, сейчас вроде камни появились помясистее, но когда я года 3 назад ими интересовался — за цену атмеги мона было купить камень с килобайтом флеша и аналоговым компаратором. Зато с отладкой, да. И вообще тогдашние камни выглядели довольно спартански.
0
да сейчас не дороже, что мелкие меги 48/88/168 что msp430g2553 — стоят почти одинаково.
особенно если по диджикеям/маузерам/фарнеллам смотреть.
периферия сделана аккуратно и красиво, только часто сильно разбросана по разным камням, то есть так как к маложоркости относятся серьёзно, то не особо есть МК в которых одновременно будет вся-вся всевозможная периферия. Всего msp430 различных контроллеров больше 500штук, а авров, с хмегами и пары сотен не наберётся. может потому и выглядят отдельные МК небогато.
ну и серия 5/6 пожирнее, а по стоимости не настолько оно дороже чтобы в любом более менее реальном устройстве на общую стоимость заметно повлиять.
0
Я с большим удовольствием соскочил на STM32, вернее на F0xx.
Цена их приятно радует, есть полный набор корпусов от 20 до 100 ног (не помню — может и больше) от МСПшек в плюс большой — количество таймеров, функционал тоже довольно таки на хорошем уровне! Есть конечно косяки серьезные (с SPIем я так и не подружился в STM32F030, но два юарта в STM32F042 + CAN и USB люто радуют). Да и по семейству потом код портировать на более мощный камень не составит труда.
З.Ы. При выборе камня главным были цена и наличие в ближайших магазинах. МСП тяжелее все таки купить чем STM (по крайней мере по поставщикам и радиомагазинам мне известным).
0
Это все принято называть макросами Волкова. Хотя, с неким развитием в виде описания режимов.
Кстати, в оригинальных МВ задавался ещё активный уровень пина (H/L) — очень удобно. То есть on() — это всегда включение, независимо от того, каким уровнем включается та или иная цепь.
0
Это все принято называть макросами Волкова
это еще откуда пошло?
0
Изначально это были макросы для AVR, опубликованные Аскольдом Волковым. Затем они подверглись разнообразным мутациям и преобразованиям на разных форумах (сахара, электроникс, етц), в т.ч. и здесь.
Были варианты унификации, например, от Сергея Борща (AVR+MSP430+ARM), но все равно все клоны обычно упоминают авторство первооткрывателя.
0
Стоп, т.е. если я сам, просто зная возможности языка и никуда не подглядывая, написал подобную вещь, то должен упоминать некоего первооткрывателя?
0
Требуйте официального признания двойного авторства=)) В истории науки случаев одновременной параллельной работы ученых разных стран над каким либо одинаковым открытием множество!
0
Типа Попов — Маркони, Котельников — Найквист?)
Просто странно применять к набору макросов термины открытие и пепвооткрыватель.
0
Необязательно ссылаться на авторство, ИМХО, просто удобное название, по которому сразу понятно, о чем идет речь.
0
Не обратил спазу внимание, но обычно макросы из нескольких операторов принято оформлять не просто в скобки, а в do{}while(0)
По сути то же самое, но более правильно.
Точно не помню, но по-моему, точка с запятой после фигурной скобки не на всех компиляторах прокатывает
+1
Не во всех конструкциях, от компилятора это не зависит. В частности «if(a) macro(); else smth();», ЕМНИП.
+1
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.