
Система событий микроконтроллеров XMEGA™ - это набор функций, который позволяет периферийным модулям взаимодействовать друг с другом без вмешательства центрального процессора. Некоторые периферийные модули могут генерировать события, зачастую при тех же условиях, что и прерывания. Эти события проходят через систему маршрутизации событий до потребителей событий, где наступившим событием могут быть инициированы определенные действия. Центральный процессор не участвует в этом процессе, за исключением этапа настройки. Например, можно инициировать захват входа таймера-счётчика при нажатии пользователем на кнопку, или начать аналого-цифровое преобразование при переполнении таймера-счётчика. Используя всю мощь системы событий можно настроить чип на выполнение сложных операций с минимальным вмешательством со стороны процессора, при этом экономя драгоценную память программ и время выполнения.
Систему событий можно разделить на три части:
В этой главе будет рассмотрено взаимодействие этих частей между собой.
Под событием в данном документе подразумевается индикация изменения состояния периферийного модуля. Периферийные модули, способные генерировать события, называются генераторами событий. Один генератор событий может быть в состоянии генерировать события при изменении нескольких параметров периферийного модуля. Каждый из них является отдельным источником событий. Например, модуль таймера-счётчика является генератором событий с несколькими источниками событий, так как он может генерировать событие при переполнении, при ошибке и при сравнении/захвате.
В системе событий XMEGA существует два типа событий, «Signaling» и «Data». События «Signaling» не содержат никакой информации, кроме того, что произошло какое то событие. События «Data» содержат дополнительные данные об изменении состояния модуля. Структура данных зависит от источника события.
Поскольку события типа «Data» используются только несколькими периферийными модулями, они не будут подробно рассматриваться до главы 3. В остальной части этого документа при употреблении слова «событие» будет иметься ввиду событие типа «Signaling», за исключением ситуаций, когда будет необходимо их различать.
Генераторы событий - это периферийные модули, имеющие один или несколько источников событий. Как правило, существует строгое соответствие между доступными источниками событий, доступными прерываниями и источниками триггеров DMA, принадлежащими периферийному модулю. Генератор событий предоставляет все свои источники событий системе маршрутизации событий и не знает, какие из источников событий используются другими модулями.
Матрица соединений управляет маршрутизацией событий от генератора до потребителя событий. Матрица соединений содержит восемь эквивалентных каналов системы событий. Каждый канал содержит мультиплексор (управляемый регистром CHnMUX) и управляющую и фильтрующую логику (управляемую регистром CHnCTRL), где значение n определяет номер канала.
Каждый источник событий каждого генератора событий подключен ко входам каждого из восьми мультиплексоров. Это позволяет подключить любой канал системы событий к любому источнику событий. Причём может быть выбрано несколько каналов событий для передачи событий от одного источника.
Фильтрация и специальные функции каналов системы событий рассмотрены в главе 3.
Приёмники событий - это периферийные модули, которые могут использовать событие для выполнения какого либо действия, называемого действием по событию. Приёмник события выбирает источник события, на которое он будет реагировать, путем выбора канала системы событий. Фактический источник события определяется настройками мультиплексора для выбранного канала системы событий.
Приёмники событий также могут быть генераторами событий. Например, модуль таймера-счётчика имеет несколько источников событий, а также может использовать событие от другого периферийного модуля для запуска захвата входа.
Событие обычно длится один такт системного тактового сигнала. Некоторые источники при определенных условиях способны генерировать события непрерывно, но этот случай здесь подробно не рассматривается.
Когда событие генерируется, ему требуется до двух тактов для срабатывания действия по событию. Один такт требуется на регистрацию порождённого события в матрице соединений, а второй такт на распространение события до приёмника.
Поскольку между моментом генерации события и его получением приёмником проходит не более двух тактов, система событий обеспечивает более детерминированные сроки, чем при использовании прерываний.
Существует возможность генерации событий из программного обеспечения или с помощью встроенной в чип системы отладки. Порождённое событие внедряется непосредственно в каналы системы событий. При генерации события вручную канал системы событий не обязан иметь связанный с ним источник событий. Если с каналом системы событий связан источник событий, порождённое вручную событие имеет более высокий приоритет, и будет подавлять события от периферийных модулей.
Для генерации событий вручную используется два регистра, STROBE и DATA. Генерация события происходит при записи в регистр STROBE. Для генерации событий типа «Signaling» используется только регистр STROBE. При генерации событий типа «Data» используются оба регистра (STROBE и DATA), причём запись в регистр STROBE должна производиться после записи в регистр DATA.
Регистры STROBE и DATA содержат по одному биту на каждый канал событий. Бит с позицией N отвечает за канал системы событий с номером N. Допускается генерация событий сразу на нескольких каналах одновременно путем установки нескольких бит регистра STROBE одновременно.
В таблице 2-1 показано соответствие между значениями, записанными в регистры STROBE и DATA, и порождёнными событиями. Обратите внимание на то, что приёмники событий типа «Signaling» получат только события «Data Event 02» и «Data Event 03». Событие «Data Event 01» получит только тот приёмник, который подписан на события типа «Data». Более подробно события типа «Data» рассмотрены в главе 3.
Таблица 2-1. Кодирование событий
| STROBE | DATA | Приёмник событий типа «Data» |
Приёмник событий типа «Signaling» |
|---|---|---|---|
| 0 | 0 | Нет события | Нет события |
| 0 | 1 | Событие «Data Event 01» | Нет события |
| 1 | 0 | Событие «Data Event 02» | Событие типа «Signaling» |
| 1 | 1 | Событие «Data Event 03» | Событие типа «Signaling» |
Для генерации событий типа «Signaling» требуется произвести запись только в регистр STROBE. Например, запись значения 0x05 в регистр STROBE приведёт к генерации событий типа «Signaling» на каналах 0 и 2 одновременно. Когда события будут сгенерированы, регистры STROBE и DATA автоматически очищаются.
При генерации событий типа «Data» сначала должна быть произведена запись в регистр DATA, а затем уже в регистр STROBE. События не будет порождено до тех пор, пока не будет произведена запись в регистр STROBE. Когда событие(я) будет порождено, регистры STROBE и DATA автоматически очищаются. Например, если записать значение 0x05 в регистр «Data», а затем записать значение 0x01 в регистр STROBE, будет порождено событие "Data Event 03" на канале 0 и событие "Data Event 01" на канале 2. Обратите внимание на то, что приёмник событий, ожидающий события типа «Signaling», получит его на канале 0, но на канале 2 событие этого типа порождено не будет.
Система событий работает в активном режиме и режиме ожидания (Idle). Во всех остальных режимах энергосбережения периферийные модули не могут использовать систему событий.
В дополнение к ретрансляции информации об изменениях в периферийных устройствах система событий имеет встроенные функции для обработки сложных задач, таких как фильтрация и квадратурное декодирование. Эти функции требуют специальной обработки в каналах системы событий и управляются регистрами CHnCTRL, где n это номер канала.
Каждый канал системы событий снабжён цифровым фильтром, который управляется полем DIGFILT[2:0] регистра CHnCTRL. При использовании цифрового фильтра высокий логический уровень на входе мультиплексора канала системы событий должен оставаться в течении (DIGFILT + 1) тактов до того, как событие будет передано через канал системы событий приёмнику.
Цифровой фильтр обычно используется при опросе линий портов ввода/вывода, чтобы предотвратить несколько последовательных событий, вызванных дребезгом контактов или электрическим шумом.
Система событий имеет в своем составе расширение, которое позволяет использовать таймер-счётчик как квадратурный декодер. Квадратурные энкодеры обычно используются в качестве датчиков положения в моторах, а так же в других роторных датчиках, таких как трекер шарика компьютерной мыши. В статье по применению AVR1600 более подробно рассмотрена настройка и использование квадратурного декодера.
В этой главе приведено несколько примеров использования системы событий. Каждый пример содержит инструкции по настройке каждой части системы. Дополнительные и более подробные примеры можно найти в статьях по применению для конкретных приёмников событий.
Любой источник событий может быть использован для запуска захвата входа одним из модулей таймеров-счётчиков. Это может быть использовано для измерения временных интервалов между какими либо событиями.
Этот пример показывает, как настроить таймер-счётчик TCC0 для захвата входа, инициированного изменением логического уровня на линии PD0 порта ввода/вывода. Для этого необходимо:
Теперь таймер-счётчик TCC0 будет выполнять захват входа каждый раз, когда меняется логический уровень на входе PD0.
АЦП может быть настроен на запуск развёртки четырех каналов при наступлении любого события. В этом примере используется событие переполнения таймера-счётчика. Это может быть очень полезно при генерации ШИМ с помощью таймера-счётчика, так как преобразования АЦП можно синхронизировать с ШИМ.
Этот пример демонстрирует настройку запуска развёртки четырех виртуальных каналов ADCA при переполнении таймера-счётчика TCC0, используя канал 0 системы событий. Для этого необходимо:
Иногда полезно иметь таймер-счётчик с разрешением более 16 бит. С помощью системы событий можно каскадировать два 16-разрядных таймера-счётчика и использовать их как один 32-разрядный таймер-счётчик с функцией захвата входа.
Статья по применению AVR1306 содержит более детальную информацию об использовании таймеров-счётчиков в 32-х разрядном режиме.
Этот пример демонстрирует алгоритм настройки таймеров-счётчиков TCC0 и TCC1 для работы в качестве одного 32-разрядного таймера-счётчика с каналом захвата A, срабатывающим при изменении логического уровня на линии PD0, а генерируемое при этом событие проходит через канал 1 системы событий. Канал 0 системы событий используется для оповещения о переполнении счётчика. Для этого необходимо:
Теперь изменение логического уровня на линии PD0 приведёт к захвату 32-разрядного значения канала A таймеров-счётчиков TCC0 и TCC1.
Существует возможность использовать канал системы событий в качестве источника тактового сигнала для таймера-счётчика. Это может быть использовано для подсчёта количества событий, прошедших через канал системы событий.
В этом примере таймер-счётчик TCC0 используется для подсчета нажатий на кнопку, подключенную к линии PD0. Для этого необходимо:
Теперь таймер-счётчик TCC0 будет подсчитывать количество нажатий на кнопку, подключенную к линии PD0.
Канал системы событий может быть настроен на распространение частоты дискретизации. Множеству систем управления требуется измерять и выводить данные через равные промежутки времени, называемые частотой дискретизации. Используя один из таймеров-счётчиков в качестве генератора частоты дискретизации можно распространять события переполнения и/или совпадения таймера-счётчика модулям АЦП, ЦАП, ШИМ и другим периферийным модулям, которым необходимо выполнять некоторые действия через равные интервалы времени.
Приложенный к статье драйвер содержит функции для настройки системы событий. Драйвер написан на ANSI® С и должен компилироваться любым компилятором, поддерживающим микроконтроллеры XMEGA.
Обратите внимание на то, что этот драйвер написан без оглядки на высокую производительность. Он выполнен в виде библиотеки и предназначен для начала работы с системой событий микроконтроллеров Xmega, а так же в качестве легкого в использовании механизма для быстрого прототипирования. Для приложений, в которых критично время выполнения и объем кода, можно заменить вызовы функций на макросы или прямой доступ к регистрам.
Архив с исходным кодом содержит следующие файлы:
Весь исходный код подготовлен для автоматического генерирования документации с помощью программы Doxygen. Doxygen - это утилита, предназначенная для генерирования документации из исходных кодов путем анализа исходного кода и специальных ключевых слов. Более подробно про утилиту Doxygen можно узнать на сайте http://www.doxygen.org. Скомпилированная средствами Doxygen документация также поставляется с исходным кодом, прилагаемым к этому документу и доступна из файла readme.html, расположенного в папке с исходным кодом.