Про дрыганье ножкой на avr32

Есть такая вещь в AVR32 — GPIO.

Расшифровывается как General-Purpose Input/Output Controller — Универсальный Контроллер Ввода/Вывода, по-русски говоря.

И именно через него, а не напрямую, как в мегах, осуществляется управление ножками контроллера — прямой доступ к памяти по адресам i/o портов остался в прошлом — теперь все как у взрослых процов.

Зачем все это нужно? А затем. Что просто помимо количества i/o ножек (105 на at32uc3a) у каждой ножки, кроме функций порта ввода-вывода, может быть до трех альтернативных функций. Кем работать ножке: RX усарта или чип-селектом EBI? входом АЦП или USB? Или просто входом? Все это теперь настраивается с помощью регистров GPIO.

Вместе с возможностями пришли и сложности — изучить… настроить…
Но на самом деле управляться с GPIO-контроллером не так уж и сложно.

На нашем контроллере GPIO имеет 5 виртуальных портов, на которые распределяются ножки. У каждой ножки есть свой GPIO-индекс, указанный в таблице. Какому порту и пину в этом порту соответствует ножка высчитывается по формуле, исходя из этого индекса:
GPIO port = целое от деления ((GPIO number) / 32), ex: GPIO36/32 = 1
GPIO pin = остаток от ((GPIO number) / 32), ex: GPIO36/32 = 4

Если мы хотим работать с ножкой, как встарь, то все просто: каждый порт имеет комплекты регистров, с которыми и следует общаться вместо прямого доступа к памяти. Почему комплекты? Потому что на каждое действие теперь выделено по трое регистров (set, clear, toggle). В этом и состоит отличие — теперь мы пишем не 1 или 0, в зависимости от того, что хотим видеть на ножке, а пишем единицу в соответствующий регистр — включить, выключить и (бонус! бонус!) переключить пин.

Пример для ножек PA3 и PA4. Они имеют индексы GPIO 3 и GPIO 4, соответственно, управляются через 3 и 4 биты в 0 порту. У нас на этих пинах висит по диоду.
Пара дефайнов

#include
#define PA3			(0x00000008) // GPIO 3
#define PA4			(0x00000010) // GPIO 4

Каждый GPIO порт — 32-битный, поэтому дефайны пишем для 32-битных регистров.

Выключаем пины, настраиваем их в качестве выходов и включаем управление пинами через гпио (т.е. отключаем все периферийные функции)

AVR32_GPIO.port[0].ovrс  = PA3 | PA4;	// Pins off
AVR32_GPIO.port[0].oders = PA3 | PA4;	// Pins PA3 and PA4 are outputs
AVR32_GPIO.port[0].gpers = PA3 | PA4;	// Pins PA3 and PA4 are driven by GPIO

Странные сокращения означают следующее:
ovrс — Output Value Register Clear
oders — Output Driver Enable Register Set
gpers — GPIO Enable Register Set

Дальше элементарные действия.
Включить диоды (поставить единицы на ножки) — пишем в регистр Output Value Register Set единицы в соответствующие позиции:

AVR32_GPIO.port[0].ovrs = PA3 | PA4;

Выключить диоды (поставить нули на ножки) — пишем в регистр Output Value Register Clear единицы в соответствующие позиции:

AVR32_GPIO.port[0].ovrc = PA3 | PA4;

Переключить диоды — пишем в регистр Output Value Register Toggle единицы в соответствующие позиции:

AVR32_GPIO.port[0].ovrt = PA3 | PA4;

Работа в качестве входов отличается немногим.
Настраиваем:

AVR32_GPIO.port[0].oderс = PA3 | PA4;	// Pins PA3 and PA4 are inputs
AVR32_GPIO.port[0].gpers = PA3 | PA4;	// Pins PA3 and PA4 are driven by GPIO
AVR32_GPIO.port[0].puers = PA3 | PA4;	// Pull-Up Enable

Считываем из Pin Value Register, что у нас на PA3, например:

u32 = AVR32_GPIO.port[0].pvr & PA3;

Вот и все. Самое интересное, что в порту присутствует Interrupt Enable Register. Т.е. теперь можно не опрашивать в цикле ножки и смотреть их изменение, а просто повесить на нужную прерывание и смело о ней забыть.

Похожий бред:

Про дрыганье ножкой на avr32: 3 комментария

  1. AVR32_GPIO.port[0].ovrs = PA3 | PA4;

    Выключить диоды (поставить нули на ножки) — пишем в регистр Output Value Register Clear единицы в соответствующие позиции:
    AVR32_GPIO.port[0].ovrs = PA3 | PA4;

    Переключить диоды — пишем в регистр Output Value Register Toggle единицы в соответствующие позиции:
    AVR32_GPIO.port[0].ovrs = PA3 | PA4;

    ovrs везде. Опечатко?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Protected by WP Anti Spam