Порты ввода-вывода: часть 1

Программирование STM32. Часть 1. GPIO, порты ввода-вывода STM32

Порты ввода-вывода: часть 1

Недавно коллега меня подсадил на идею создания умного дома, я даже успел заказать себе десятки разных датчиков. Встал вопрос о выборе Микроконтроллера (далее МК) или платы. После некоторых поисков нашёл несколько вариантов.

Среди них были и Arduino (включая его клоны, один из которых себе заказал ради того, чтобы просто побаловаться) и Launchpad, но всё это избыточно и громоздко (хотя в плане программирования гораздо проще, но тему холиваров поднимать не буду, у каждого свои вкусы). В итоге решил определяться не с готовой платой, а взять только МК и делать всё с нуля.

В итоге выбирал между Atmel ATtiny (2313), Atmel ATmega (решил отказаться т.к. не смог найти за адекватные деньги), STM32 (Cortex на ядре ARM). С тинькой я уже успел побаловаться, так что взял себе STM32VL-Discovery. Это можно назвать вступлением к циклу статей по STM32.

Оговорюсь сразу, автором большинства этих статей буду являться не я, т.к. сам только познаю, здесь я публикую их в первую очередь для себя, чтоб удобнее было искать если что-то забуду. И так поехали!

Общие сведения

Микроконтроллеры семейства STM32 содержат в своём составе до семи 16-разрядных портов ввода-вывода c именами от PORTA до PORTG. В конкретной модели микроконтроллера без исключений доступны все выводы портов, общее количество которых зависит от типа корпуса и оговорено в DataSheet на соответствующее подсемейство.

Для включения в работу порта x необходимо предварительно подключить его к шине APB2 установкой соответствующего бита IOPxEN в регистре разрешения тактирования периферийных блоков RCC_APB2ENR:

RCC->APB2ENR |= RCC_APB2ENR_IOPxEN; // Разрешить тактирование PORTx.

Управление портами STM32 осуществляется при помощи наборов из семи 32-разрядных регистров:

  • GPIOx_CRL, GPIOx_CRH – задают режимы работы каждого из битов порта в качестве входа или выхода, определяют конфигурацию входных и выходных каскадов.
  • GPIOx_IDR – входной регистр данных для чтения физического состояния выводов порта x.
  • GPIOx_ODR– выходной регистр осуществляет запись данных непосредственно в порт.
  • GPIOx_BSRR – регистр атомарного сброса и установки битов порта.
  • GPIOx_BSR – регистр сброса битов порта.
  • GPIOx_LCKR – регистр блокировки конфигурации выводов.

Режимы работы выводов GPIO

Режимы работы отдельных выводов определяются комбинацией битов MODEy[1:0] и CNFy[1:0] регистров GPIOx_CRL и GPIOx_CRH (здесь и далее: x-имя порта, y- номер бита порта).

GPIOx_CRL — регистр конфигурации выводов 0…7 порта x:

Структура регистра GPIOx_CRH аналогична структуре GPIOx_CRL и предназначена для управления режимами работы старших выводов порта (биты 8…15).

Биты MODEy указанных регистров определяют направление вывода и ограничение скорости переключения в режиме выхода:

  • MODEy[1:0] = 00: Режим входа (состояние после сброса);
  • MODEy[1:0] = 01: Режим выхода, максимальная скорость – 10МГц;
  • MODEy[1:0] = 10: Режим выхода, максимальная скорость – 2МГц;
  • MODEy[1:0] = 11: Режим выхода, максимальная скорость – 50МГц.

Биты CNF задают конфигурацию выходных каскадов соответствующих выводов:

в режиме входа:

  • CNFy[1:0] = 00: Аналоговый вход;
  • CNFy[1:0] = 01: Вход в третьем состоянии (состояние после сброса);
  • CNFy[1:0] = 10: Вход с притягивающим резистором pull-up (если PxODR=1) или pull-down (если PxODR=0);
  • CNFy[1:0] = 11: Зарезервировано.

в режиме выхода:

  • CNFy[1:0] = 00: Двухтактный выход общего назначения;
  • CNFy[1:0] = 01: Выход с открытым стоком общего назначения;
  • CNFy[1:0] = 10: Двухтактный выход с альтернативной функцией;
  • CNFy[1:0] = 11: Выход с открытым стоком с альтернативной функцией.

С целью повышения помехоустойчивости все входные буферы содержат в своём составе триггеры Шмидта. Часть выводов STM32, снабженных защитными диодами, соединёнными с общей шиной и шиной питания, помечены в datasheet как FT (5V tolerant) — совместимые с напряжением 5 вольт.

Защита битов конфигурации GPIO

Для защиты битов в регистрах конфигурации от несанкционированной записи в STM32 предусмотрен регистр блокировки настроек GPIOx_LCKR
GPIOx_LCKR — регистр блокировки настроек вывода порта:

Для защиты настроек отдельного вывода порта необходимо установить соответствующий бит LCKy. После чего осуществить последовательную запись в разряд LCKK значений «1” — «0” — «1” и две операции чтения регистра LCKR, которые в случае успешной блокировки дадут для бита LCKK значения «0” и «1” . Защита настроечных битов сохранит своё действие до очередной перезагрузки микроконтроллера.

Файл определений для периферии микроконтроллеров STM32 stm32f10x.h определяет отдельные группы регистров, объединённые общим функциональным назначением (в том числе и GPIO), как структуры языка Си, а сами регистры как элементы данной структуры. Например:

GPIOC->BSRR – регистр BSRR установки/сброса порта GPIOC.
Воспользуемся определениями из файла stm32f10x.h для иллюстрации работы с регистрами ввода-вывода микроконтроллера STM32F100RB установленного в стартовом наборе STM32VLDISCOVERY:

#include «stm32F10x.h» u32 tmp; int main (void) { RCC->APB2ENR |= RCC_APB2ENR_IOPCEN; // Разрешить тактирование PORTC. GPIOC->CRH |= GPIO_CRH_MODE8; // Вывод светодиода LED4 PC8 на выход. GPIOC->CRH &=~GPIO_CRH_CNF8; // Двухтактный выход на PC8. GPIOC->CRH |= GPIO_CRH_MODE9; // Вывод светодиода LED3 PC9 на выход. GPIOC->CRH &=~GPIO_CRH_CNF9; // Двухтактный выход на PC9. GPIOA->CRL&=~GPIO_CRL_MODE0; // Кнопка «USER» PA0 — на вход. // Заблокировать настройки выводов PC8, PC9. GPIOC->LCKR = GPIO_LCKR_LCK8|GPIO_LCKR_LCK9| GPIO_LCKR_LCKK; GPIOC->LCKR = GPIO_LCKR_LCK8|GPIO_LCKR_LCK9; GPIOC->LCKR = GPIO_LCKR_LCK8|GPIO_LCKR_LCK9| GPIO_LCKR_LCKK; tmp=GPIOC->LCKR; tmp=GPIOC->LCKR; }

Запись и чтение GPIO

Для записи и чтения портов предназначены входной GPIOx_IDR и выходной GPIOx_ODR регистры данных.

Запись в выходной регистр ODR порта настроенного на вывод осуществляет установку выходных уровней всех разрядов порта в соответствии с записываемым значением. Если вывод настроен как вход с подтягивающими резисторами, состояние соответствующего бита регистра ODR активирует подтяжку вывода к шине питания (pull-up, ODR=1) или общей шине микроконтроллера (pull-down, ODR=0).

Чтение регистра IDR возвращает значение состояния выводов микроконтроллера настроенных как входы:

// Если кнопка нажата (PA0=1), установить биты порта C, иначе сбросить. if (GPIOA->IDR & GPIO_IDR_IDR0) GPIOC->ODR=0xFFFF; else GPIOC->ODR=0x0000;

Сброс и установка битов порта

Для атомарного сброса и установки битов GPIO в микроконтроллерах STM32 предназначен регистр GPIOx_BSRR.

Традиционный для архитектуры ARM способ управления битами регистров не требующий применения операции типа «чтение-модификация-запись” позволяет устанавливать и сбрасывать биты порта простой записью единицы в биты установки BS (BitSet) и сброса BR (BitReset) регистра BSRR. При этом запись в регистр нулевых битов не оказывает влияния на состояние соответствующих выводов.

GPIOx_BSRR – регистр сброса и установки битов порта:

GPIOC->BSRR=GPIO_BSRR_BS8|GPIO_BSRR_BR9; // Зажечь LED4 (PC8), погасить LED3.
GPIOC->BSRR=GPIO_BSRR_BS9|GPIO_BSRR_BR8; // Зажечь LED3 (PC9), погасить LED4.

Альтернативные функции GPIO и их переназначение (remapping)
Практически все внешние цепи специального назначения STM32 (включая выводы для подключения кварцевых резонаторов, JTAG/SWD и так далее) могут быть разрешены на соответствующих выводах микроконтроллера, либо отключены от них для возможности их использования в качестве выводов общего назначения. Выбор альтернативной функции вывода осуществляется при помощи регистров с префиксом «AFIO”_.
Помимо этого регистры AFIO_ позволяют выбирать несколько вариантов расположения специальных функций на выводах микроконтроллера. Это в частности относится к выводам коммуникационных интерфейсов, таймеров (регистры AFIO_MAPR), выводам внешних прерываний (регистры AFIO_EXTICR) и т. д.

Подробнее смотрите документы «Reference manual” на соответствующую подгруппу микроконтроллеров.

Проекты к статье:

Для управления GPIO STM32 Вы можете применить макросы написанные как альтернативу далеко не оптимальным по мнению многих библиотекам от ST: gpio_emcu.h

Дополнительный материал:

Другие части

Источник: https://ergoz.ru/programmirovanie-stm32-chast-1-gpio-portyi-vvoda-vyivoda-stm32/

STM32F1. Часть 1. GPIO, порты ввода-вывода STM32

STM32F1. Часть 1. GPIO, порты ввода-вывода STM32ПодробностиКатегория: STM32F1 Cortex M3Опубликовано 09.12.2010 22:00Микроконтроллеры семейства STM32 содержат в своём составе до семи 16-разрядных портов ввода-вывода c именами от PORTA до PORTG.

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

Для включения в работу порта x необходимо предварительно подключить его к шине APB2 установкой соответствующего бита IOPxEN в регистре разрешения тактирования периферийных блоков RCC_APB2ENR:

RCC->APB2ENR |= RCC_APB2ENR_IOPxEN; // Разрешить тактирование PORTx.

Управление портами STM32 осуществляется при помощи наборов из семи 32-разрядных регистров:

GPIOx_CRL, GPIOx_CRH – задают режимы работы каждого из битов порта в качестве входа или выхода, определяют конфигурацию входных и выходных каскадов.

GPIOx_IDR – входной регистр данных для чтения физического состояния выводов порта x.
GPIOx_ODR – выходной регистр осуществляет запись данных непосредственно в порт.
GPIOx_BSRR – регистр атомарного сброса и установки битов порта.
GPIOx_BSR – регистр сброса настроек битов порта.
GPIOx_LCKR – регистр блокировки конфигурации выводов.

§ Режимы работы выводов GPIO

Режимы работы отдельных выводов определяются комбинацией битов MODEy[1:0] и CNFy [1:0] регистров GPIOx_CRL и GPIOx_CRH (здесь и далее: x-имя порта, y- номер бита порта). GPIOx_CRL — регистр конфигурации выводов 0…7 порта x:
Структура регистра GPIOx_CRH аналогична структуре GPIOx_CRL и предназначена для управления режимами работы старших выводов порта (биты 8…15). Биты MODEy указанных регистров определяют направление вывода и ограничение скорости переключения в режиме выхода:MODEy[1:0] = 00 — Режим входа (состояние после сброса); MODEy[1:0] = 01 — Режим выхода, максимальная скорость – 10МГц; MODEy[1:0] = 10 — Режим выхода, максимальная скорость – 2МГц;

MODEy[1:0] = 11 — Режим выхода, максимальная скорость – 50МГц.

Биты CNF задают конфигурацию выходных каскадов соответствующих выводов: в режиме входа:CNFy[1:0] = 00: Аналоговый вход; CNFy[1:0] = 01: Вход в третьем состоянии (состояние после сброса); CNFy[1:0] = 10: Вход с притягивающим резистором pull-up (если PxODR=1) или pull-down (если PxODR=0);

CNFy[1:0] = 11: Зарезервировано.

в режиме выхода:CNFy[1:0] = 00: Двухтактный выход общего назначения; CNFy[1:0] = 01: Выход с открытым стоком общего назначения; CNFy[1:0] = 10: Двухтактный выход с альтернативной функцией;

CNFy[1:0] = 11: Выход с открытым стоком с альтернативной функцией.

С целью повышения помехоустойчивости все входные буферы содержат в своём составе триггеры Шмидта. Часть выводов STM32, снабженных защитными диодами, соединёнными с общей шиной и шиной питания, помечены в datasheet как FT (5V tolerant) — совместимые с напряжением 5 вольт.

§ Защита битов конфигурации GPIO

Для защиты битов в регистрах конфигурации от несанкционированной записи в STM32 предусмотрен регистр блокировки настроек GPIOx_LCKR: GPIOx_LCKR — регистр блокировки настроек вывода порта x:Для защиты настроек отдельного вывода порта необходимо установить соответствующий бит LCKy. После чего осуществить последовательную запись в разряд LCKK значений «1” — «0” — «1” и две операции чтения регистра LCKR, которые в случае успешной блокировки дадут для бита LCKK значения «0” и «1” . Защита настроечных битов сохранит своё действие до очередной перезагрузки микроконтроллера. Файл определений для периферии микроконтроллеров STM32 stm32f10x.h определяет отдельные группы регистров, объединённые общим функциональным назначением (в том числе и GPIO), как структуры языка Си, а сами регистры как элементы данной структуры. Например: GPIOC->BSRR – регистр BSRR установки/сброса порта GPIOC. Воспользуемся определениями из файла stm32f10x.h для иллюстрации работы с регистрами ввода-вывода микроконтроллера STM32F100RB установленного в стартовом наборе STM32DISCOVERY:#include «stm32F10x.h» u32 tmp; int main (void) { RCC->APB2ENR |= RCC_APB2ENR_IOPCEN; // Разрешить тактирование PORTC. GPIOC->CRH |= GPIO_CRH_MODE8; // Вывод светодиода LED4 PC8 на выход. GPIOC->CRH &=~GPIO_CRH_CNF8; // Двухтактный выход на PC8. GPIOC->CRH |= GPIO_CRH_MODE9; // Вывод светодиода LED3 PC9 на выход. GPIOC->CRH &=~GPIO_CRH_CNF9; // Двухтактный выход на PC9. GPIOA->CRL&=~GPIO_CRL_MODE0; // Кнопка «USER» PA0 — на вход. // Заблокировать настройки выводов PC8, PC9. GPIOC->LCKR = GPIO_LCKR_LCK8|GPIO_LCKR_LCK9|GPIO_LCKR_LCKK; GPIOC->LCKR = GPIO_LCKR_LCK8|GPIO_LCKR_LCK9; GPIOC->LCKR = GPIO_LCKR_LCK8|GPIO_LCKR_LCK9|GPIO_LCKR_LCKK; tmp=GPIOC->LCKR; tmp=GPIOC->LCKR;

}

Для записи и чтения портов предназначены входной GPIOx_IDR и выходной GPIOx_ODR регистры данных. Запись в выходной регистр ODR порта настроенного на вывод осуществляет установку выходных уровней всех разрядов порта в соответствии с записываемым значением.

Если вывод настроен как вход с подтягивающими резисторами, состояние соответствующего бита регистра ODR активирует подтяжку вывода к шине питания (pull-up, ODR=1) или общей шине микроконтроллера (pull-down, ODR=0).

Чтение регистра IDR возвращает значение состояния выводов микроконтроллера настроенных как входы:

// Если кнопка нажата (PA0=1), установить биты порта C, иначе сбросить.
if (GPIOA->IDR & GPIO_IDR_IDR0) GPIOC->ODR=0xFFFF; else GPIOC->ODR=0x0000;

§ Сброс и установка битов порта

Для атомарного сброса и установки битов GPIO в микроконтроллерах STM32 предназначен регистр GPIOx_BSRR. Традиционный для архитектуры ARM способ управления битами регистров не требующий применения операции типа «чтение-модификация-запись” позволяет устанавливать и сбрасывать биты порта простой записью единицы в биты установки BS (BitSet) и сброса BR (BitReset) регистра BSRR. При этом запись в регистр нулевых битов не оказывает влияния на состояние соответствующих выводов. GPIOx_BSRR – регистр сброса и установки битов порта:

GPIOC->BSRR=GPIO_BSRR_BS8|GPIO_BSRR_BR9; // Зажечь LED4 (PC8), погасить LED3.
GPIOC->BSRR=GPIO_BSRR_BS9|GPIO_BSRR_BR8; // Зажечь LED3 (PC9), погасить LED4.

§ Альтернативные функции GPIO и их переназначение (remapping)

Практически все внешние цепи специального назначения STM32 (включая выводы для подключения кварцевых резонаторов, JTAG/SWD и так далее) могут быть разрешены на соответствующих выводах микроконтроллера, либо отключены от них для возможности их использования в качестве выводов общего назначения. Выбор альтернативной функции вывода осуществляется при помощи регистров с префиксом «AFIO_”. Помимо этого регистры AFIO_ позволяют выбирать несколько вариантов расположения специальных функций на выводах микроконтроллера. Это в частности относится к выводам коммуникационных интерфейсов, таймеров (регистры AFIO_MAPR), выводам внешних прерываний (регистры AFIO_EXTICR) и т. д. Подробнее смотрите документы «Reference manual” на соответствующую подгруппу микроконтроллеров.

§ Макросы управления портами, проекты к статье

Не хочется критиковать стандартную библиотеку «STM32F10x Standard Peripherals Library» от STM, ведь то, что она есть — уже хорошо. Но некоторые операции с использованием её функций кажутся слишком громоздкими.

В качестве альтернативы вы можете использовать простые и эффективные макросы, написанные мной для управления портами STM32F1 ⇒ gpio_emcu.zip

Проекты к статье:

µVision 4.13a ⇒ STM32GPIO_emcu_uV.rar

IAR ARM 6.0 ⇒ STM32GPIO_emcu_iar.rar
IAR ARM 6.21 ⇒ STM32GPIO_emcu_iar_V6.21.rar

Далее ⇒ Часть 2. Система тактирования STM32.

Источник: http://eugenemcu.nichost.ru/articles/stm32f1/126-stm32-gpio

Порты ввода-вывода

Порты ввода-вывода 

Порт ввода-вывода – логическое объединение сигнальных линий, через которое принимаются и передаются данные.
Каждая линия порта, как правило, обозначается как Pnx, где

  • n – обозначение порта;
  • x – номер бита (линии) в порте.

Каждый порт ввода-вывода обслуживают как минимум 3 служебных регистра:

  • регистр, содержащий данные (уровни сигналов) на всех линиях порта и используется для записи сигналов в порт;
  • регистр, содержащий состояния входов порта, доступен только для чтения, используется при чтении данных из порта;
  • регистр направления линий порта: каждая линия порта может быть сконфигурирована как вход или как выход в зависимости от значения бита этого регистра.

Если какая-то линия порта ввода-вывода в схеме не используется, она должна быть определена как выход (соответствующий бит регистра направления должен соответствовать выходу), и ее выходное значение должно быть равно 0.

Большинство линий ввода-вывода могут быть сконфигурированы для выполнения альтернативных функций, обозначенных в назначении выводов микроконтроллера.

Для всех линий портов ввода-вывода, как правило, доступна программная конфигурация входных подтягивающих резисторов. Подтягивающие резисторы осуществляют доопределение потенциалов «брошенных» входов напряжением высокого (Pull-up) или низкого (Pull-down) уровня.

Для обращения к отдельным линиям порта используется маскирование битов.

Входные элементы управления

В качестве входных элементов управления могут использоваться

  • другие элементы схемы;
  • тумблеры;
  • джамперы;
  • множественные переключатели;
  • кнопки.

Тумблеры предназначены для коммутации цепей управления. Обрабатываемый сигнал с тумблера – потенциальный.

Различают 1-позиционные и 2-позиционные тумблеры:

1-позиционные

2-позиционные

Джамперы, как правило, используются для переключения режима работы, и их состояние проверяется только в момент включения питания микроконтроллера.

Установка джампера замыкает 2 вывода, между которыми он установлен.

Множественные переключатели представляют собой набор 1-позиционных тумблеров в миниатюрном формате.

Кнопки предназначены для коммутации цепей управления.

Обрабатываемый сигнал с кнопки – импульсный и фиксирует момент нажатия кнопки и момент ее отжатия.

Выходные элементы управления

В качестве выходных элементов управления могут использоваться

  • другие элементы схемы;
  • элементы индикации (единичные светодиоды или светодиодные сборки, в частности, — 7-сегментные индикаторы).

Единичные светодиоды

7-сегментные индикаторы

Различают 7-сегментные индикаторы с общим анодом и с общим катодом.

При подаче логической единицы на соответствующий сегмент индикатора с общим катодом светодиод сегмента включается. При этом общий вывод сегментов (катод) должен быть соединен с логическим нулем.

При подаче логического нуля на соответствующий сегмент индикатора с общим анодом светодиод сегмента включается. При этом общий вывод (анод) должен быть соединен с логической единицей.

В таблице приведены коды для отображения цифр на 7-сегментном индикаторе

Цифра G F E D C B A Код
0 1 1 1 1 1 1 0x3F
0 0 0 0 1 1 0 0x06
1 0 1 1 0 1 1 0x5B
1 0 0 1 1 1 1 0х4F
1 1 0 0 1 1 0 0x66
1 1 0 1 1 0 1 0x6D
1 1 1 1 1 0 1 0x7D
0 0 0 0 1 1 1 0x07
1 1 1 1 1 1 1 0x7F
1 1 0 1 1 1 1 0x6F

Назад

Назад: Программирование микроконтроллеров

Источник: https://prog-cpp.ru/micro-ports/

Систему ввода-вывода микроконтроллеров AVR можно считать одной из самых сильных сторон архитектуры. Каждая линия допускает независимое управление, имеет симметричные нагрузочные характеристики и номинальные втекающий и вытекающий токи до 20…25 мА (максимальный до 40 мА) с просадкой напряжения не более 0.7 В.

Линии объединяются в 8-разрядные порты ввода-вывода, которые у AVR имеют названия A,B,C…K,L. Обозначение каждой линии на схеме определяет ее принадлежность к порту и порядковый номер. Например, выводы порта B имеют названия PB0,PB1…PB7, порта D –  PD0,PD1…PD7 и т.д. В различных моделях отдельные порты могут содержать меньше 8 линий ввода-вывода.

Рис.11 Расположение выводов ATmega8

Большинство выводов AVR-микроконтроллеров имеют также альтернативные назначения. Это аналоговые линии компаратора и АЦП, цифровые модулей SPI, TWI, USART и т.д. Описание выводов микроконтроллера ATmega8 находится в табл.6, а схема их расположения на рис.11.

Рис.12 Внутрення схема линии порта ввода-вывода

Упрощенная внутренняя схема линии порта ввода-вывода приведена на рис.12. Каждым портом микроконтроллера управляют 3 РВВ. Это DDRx, PORTx и PINx (x – название парта:  A,B,C и т.д.).

Регистры портов A,B,C,D всех моделей находятся в первой половине адресного пространства ввода-вывода и поэтому допускают прямые операции над отдельными их битами.

В цифровых портах AVR реализована истинная функциональность “чтение-модификация-запись”.

Регистр DDRx отвечает за направление передачи данных. Запись лог.1 в разряды DDRx настраивает линии на вывод, а запись лог.0,  соответственно, на ввод. Например:

ldi R16,0b11100011 ;настроить на ввод линии 2,3,4 и out DDRB,R16 ;на вывод линии 0,1,5,6,7 порта B sbi DDRB,0 ;настроить на вывод линию 0 порта B cbi DDRB,1 ;настроить на ввод линию 1 порта B

Регистр PORTx имеет двойное предназначение. Если линии порта настроены на вывод, то содержимое PORTx определяет логическое состояние выводов порта.

Для линий настроенных на ввод значение PORTx определяет состояние внутреннего подтягивающего (pull-up)  резистора к шине питания. В этом случае при уровне лог.1 в разрядах PORTx резистор подключен, а при уровне лог.

0 – отключен и линии переведены в высокоимпедансное состояние (z-состояние):

ldi R16,0b11110000 ;настроить на вывод линии 4…7 out DDRC,R16 ;и на ввод линии 0…3 порта С ldi R16,0b11111111 ;выставить на линиях 4…7 порта С уровень лог.

1 out PORTC,R16 ;и подключить к линиям 0…3 порта С pull-up резисторы sbi DDRC,0 ;настроить на вывод линию 0 порта C cbi PORTC,0 ;выставить на линии 0 порта С уровень лог.

0 сbi DDRC,1 ;настроить на ввод линию 1 порта C сbi PORTC,1 ;перевести линию 1 порта С в z-состояние

Регистр PINx предназначен для считывания уровней сигнала с выводов микроконтроллера. Естественно, что необходимость в этом существует только для линий настроенных на ввод (для линий настроенных на вывод содержимое PINx повторяет состояние выходного регистра PORTx).

Разряды PINx не оказывают ни какого влияния на состояние выводов, а сам регистр доступен только для чтения. Логический уровень входной линии фиксируется в триггере-защелке в каждом цикле тактовой частоты. Таким образом, реальное значение сигнала при считывании может иметь отставание порядка 0.5…1.

5 машинных циклов. Пример использования:

cbi PORTD,0 ;настроить на ввод линию 0 порта D sbi PORTD,0 ;подключить к линии 0 порта D pull-up резистор nop ;задержка 1 цикл для установки режима sbis PIND,0 ;считать состояние линии 0 порта D rjmp ulo ;если лог.0, то перейти на метку ulo rjmp uhi ;если лог.1, то перейти на метку uhi

У микроконтроллеров AVR имеется возможность управлять pull-up резисторами сразу на всех его выводах. За это свойство отвечает бит PUD из РВВ SFIOR либо MCUCR. При установке разряда PUD запрещается подключение всех резисторов. При PUD=0 (значение после сброса) состояние внутренних резисторов определяется состоянием регистра PORTx.

Различные возможности конфигурации линий портов ввода-вывода   AVR приведены в табл.7. На время спящего режима (после выполнения команды sleep) входной буфер порта отключается.

При использовании выводов микроконтроллера по их альтернативному назначению, может понадобится вручную сконфигурировать линии. Так, например, в случае применения компаратора, АЦП, внешних прерываний соответствующие линии должны быть переведены в z-состояние, а для ШИМ-выводов таймеров счетчиков и выходных сигналов других модулей линии должны быть настроены на вывод.

Табл.6. Описание выводов модели ATmega8(L):

Номер вывода в корпусе DIP-28 Номер вывода в корпусахTQFP-32 и MLF-32 Функция вывода Описание
14 12 PB0 0-й бит порта B
ICP1 Вход захвата таймера-счетчика 1
16 13 PB1 1-й бит порта B
OC1A ШИМ-вывод A таймера-счетчика 1
16 14 PB2 2-й бит порта B
OC1B ШИМ-вывод B таймера-счетчика 1
SS Вывод Slave нашине SPI
17 15 PB3 3-й бит порта B
OC2 ШИМ-вывод таймера-счетчика 2
MOSI Выход Master или вход Slave данных на шине SPI
18 16 PB4 4-й бит порта B
MISO Вход Master или выход Slave данных на шине SPI
19 17 PB5 5-й бит порта B
SCK Выход Master или вход Slave тактового сигнала модуля SPI
9 7 PB6 6-й бит порта B
XTAL1 Вывод тактового генератора
TOSC1 Вывод для подключения резонатора к таймеру-счетчику 2
10 8 PB7 7-й бит порта B
XTAL2 Вывод тактового генератора
TOSC2 Вывод для подключения резонатора к таймеру-счетчику 2
2 30 PD0 0-й бит порта D
RXD Вход USART
3 31 PD1 1-й бит порта D
TXD Выход USART
4 32 PD2 2-й бит порта D
INT0 Вход внешнего прерывания 0
5 1 PD3 3-й бит порта D
INT1 Вход внешнего прерывания 1
6 2 PD4 4-й бит порта D
XCK Вход/выход  внешнего тактового сигнала модуля USART
T0 Вход/выход  внешнего тактового сигнала таймера-счетчика 0
11 9 PD5 5-й бит порта D
T1 Вход/выход внешнего тактового сигнала таймера-счетчика 1
12 10 PD6 6-й бит порта D
AIN0 Неинвертирующий вход компаратора
13 11 PD7 7-й бит порта D
AIN1 Инвертирующий вход компаратора
23 23 PC0 0-й бит порта C
ADC0 0-й вход АЦП
24 24 PC1 1-й бит порта C
ADC1 1-й вход АЦП
25 25 PC2 2-й бит порта C
ADC2 2-й вход АЦП
26 26 PC3 3-й бит порта C
ADC3 3-й вход АЦП
27 27 PC4 4-й бит порта C
ADC4 4-й вход АЦП
SDA Вход/выход данных модуля TWI
28 28 PC5 5-й бит порта C
ADC5 5-й вход АЦП
SCL Вход/выход тактового сигнала модуля TWI
1 29 PC6 6-й бит порта C
RESET Вход сброса
19 ADC6 6-й вход АЦП
22 ADC7 7-й вход АЦП
8,22 3,5,21 GND Общий вывод
21 20 VREF Вход опорного напряжения для АЦП
20 18 AVCC Вывод источника питания АЦП
7 4,6 VCC Вывод источника питания микроконтроллера

Табл.7. Конфигурация выводов порта:

DDRxn PORTxn PUD Функция вывода Резистор Примечание
0 0 X Вход Отключен На выводе z-состояние
0 1 0 Вход Подключен На выводе присутствует положительное смещение к источнику питания
0 1 1 Вход Отключен На выводе z-состояние
1 0 X Выход Отключен На выводе лог.0
1 1 X Выход Отключен На выводе лог.1

Перейти к следующей части: Система команд – Способы адресации

Источник: http://shemopedia.ru/portyi-vvoda-vyivoda.html

Порты ввода/вывода МК PIC18XXXX

  • TRIS – регистр выбора направления данных в каналах  порта ввода/вывода, если соответствующий бит регистра «0», то линия вывода работает на выход, если «1» то на вход. По умалчиванию порт настроен на вход.
  •  PORT – регистр порта , считывает логическую информацию с выводов порта.
  •   LAT – защелка порта ввода/вывода. (Очень полезный регистр. Подробней в статье…)

Порты ввода/вывода имеет буквенное обозначение. A, B, C ..и т.д., в зависимости от количества портов в микроконтроллере.

Каждый порт имеет свои регистры управления, порт «A»  к примеру: TRISA, PORTA, LATA, порт»B»  TRISB, PORTB, LATB и т.д..

Рассмотрим настройку порта:

Допустим  необходимо настроить порт «С», линии вывода  С0-С3 на выход, а остальные на вход, для этого настраиваем регистр TRIS. Очень удобно записывать в двоичной системе .

       movlw        b'11110000' ; movwf              TRISC ;

Если необходимо весь порт настроить на выход, то достаточно очистить регистр TRIS.

       clrf              TRISC ;

На вход настраивать не нужно  (по умалчиванию).

То же самое и с другими регистрами.

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

Хотя типов микроконтроллеров достаточно много, тем не менее  практически все они «построены на базовом варианте» и рассматривая МК PIC18252 многое относится и к другим микроконтроллерам 18 серии.

На пример;

  • аналоговые линии располагаются в порту «А», (если аналоговых входов больше, то  дополнительно в порту «В»).
  • подключение основного генератора.
  • линии порта»В» можно аппаратно подтянуть к шине питания +5В.
  • и т.д..

Порт»А».

7-разрядный или 8-разрядный (в зависимости от типа МК) порт ввода/вывода. Линия  RA4/T0CKI  имеет триггер Шмитта на входе и открытый сток на  выходе, мультиплексирован  с  тактовым входом таймера TMR0. Для формирования на его выходе  «1» необходимо   подтянуть вывод внешним  резистором к  шине  питания +5В.

Каналы PORTA мультиплексированы  с  аналоговыми  входами  АЦП  и  аналоговым  входом  источника опорного напряжения VREF+ и VREF-. Если модуль АЦП не задействуется, то при конфигурации  нужно настроить линии порта как  цифровые каналы, т.к. при сбросе или  включении питания микроконтроллера часть линий ввода/вывода устанавливается как аналоговые входы.

Инициализация порта»А»

clrf PORTA ; очистка порта. movlw 07h ; настройка как цифровых movwf ADCON1 ; каналов ввода/вывода. movlw b'00000111 ; настройка RA0-2 на вход movwf TRISA ; остальные на выход.(пример)

Для настройки каналов, мультиплексированных с АЦП  вместо регистра ADCON1 (в зависимости от типа МК может применятся другой регистр «ANSEL»). Настройка порта  для работы с АЦП рассмотрена в соответствующей теме.

Порт»B».

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

Для настройки каналов, мультиплексированных с АЦП  применяется регистр управления «ANSELH» (в зависимости от типа МК, к примеру в PIC18FXX2 его нет, как нет и каналов АЦП  на этом порту).

По этому, если АЦП на порту не задействовано, то  с помощью этого регистра необходимо настроить каналы как цифровые линии ввода/вывода.

В некоторых типов МК 18 серии для настройки отдельных цифровых каналов ввода/вывода порта»В», при конфигурации микроконтроллера необходимо прописать   PBADEN=ON.

Инициализация порта «B» PIC18FXX2. (пример)

clrf PORTB ; очистка порта. movlw 07h ; настройка как цифровых movwf ADCON1 ; каналов ввода/вывода. movlw b'00000111 ; настройка RA0-2 на вход movwf TRISB ; остальные на выход.(пример)

Инициализация порта «B» PIC18FXXK20.(пример)

clrf PORTB ; очистка порта. Можно регистр LATB. clrf ANSELH ; цифровые каналы, конф.бит PBADAN должен установлен. movlw b'00000111 ; настройка RB0-2 на вход movwf TRISB ; остальные на выход.(пример)

Каналы порта часто применяют как источник прерываний . К примеру, изменение логического состояния на входе каналов RB4-7 часто применяют для опроса кнопок. (более подробно  можно почитать в статье….).

Порт»С».

Восьмиразрядный  порт ввода/вывода. На этом порту сосредоточены  в основном модули «связи», SPI, I2C, USART. Кроме этого различные модули таймеров и ШИМ.  Обычно если модули не задействованы, то  линии  работают как цифровые каналы вводы/вывода. Настройка порта производится с помощью специальных регистров TRISC, LATC, PORTC.

Порт»D»,»E».

В зависимости от типа микроконтроллера порт»Е» бывает трех или восьмиразрядным  портом ввода/вывода, Порт»D» восьмиразрядный.

Настройка порта «D» производится с помощью специальных регистров TRISD, LATD, PORTD. Порта «E» соответственно регистры TRISЕ, LATЕ, PORTЕ.

В некоторых типах микроконтроллеров могут быть специальные порты для управления LCD индикатором. А так же  различные модули (специализированные  МК) для управления нагрузкой и т.д..

Источник: https://chipmk.ru/index.php/2014-08-10-05-51-44/41-samouchitel-pic18-asm-2-chast/190-porty-vvoda-vyvoda-mk-pic18xxxx

Изучаем STM8 (Часть 3). Работа с портами Ввода-Вывода (GPIO) — DRIVE2

Для начала – что такое GPIO.Расшифровуется это вот так — (General Purpose Input/Ouput) это двунаправленный регистр ввода/вывода который нужен для реализации функций заложенных в микроконтроллере, либо функций которые разработчик написал сам. То есть регистр определяющий какую функцию будет выполнять пин(ножка) микроконтроллера, будет входом или выходом.

Порты у STM8 обозначаются так же как и у AVR, то есть буквами – A, B, C, D… и т.д. Каждый порт состоит из 8 пинов. Пины VSS (GND), VDD(VCC), VCAP – заняты под питание микроконтроллера.Вывод VCAP присутствует только в микроконтроллерах серии STM8S и STM8A. Он нужен для стабилизации питания внутреннего регулятора на 1.8В.

Этот вывод подключается к «массе» через керамический конденсатор 100nF.

С выводам VSS и VDD я думаю объяснять не нужно? VSS – подключаем на массу, VDD — к +5Вольт.

Вернёмся обратно к описанию функционала портов, а то немного отвлеклись…

На картинке, которая показана ниже мы видим описание параметров портов нашего микроконтроллера. Эта табличка взята из даташита, который вы с лёгкостью найдёте на просторах интернета.

Немного опишу некоторые параметры
Floating Input — обозначает, может ли данный пин работать без подтягивающего (pull-up) резистора
WPU – Обозначает, есть ли на данном пине подтягивающий резистор.
Эти два выше написанных параметра используются если пин настроен на — ВХОД!

Ext. interrupt – Обозначает, может ли на данный пин приниматься внешнее прерываниеHigh Sink – Обозначает, может ли данный пин выдавать большой ток (20мА). «Слабые» пины будут без этой отметки и будут выдавать ток около 5мА.

Speed — Здесь указано скорость работы порта. Есть несколько вариантов – а)До 2MHz, б)До 10MHz и остальные два, которые программно выставляются, и могут при перезагрузке процессора быть в стоке или быстрым или медленным.

OD (open drain) и PP(push-pull) – Обозначает, может ли вывод работать в режиме Открытого Коллекстора или в режиме Push-Pull соответственно выдавая низкий или высокий уровень А эти параметры используются, если пин настроен на – ВЫХОД!

Теперь мы начнём программировать наши порты. Тут всё примерно как и у AVR, но ясное дело есть отличия. Итак
Для управления GPIO есть 5 регистров

Px_DDR — направление (вход или выход)
Px_ODR — значение, которое выдается в порт (Выдаём 1 или 0)
Px_IDR — текущее состояние порта (Чтение порта)
Px_CR1 — регистр конфигурации 1
Px_CR2 — регистр конфигурации 2

Px_DDR – тут всё просто, если мы сюда пишем -1, то соответствующая ножка будет – выходом. А если пишем — 0, то ножка будет входом.

Px_ODR – здесь мы устанавливаем то, что хотим видеть на ножке, если ножка настроена на выход. Если ставим — 1, то на ножке у нас появиться +5В, если 0, то на ножке появиться 0В (выход притянется к массе).

При этом, тут есть ещё варианты в зависимости от конфигурации битов CR1.
Px_IDR – тут всё просто. Из этого регистра мы просто читаем текущий уровень на ножках микроконтроллерах.

Биты CR1 и CR2 настраиваются по разному, в зависимости от того настроен пин на выход или на входЕсли пин настроен на ВХОД:

Бит CR1 — управляет внутренним подтягивающим резистором – единица его включает, ноль выключает, и пин просто болтается в воздухе . Старайтесь на неиспользуемых пинах включать подтяжку, чтобы пин не ловил непонятные уровни.

Бит CR2 в режиме входа разрешает или запрещает прерывания на данной ножке. Если единица – прерывание разрешено, если ноль – запрещено.Если пин настроен на ВЫХОД:

Бит CR1 — если установлена единица – устанавливает режим работы Push-Pull, то есть выход может выдавать высокий и низкий уровень. Ноль — выход работает в режиме открытого стока. То есть низкий уровень ножка как выдавала, так и выдаёт, а вот вместо высокого уровня, пин переключатся в режим входа.

Бит CR2— в режиме выхода управляет скорость переключения. То о чём было написано выше. То есть мы може установить скорость переключения до 2мГц и до 10мГц. А вообще по факту, от данного бита зависит не скорость работы пина, а крутизна фронта сигнала.
Вот табличка для простоты понимания настройки битов CR1 и CR2

РегистрРежимЗначение ОписаниеCR1 Вход 0 Плавающий вход (Floating input)CR1 Вход 1 Вход с подтягивающим резисторомCR1 Выход 0 Открытый сток (Open drain)CR1 Выход 1 Выход Push-PullCR2 Вход 0 Прерывания запрещеныCR2 Вход 1 Прерывания разрешеныCR2 Выход 0 Выход до 2 мГц

CR2 Выход 1 Выход до 10мГц

А теперь подытожим. Если мы хотим ножку PB7 входом, то мы должны написать вот так
PB_DDR_DDR7 = 0; //Назначаем ножку PB7 входом
PB_CR1_bit.C17 = 1; //Подключаем подтягивающий резистор
PB_CR2_bit.C27 = 1; //Разрешаем внешние прерывания на этой ножке

А если бы мы хотели сделать эту ножку выходом, то записали бы вот так.

PB_DDR_DDR7 = 1; //Назначаем ножку PB7 выходом
PB_CR1_bit.C17 = 1; //Делаем выход Push-Pull, то есть выход может выдавать высокий и низкий уровень
PB_CR2_bit.C27 = 1; //скорость работы пина до 10 МГц

Как мы видим, пока ничего сложного.

Источник: https://www.drive2.com/b/1319133/

Ссылка на основную публикацию