Знакомство с XMEGA. Часть 2

Модули последовательных коммуникаций.

 Микроконтроллеры XMEGA снабжены бога­тым арсеналом аппаратных модулей для орга­низации последовательного обмена данными с внешним миром: SPI, TWI и USART, причем USART также может работать и в режиме аппа­ратной поддержки IrDA. Количество и состав периферийных коммуникационных блоков XMEGA варьируется от подсемейства к подсе­мейству. Так, USART может быть от 5 до 8 моду­лей, a SPI и TWI — до 4. Первое подсемейство XMEGA (А1) имеет 8 модулей USART и по 4 мо­дуля SPI и TWI. Самое «маленькое» подсемейс­тво (A3) имеет 5 блоков USART, 4 блока SPI и 2 блока TWI.

Аппаратная реализация коммуникационных интерфейсов TWI и SPI, а также организация работы с ними у микроконтроллеров XMEGA идентичны «старшим» кристаллам megaAVR и в цикле статей рассматриваться не будут.

Универсальный синхронный-асинхронный пос­ледовательный приемопередатчик (USART) в микроконтроллерах XMEGA поддерживает полнодуплексный обмен в асинхронном и так­тируемом синхронном режимах. Он может быть сконфигурирован в режим эмуляции SPI Master, при этом поддерживаются все 4 режима работы SPI (Mode 0,1,2 и 3) и есть возможность выбора порядка передачи данных: первым переда­ется LSB или MSB. Когда USART установлен в режим эмуляции SPI Master, вся специальная встроенная логика USART запрещена. Актив­ными остаются буферы приема и передачи, сдвиговые регистры и генератор скорости передачи. Управление внешними выводами и формирование запросов на прерывание идентичны для обоих режимов. Обмен дан­ными USART фреймирован, формат кадра может специфицироваться пользователем. USART буферизован на прием и передачу. Раз­личные вектора прерываний для индикации завершения приема или передачи обеспечи­вают гибкое управление обменом данными посредством прерываний. Также может быть разрешена работа схемы формирования и контроля бита четности. Подробнее структу­ру и работу USART целесообразно смотреть в описании на микроконтроллер.

Рассмотрим подробнее новый интересный режим работы у USART в микроконтроллерах XMEGA — физическую поддержку IrDA (имеет­ся в виду физическая модуляция-демодуляция сигнала на скоростях обмена до 115,2 кбод). Поддерживаются три схемы модуляции: 3/16 периода скорости обмена данными, фикси­рованная длительность импульсов (програм­мируется, 8 бит), запрещение модуляции им­пульса.

Напомним основы IrDA. Байт, который требует­ся передать, посылается в USART из CPU, USART добавляет старт/стоп биты и передает байт последовательно, начиная с LSB. Логический «О» (вспышка света) передается одиночным ИК-импульсом длиной от 1,6 мс до 3/16 перио­да передачи битовой ячейки, а логическая «1» передается как отсутствие ИК-импульса. Отсю­да следует, что минимальное энергопотребле­ние гарантируется при фиксированной длине импульса 1,6 мс. По окончании кодирования битов необходимо пропустить ток через ИК-светодиод, чтобы выработать световой им­пульс требуемой интенсивности. При приеме ИК-импульсы поступают на PIN-диод, который преобразует их в импульсы тока. Они затем усиливаются, фильтруются и сравниваются с пороговым уровнем для преобразования в логические уровни.

Всего в XMEGA имеется один доступный мо­дуль IrDA, который может быть присоединен к любому из блоков USART. В режиме IrDA сигналы между USART и выводами RX/TX коммутируются, как показано на рисунке. Для приема можно запрограммировать минималь­ную длительность импульса, которая будет ин­терпретироваться как логический «О». Все бо­лее короткие импульсы будут декодироваться в логическую «1» (отсутствие импульса).

Модуль IrDA может быть использован в комби­нации только с одним из USART в каждый мо­мент времени. Следовательно, режим IrDA не должен быть одновременно установлен более чем для одного USART. Проверка этого обяза­тельного условия лежит на программисте.

В качестве входа для приемника IrDA можно также выбрать канал системы событий. Это автоматически запретит RX- вход с вывода микроконтроллера. Система событий имеет цифровой входной фильтр (DIF) на каналах событий, что может быть использовано для фильтрации. Подробнее мы рассмотрим это, когда будем описывать работу Event System.

 

Аппаратные устройства шифрования.

В состав микроконтроллеров XMEGA введены аппаратные средства обеспечения защиты ин­формации. В качестве реализованных стандар­тов компания Atmel выбрала два широко рас­пространенных стандарта шифрования — AES и DES. У XMEGA шифрование по стандарту DES (поддержка DES и triple-DES) реализуется вы­полнением специальной команды DES, входя­щей в состав системы команд процессорного ядра. Команда DES короткая, она исполняется за один период основной тактовой частоты. Для шифрования требуется поместить 8-байтный ключ и 8-байтный блок данных в регист­ровый файл, а затем последовательно выпол­нить команду DES 16 раз для шифрования или дешифровки блока данных. Криптомодуль AES шифрует и дешифрует блоки данных размером 128 бит с использованием 128-битного ключа. И ключ, и данные должны быть записаны в модуль до начала выполнения цикла команд кодиро­вания-декодирования. Длительность процесса обработки блока составляет 375 периодов пе­риферийной тактовой частоты, после чего дан­ные можно использовать по назначению.

Режимы энергосбережения

Микроконтроллеры XMEGA поддерживают 5 режимов пониженного энергопотребления, как и все современные «базовые» микрокон­троллеры AVR.

Режим холостого хода (Idle), в котором прекращает работу только процессорное ядро и фиксируется содержимое памяти программ. Все периферийные модули продолжают функционирование в обычном режиме, включая контроллер DMA и систему событий. Все разрешенные системы тактирования также продолжают работать. В режиме Idle разбудить процессорное ядро может любой периферийный блок, причем ядро начинает работу сразу же, без задержки.

Режим микропотребления (Power Down), в котором сохраняется содержимое регистрового файла, но останавливается работа системы тактирования. Выход из Power Down возможен по общему сбросу микроконтроллера, по разрешенному внешнему прерыванию, по совпадению адреса в блоке двухпроводного последовательного интерфейса TWI. Сторожевой таймер также может разрешить выход из режима микропотребления (при условии, что он сам разрешен).

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

Основной режим ожидания (Standby). Идентичен режиму Power Down, но здесь работа тактового генератора не прекращается. Это гарантирует быстрый выход микроконтроллера из режима ожидания.

Дополнительный режим ожидания (Extended Standby). Идентичен режиму Power Save, но здесь работа тактового генератора тоже не прекращается. Это гарантирует быстрый выход микроконтроллера из режима ожидания.

После выхода из режимов пониженного энер­гопотребления центральное процессорное ядро блокируется в тактировании на 4 такта генератора перед началом выполнения про­граммы. Это время задержки будет присутс­твовать всегда. Но общее время выхода будет также зависеть от источника тактового сигна­ла, его состояния и конкретного режима по­ниженного энергопотребления. Так, задержка старта для любого из внутренних RC-генераторов составляет 6 тактов, а для внешних ге­нераторов определяется конфигурацией битов XOSCSEL[3:0] в управляющем регистре XOSCCTRL.

 

Микроконтроллеры XMEGA имеют примеча­тельную архитектурную особенность, позво­ляющую значительно снизить энергопотреб­ление всего кристалла как в активном режиме, так и в режиме холостого хода Idle. Новые регистры PRR (Power Reduction Register) поз­воляют индивидуально останавливать так­тирование для периферийных блоков путем установки в PRR конкретного бита, соответс­твующего определенному периферийному блоку. При этом текущее состояние этого бло­ка «замораживается» и соответствующие ре­гистры ввода/вывода не могут быть записаны или прочитаны. Ресурсы, ассоциированные с этим блоком и занятые этим блоком, тоже будут оставаться недоступными, поэтому в большинстве случаев имеет смысл запретить работу периферийного блока до прекраще­ния подачи тактовой частоты. Возобновление тактирования узла приводит к полному вос­становлению его состояния на момент «замо­розки». В других режимах пониженного энер­гопотребления использование регистров PRR не требуется, так как сигнал периферийной тактовой частоты отсутствует, и тактирование периферии не осуществляется.

Отметим, что не все микроконтроллеры XMEGA имеют набор периферийных модулей, полностью ассоциированный с битами в ре­гистрах PRR. Может случиться, что для каких-то блоков на кристалле в регистрах нет соот­ветствующих битов остановки тактирования. В таких случаях установка бита в PRR не будет иметь никакого эффекта.

 

Конфигурируемые порты ввода/вывода.

Порты ввода/вывода у всех микроконтрол­леров AVR традиционно имеют три управля­ющих бита для каждого физического вывода: бит данных (PORTx), бит управления направ­лением передачи данных (DDRx) и бит для отображения логического уровня сигнала на физическом выводе микросхемы (PINx). Для конфигурации линии порта также ис­пользуется бит PUD регистра SFIOR, с помо­щью которого вывод подтягивается к шине питания через внутренний резистор. Это поз­воляет обеспечить истинную функциональ­ность вида «чтение — модификация — запись» и независимо выполнять битовые операции на любой линии порта. Порты ввода/вывода AVR, их конфигурирование, управляющие регистры и особенности работы подробно описаны в многочисленных изданиях и здесь мы на этом останавливаться не будем.

Удачное построение портов ввода/вывода AVR было оставлено и для XMEGA, причем разработчики кристалла сохранили весь ба­зовый набор регистров. Но для микроконт­роллеров нового поколения был сделан ряд важных усовершенствований:

– изменились символические имена управляющих регистров, они стали более «естественными» для восприятия. Так, бит данных теперь обозначается OUTx, бит управления направлением передачи данных — DIRx, а бит для отображения логического уровня сигнала на физическом выводе микросхемы — INx;

– расширились возможности работы портов ввода/вывода: каждая линия порта теперь имеет 6 конфигураций и 8 режимов работы. Гибкая конфигурация обеспечивается благодаря наличию нового специального регистра PINnCTRL;

– для более эффективного битового управления линиями портов ввода/вывода для OUTx и DIRx добавлены функции «установить» — SET, «сбросить» — CLR и «переключить» — TGL. Соответственно, введены дополнительные наборы регистров для OUT (OUTSET, OUTCLR, OUTTGL) и DIR (DIRSET, DIRCLR, DIRTGL);

– с помощью виртуальных регистров реализована возможность отображения регистров порта в адресное пространство I/O памяти, доступное для манипуляции битами;

– доступно синхронное или асинхронное обнаружение изменения входного сигнала на внешнем выводе с формированием события или запроса на прерывание, включая выведение микроконтроллера из режимов пониженного энергопотребления;

– реализовано управление скоростью нарастания выходного сигнала;

– добавлено групповое управление конфигурацией сразу нескольких линий порта за одну операцию при помощи маски;

– имеется возможность подключения к линии порта сигнала периферийной тактовой частоты и выхода одного из каналов системы событий.

Все описанные функции доступны для каждой линии портов ввода/вывода XMEGA. Отметим, что в процессе работы микроконтроллера операции с какой-то отдельной линией порта не оказывают влияния на функционирование других линий этого же порта и других портов ввода/вывода. Это относится к изменению направления передачи данных, к изменению логического уровня на выводе микросхемы при конфигурации на выход и к подключению (отключению) внутренних резисторов при конфигурации на вход.

Регистр PINnCTRL используется для реализа­ции новых режимов конфигурации и работы линии порта ввода/вывода. Каждый вывод те­перь может быть сконфигурирован как Push-Pull (двухтактный каскад с симметричной на­грузочной способностью), как монтажное «И» или как монтажное «ИЛИ». Можно разрешить инверсию сигнала на отдельной линии порта при вводе/выводе данных, а также разрешить ограничение скорости нарастания сигнала на ней при выводе данных. Управление скоро­стью нарастания выходного сигнала снижает энергопотребление узла. В среднем, после включения этого ограничения длительность фронта/среза выходного сигнала увеличива­ется на 50-150% в зависимости от напряжения питания микроконтроллера, рабочей темпе­ратуры и характера нагрузки.

Для режима Push-Pull есть 4 возможные кон­фигурации: собственно Push-Pull (или Totem-pole), подтяжка к «земле» (Pull-down), под­тяжка к шине питания (Pull-up) и сохранение последнего активного состояния на шине (Bus-keeper). В конфигурации Bus-keeper порт может работать в двух  направлениях — на при­ем и на передачу. Этот позволяет избежать колебаний сигнала на выводе при отключении нагрузки, а также когда мы запрещаем работу линии порта на выход. Слаботочные буферы Bus-keeper удерживают на выводе микро­схемы логический уровень сигнала, который присутствовал последним: то есть реализу­ется подтяжка к «1», если последний уровень был «1», или подтяжка к «земле», если послед­ний уровень был «0». Для конфигураций Pull­down и Pull-up подтяжка вывода к «земле» или к шине питания осуществляется через активный резистор только в том случае, если линия порта работает на вход. Такое решение позволяет снизить энергопотребление. Для режимов монтажное «И» и монтажное «ИЛИ» дополнительные резисторы подтяжки (pull-up и pull-down соответственно) могут быть под­ключены к выводу микросхемы как при рабо­те на вход, так и при работе на выход.

Подключение/отключение внутренних резис­торов подтяжки при помощи регистра конфи­гурации PINnCTRL является удачным решени­ем разработчиков XMEGA. Благодаря этому на выводе микроконтроллера не наблюдает­ся промежуточных состояний линии порта, когда мы переключаем направление работы порта или изменяем логическое значение на выводе.

Состав регистра PINnCTRL и назначение его битов подробно описаны в технической до­кументации на микроконтроллер. На рисунке проиллюстрированы все возможные конфи­гурации линии порта ввода/вывода XMEGA и режимы работы.

Программист имеет возможность вывести сигнал периферийной тактовой частоты на любую линию порта ввода/вывода. К линии порта также можно программно подключить канал 7 системы событий (Event Channel 7). Если в этом канале генерируется событие, то соответствующий этому событию сигнал будет отображаться на выводе микроконтроллера в течение одного периода периферийного так­тового сигнала.

Каждая линия порта ввода/вывода у XMEGA может быть запрограммирована на генера­цию событий или запросов на прерывание по фронту, срезу, перепаду или низкому уровню входного сигнала на выводе микроконтролле­ра. Если необходимо «почувствовать» высокий уровень, то следует использовать функцию инверсии путем установки бита INVEN в регист­ре PINnCTRL. Поддерживается синхронное и асинхронное обнаружение изменения вход­ного сигнала. Синхронное детектирование требует наличия сигнала периферийной так­товой частоты, асинхронное — не требует.

Генерация событий возможна только при нали­чии сигнала периферийной тактовой частоты, поэтому асинхронная генерация событий при детектировании изменения состояния вывода микроконтроллера невозможна. Для генера­ции события по фронту, срезу или перепаду значение сигнала на выводе должно изме­ниться в течение одного периода периферийной тактовой частоты. Если вывод запрограм­мирован для генерации события по наличию на нем сигнала низкого уровня, то данная линия порта непосредственно подключает­ся к каналу системы событий. При этом Event System постоянно отслеживает текущее зна­чение сигнала на выводе микроконтроллера: низкий уровень не генерирует событие, а при наличии высокого уровня события будут ге­нерироваться постоянно. Это может вызвать «бесконечную» генерацию событий. Конт­роль такой ситуации и необходимые действия должны осуществляться программистом.

Немного сложнее обстоит дело с генерацией запросов на прерывание. Каждый порт ввода/ вывода у микроконтроллеров XMEGA имеет два вектора прерывания. Программист мо­жет выбирать линии порта, которые будут ис­пользоваться для формирования запросов на прерывание по этим векторам. Тип изменения входного сигнала (фронт, срез, перепад или низкий уровень), которое вызывает генера­цию, будет зависеть от вида детектирования — синхронное или асинхронное.

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

Асинхронное детектирование интересно тем, что именно с его помощью можно вывести микроконтроллер из «спящих» режимов при изменении состояния сигнала на внешнем выводе. Отметим, что при асинхронном детек­тировании фронта, среза или перепада только линия 2 любого порта ввода/вывода XMEGA обладает возможностью действительно под­держивать полностью асинхронное детекти­рование. Это означает, что линия 2 будет опре­делять и «ловить» любое изменение входного сигнала с последующей генерацией запроса на прерывание. Все другие линии порта имеют ограничение по выведению микроконтролле­ра из «спящего» режима. Значение входного сигнала, которое изменилось в виде любого перепада, должно удерживаться на выводе до тех пор, пока кристалл не «проснется» и не по­явится сигнал тактовой частоты. Если в тече­ние этого времени сигнал вернется к первона­чальному значению, то микроконтроллер все равно «проснется», но запрос на прерывание не будет сгенерирован.

Низкий уровень входного сигнала на выводе микроконтроллера может детектироваться всеми линиями порта ввода/вывода независи­мо оттого, присутствует сигнал периферийной тактовой частоты или нет. Если линия порта сконфигурирована на генерацию прерывания по низкому уровню входного сигнала, запро­сы на прерывание будут возникать всегда, пока вывод удерживается в низком состоянии. Анализ состояния вывода в этом случае про­водится по-разному в зависимости от режима работы микроконтроллера. В активном ре­жиме низкий уровень должен удерживаться, пока не завершится текущая инструкция CPU, и только потом будет сформирован запрос на прерывание. В режимах пониженного энергопотребления низкий уровень должен удерживаться на выводе втечение всего времени «просыпания» микроконтроллера, и только потом запрос на прерывание может быть сге­нерирован. Если низкий уровень входного сигнала пропадет во время выхода из «спяще­го» режима, то микроконтроллер «проснется», но запроса на прерывание не будет.

В техническом описании на микроконтролле­ры XMEGA приводятся все случаи, когда будет происходить генерация запросов на прерыва­ние в зависимости от вида изменения входно­го сигнала на внешнем выводе микросхемы. Подробное описание последовательности действий для конфигурации линии порта вво­да/вывода для генерации запроса на прерывание можно найти в Application Note AVR1313.

Рассмотрим еще два новшества у портов вво­да/вывода XMEGA, которые позволяют снизить размер кода и увеличить скорость выполне­ния программы. Это групповая конфигурация нескольких выводов по маске и виртуальные регистры.

Идея добавления виртуальных регистров на кристалл XMEGA возникла из потребности обеспечить удобное и простое управление отдельными линиями каждого из многочис­ленных портов ввода/вывода новых микроконтроллеров.

Виртуальные регистры порта позволяют стан­дартным регистрам порта, расположенным в адресном пространстве расширенной облас­ти ввода/вывода (адреса старше 0x3F), быть отображенными на «базовое» для AVR адресное пространство области ввода/вывода (I/O Memory). Когда такое отображение осущест­вляется, запись в виртуальный регистр будет эквивалентна записи в реальный регистр пор­та. При этом для любого порта ввода/вывода XMEGA становится доступен весь ассортимент инструкций AVR для работы с регистрами, включая специальные команды манипуляции битами. Всего у микроконтроллеров XMEGA есть 4 виртуальных порта, поэтому одновре­менно может быть отображено до 4 портов ввода/вывода. Отображаемые регистры — IN, OUT,DIR и lNTFLAGS.

Почему так полезно использование виртуаль­ных регистров? Потому что разница во вре­мени исполнения и в размере генерируемого кода при работе с обычными и виртуальными портами может быть значительна. Некоторые инструкции из набора команд AVR могут ра­ботать только с регистрами, адреса которых в адресном пространстве AVR не старше 0x1F (0x3F). Использование именно этих команд вместо их эквивалентов (обращение к ячей­кам памяти по этим же адресам) происходит быстрее и занимает меньше процессорного времени. А ведь все адреса регистров пор­тов ввода/вывода XMEGA старше «заветной» границы пространства I/O Memory (0x3F). Вот для такой полезной «подмены» и используют­ся виртуальные регистры. Поясним сказанное на простом примере. Установим в высокий уровень линию 0 порта С, не меняя при этом состояние других линий этого порта:

// Использование виртуального порта PVIRT0
sbi PVIRT0_OUT, 0
// Код состоит из одного слова, время выполнения — 1 такт*)
// Прямая адресация порта С:
sbr r16, 0x01
sts PORTC_base + PORT_OUTSET_offset, r16
// Размер этого кода — 3 слова, время выполнения — 3 такта.
* Отметим, что хотя CPU выполняет команду «sbi» за один такт, для появления результата на линии ввода/вывода требуется 2 такта

Этот пример показывает, что использование виртуального порта позволяет сократить ис­пользуемый объем памяти программ и сокра­тить время исполнения для одинаковых опе­раций. Это особенно важно, когда требуется быстрое выполнение программы и осущест­вляется постоянное обращение к регистрам порта.

Поговорим теперь о групповой конфигура­ции. Наличие нового регистра конфигурации PINnCTRL для каждой линии порта ввода/вы­вода, безусловно, удобно и полезно. Но при этом также возрастает количество операций, необходимых для последовательной конфигу­рации всего порта, разряд за разрядом. В ре­зультате размер генерируемого кода сущест­венно увеличивается. В то же время очень часто встречаются ситуации, когда несколько линий одного порта должны быть сконфигу­рированы одинаковым образом. Для сокра­щения количества необходимых операций в таких случаях разработчики XMEGA добавили еще один специальный регистр — MPCMASK. Этот глобальный регистр является общим для всех портов ввода/вывода микроконтроллера и предназначен для одновременной конфи­гурации нескольких линий порта. Его исполь­зование позволяет создавать эффективный и компактный код.

Регистр MPCMASK загружается битовой мас­кой, которая затем используется при работе с конфигурационными регистрами PINnCTRL. Делается это так. Сначала программистом определяется необходимая маска конфигу­рации (битовый шаблон) в регистре MPCMASK — то есть набор требуемых линий порта, ко­торые нужно конфигурировать одинаковым образом. Запись «1» в бит «n» этого регистра означает, что линия порта «n» должна быть участником групповой конфигурации. Затем, когда любая линия этого порта конфигури­руется путем записи информации в ее ре­гистр PINnCTRL, во все остальные регистры PINnCTRL этого же порта, помеченные маской в регистре MPCMASK, записываются те же са­мые значения. Регистр MPCMASK очищается автоматически после окончания операции за­писи во все регистры PINnCTRL порта.

Отметим, что перед конфигурацией несколь­ких линий порта ввода/вывода с помощью маски рекомендуется глобально запретить все прерывания, а после завершения конфи­гурации — снова разрешить их. Это связано с аппаратными особенностями организации порта ввода/вывода XMEGA (подробнее см. в Application Note AVR1313).

 

Многоуровневый программируемый контроллер прерываний.

Как мы уже говорили выше, компания Atmel впервые реализовала у своих 8-разрядных микроконтроллеров AVR мно­гоуровневый программируемый контроллер прерываний (PMIC), который управляет обслу­живанием запросов на прерывание, включая уровень и приоритет.

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

Периферийным модулям в микроконтролле­рах XMEGA может быть назначен один из че­тырех различных уровней приоритета преры­ваний: Off (нет прерываний), High (высокий), Medium (средний) и Low (низкий). Прерывания с уровнем Medium будут приостанавливать работу обработчиков прерываний с уровнем Low. Запросы на прерывание, которым при­своен уровень High, обслуживаются немед­ленно после поступления. Внутри каждого из трех уровней (Low, Medium, High) приоритет обслуживания прерывания определяется ис­ходя из абсолютного адреса вектора преры­вания — вектор с наименьшим адресом обслу­живается в первую очередь. Для прерываний, имеющих одинаковый статус Low, дополни­тельно предусмотрена процедура диспетче­ризации Round Robin, когда все процессы ак­тивизируются в фиксированном циклическом порядке. И, несмотря на все нововведения, прерывания в XMEGA по-прежнему должны быть предварительно глобально разрешены для того, чтобы контроллер PMIC давал право обработчику вмешиваться в ход выполнения основной программы. Это выполняется про­граммно путем установки бита I в CPU Status Register, причем данный бит не сбрасывается в процессе обслуживания прерывания.

Когда в PMIC поступает запрос на прерывание, то сначала проводится анализ уровня посту­пившего запроса на прерывание и статуса те­кущих обслуживающихся прерываний. Затем поступивший запрос передается в обработку или помещается в очередь до момента, когда он получит право на обслуживание в соответс­твии со своим назначенным уровнем. После возвращения из обработчика прерывания ос­новной ход программы продолжается из той же точки, где он был прерван. Важно отметить, что одна следующая инструкция основной программы CPU всегда выполняется перед тем, как передать обслуживание обработчи­кам отложенных прерываний в очереди. Кор­ректный возврат из прерывания (по команде RETI) будет возвращать PMIC в состояние, ко­торое он имел перед входом в прерывание.

Все прерывания в XMEGA имеют собственные флаги. Когда наступает условие для прерыва­ния, соответствующий флаг устанавливается, даже если это прерывание не разрешено. Для большинства прерываний установлен­ный флаг автоматически сбрасывается после обслуживания прерывания. Можно сбросить флаг программно, записав в него логичес­кую «1». Некоторые флаги прерываний не сбрасываются после передачи управления обработчику, а некоторые сбрасываются ав­томатически, когда ассоциированный регистр изменяется по чтению или записи. Детали сле­дует смотреть в техническом описании на пе­риферийные модули XMEGA.

Флаги прерывания устанавливаются всегда. Если в текущий момент обслуживается пре­рывание более высокого уровня, флаг будет удерживаться до тех пор, пока не наступит очередь для обслуживания этого прерыва­ния. Даже если соответствующее прерывание не разрешено, его флаг все равно устанавли­вается и запоминается до тех пор, пока пре­рывание не будет разрешено или пока флаг не будет сброшен программно. Если глобально запрещены все прерывания, то флаги все рав­но устанавливаются и запоминаются до тех пор, пока все прерывания будут разрешены. Все отложенные прерывания в очереди потом будут обслужены в строгом соответствии с их установленным приоритетом обслуживания.

В контроллере прерываний XMEGA реализо­вана поддержка немаскируемых прерываний (NMI), которые также должны быть предварительно разрешены. Они жестко привязаны к аппаратным ресурсам микроконтроллера и к ряду системных функций процессора. Под­робную информацию о составе и работе NMI следует смотреть в техническом описании на каждый микроконтроллер. Например, для семейства А1 XMEGA доступно всего одно не­маскируемое прерывание — когда пропадает тактовая частота процессора.

Немаскируемые прерывания обслуживаются независимо от установки I-бита и никогда не изменяют этот бит. Они имеют самый высокий уровень приоритета — другие прерывания не могут повлиять на работу обработчика NMI. Если в одно и то же время обслуживания тре­буют несколько NMI, то порядок их обработки фиксирован — вектор с наименьшим адресом имеет высший приоритет.

Время отклика CPU на поступивший запрос на прерывание для всех разрешенных пре­рываний составляет как минимум 5 тактов системной частоты. В это время содержимое программного счетчика сохраняется в стеке. Затем выполняется безусловный переход на программу — обработчик прерывания, что за­нимает еще 3 такта. Если микроконтроллер находится в одном из энергосберегающих режимов, время реакции на исполнение увеличивается еще на 5 тактов плюс на время вы­хода микроконтроллера из текущего режима энергосбережения. Перед началом обслужи­вания любого запроса на прерывание процес­сорное ядро всегда завершает выполнение текущей инструкции.

Внутри каждого из уровней (Low, Medium, High) все прерывания имеют приоритет. Когда несколько запросов на прерывание находятся в очереди,  порядок их обслуживания определяется и уровнем прерывания, и приоритетом. Обслуживание прерываний может быть орга­низовано в статическом или динамическом (Round Robin) порядке. В микроконтроллерах XMEGA немаскируемые, High и Medium пре­рывания имеют только статический порядок обслуживания. Для прерываний с уровнем Low программисту доступна статическая и динамическая организация очередности об­служивания.

Вектора прерываний (IVEC) размещаются по фиксированным адресам в памяти программ микроконтроллера. Для статического поряд­ка значение адреса вектора определяет оче­редность обслуживания внутри одного и того же уровня прерываний, где наименьший по абсолютному значению адрес вектора имеет наивысший приоритет. Таблицу векторов пре­рываний для каждого конкретного микрокон­троллера XMEGA следует смотреть в техничес­кой документации.

Чтобы избежать возможных проблем с недо­ступностью обработчиков прерываний уров­ня Low в соответствии со статическим поряд­ком обслуживания, PMIC предоставляет для прерываний этого уровня интересную воз­можность динамического перераспределе­ния очередности — Round Robin или процеду­ру «карусельной диспетчеризации». Для этого в состав контроллера прерываний добавлен специальный регистр INTPRI. Когда процеду­ра диспетчеризации Round Robin разрешена, в этом регистре запоминается вектор преры­вания с уровнем Low, которое обслуживалось последним. Сохраненный вектор по отноше­нию к его следующему вызову будет теперь иметь наименьший приоритет. Проце­дура Round Robin эффективно работает в тех случаях, когда в очереди находятся несколько разрешенных прерываний из уровня Low, ко­торые будут обслуживаться в фиксированном циклическом порядке.

Отметим, что регистр PMIC.INTPRI доступен программисту для оперативного изменения порядка обслуживания и перестановок в оче­реди. Но он не сбрасывается к установкам по умолчанию, если процедуру «карусельной диспетчеризации» запретить в ходе выполне­ния программы. Поэтому для восстановления стандартного статического порядка (если необходимо) требуется записать в PMIC.INTPRI нулевое значение.

 

Система событий.

Система обработки событий (Event System) у микроконтроллеров XMEGA разрабатывалась для того, чтобы максимально разгрузить центральный процессор. Она организована внут­ри кристалла как набор аппаратных средств, с помощью которых различные периферий­ные модули могут обмениваться между собой служебной или командной информацией, а также передавать и принимать данные. Сис­тема событий доступна в активном режиме работы микроконтроллера и в одном из энергосберегающих режимов — Idle. Индикация изменения состояния периферийного модуля у XMEGA носит название «событие». Система событий дает возможность по изменению со­стояния одного периферийного модуля авто­матически вызывать определенные действия в других периферийных модулях. Причем ха­рактер принятия решения, а именно по какому из внешних возмущений может генерировать­ся определенное действие, программируется пользователем. При этом сохраняется исключительная гибкость в предоставлении прав каждому из периферийных узлов, которые подключены к системе событий.

В результате у разработчиков AVR XMEGA получилось предельно простое, но очень мощное аппаратное средство управления ав­тономным функционированием периферии без участия CPU, DMAC и контроллера преры­ваний. С помощью Event System значительно экономится процессорное время и сущест­венно разгружается система прерываний мик­роконтроллера, в основном за счет снижения количества запросов на прерывание. Блок-схема Event System показана на рисунке.

 

Событие может генерироваться при измене­нии состояния сигнала на внешнем выводе микроконтроллера, при срабатывании блока захвата/сравнения таймера, при переключе­нии аналогового компаратора и т.п. Поступаю­щее на выбранный периферийный модуль со­бытие также может инициировать различные действия — инкрементировать таймер, начать передачу данных через DMA, запретить выход сигнала ШИМ на внешний вывод микроконт­роллера и т.п.

Аппаратный узел, откуда исходит событие, называется генератором события. Внутри каждого периферийного модуля могут быть несколько источников событий. Например, у таймера/счетчика — это сравнение, перепол­нение или флаг ошибки. Аппаратный узел, на который поступает событие, называется приемником событий, а действие, которое он реализует, называется действием по событию.

 

Существует два типа событий — Signaling и Data. События «Signaling» лишь показывают изменение состояния, а события «Data» со­держат еще и дополнительную информацию. «Signaling» — это основной тип генерируемых событий. Подавляющее большинство перифе­рийных модулей может генерировать и при­нимать лишь такие события. Поэтому, когда ге­нерируется событие «Data» и оно приходит на периферийный модуль, который не может об­рабатывать содержащуюся в событии инфор­мацию, оно автоматически интерпретируется как «Signaling». Приемники событий, которые могут обрабатывать оба типа событий, долж­ны быть программным образом сконфигури­рованы на прием «Data» или «Signaling» перед началом работы. Подробную информацию следует смотреть в техническом описании на периферийные модули микроконтроллеров XMEGA.

В понятие «система событий» разработчи­ки XMEGA включили генераторы событий, средства для передачи событий и приемники событий. События передаются между перифе­рийными модулями при помощи специализи­рованной матрицы соединений на кристалле XMEGA, которая носит название Event Routing Network. Она состоит из 8 мультиплексоров и собственно матрицы межсоединений, где ре­ализовано до 8 параллельных каналов пере­дачи сигналов (Event Channels) и все события «разводятся» на все мультиплексоры.

Центральный процессор (CPU) не является частью системы событий, но показан на блок-схеме Event System. Это означает, что у про­граммиста имеется возможность управлять генерацией событий из программы микроконтроллера или в режиме debug, используя встроенные средства внутрисхемной отладки на кристалле XMEGA. Для этой цели в структуре Event System предусмотрены два специаль­ных регистра — DATA и STROBE. Регистры до­ступны как в ходе выполнения программы, так и в режиме отладки, когда в AVR Studio можно изменять их содержимое в окне Ю View и, со­ответственно, генерировать события. Каждый бит в регистрах соответствует определенному каналу Event System: бит 0 — каналу 0, бит 1 -каналу 1 и т.д. По умолчанию, в обоих регис­трах записаны нулевые значения. Установка любого бита в любом из регистров иниции­рует определенное действие. Регистр DATA ответственен за тип генерируемого события и должен быть изменен первым, так как запись в регистр STROBE лишь генерирует событие. Подробнее соотношение и структура работы представлены в таблице.

Отметим, что все каналы в Event System аппаратно независимы. Поэтому у программиста имеется возможность генерировать до вось­ми синхронных событий, одновременно уста­навливая биты желаемых каналов в регистрах DATA и STROBE.

Полная структурная схема системы событий микроконтроллеров XMEGA приведена на рисунке. Здесь наглядно видно, как организова­на матрица межсоединений и каким образом мультиплексоры могут коммутировать собы­тия между генераторами и приемниками. Каж­дый мультиплексор имеет два регистра уп­равления, доступные программисту. Регистр CHnMUX определяет, какое из входящих на мультиплексор событий коммутируется на со­ответствующий выходной канал событий Event Channel (n = 0 …7). РегистрCHnCTRL использу­ется на выходе мультиплексора для организа­ции дополнительных функций — фильтрации и квадратурного декодирования. Наличие вось­ми мультиплексоров означает, что у разработчика имеется возможность «развести» до восьми событий одновременно. Также можно «распараллелить» одно и то же событие на не­сколько мультиплексоров. Структура матрицы соединений в Event System одинакова для всех микроконтроллеров XMEGA. Конечно, пред­ставители разных семейств XMEGA имеют раз­личные наборы периферии, но с точки зрения Event System это означает, что отсутствующий периферийный модуль не может генериро­вать и принимать события.

Как правило, генерация события занимает один период системной тактовой частоты. Отметим, что некоторые генераторы событий (например, изменившийся уровень на линии порта ввода/вывода) формально имеют возможность генерировать события постоянно. Забота об отслеживании таких ситуаций лежит на программисте. От момента генерации собы¬тия до момента, когда оно «защелкивается» в приемнике, проходит два периода системной тактовой частоты. Первый — от наступления события до его регистрации матрицей меж¬соединений Event System по первому фронту тактового сигнала. Второй такт требуется на трансляцию события через Event Channel до приемника. Поэтому временные параметры работы системы событий практически точно предсказуемые. Это обстоятельство значи¬тельно повышает надежность принятия реше¬ний и обработки данных: критичные ко време¬ни или к стабильности выполнения функции теперь становятся более прогнозируемыми, а значит, увеличивается надежность работы всего микроконтроллера в целом.

Рассмотрим подробнее дополнительные воз­можности Event System, которые «привязаны» к выходам мультиплексоров и соотносятся с каналами передачи событий Event Channels. Этими дополнительными возможностями уп­равляет регистр CHnCTRL.

Первая дополнительная функция — цифровая фильтрация. Каждый канал системы событий снабжен программируемым цифровым фильт­ром. Поступающее событие будет опраши­ваться определенное число раз перед тем, как оно будет передано дальше по направлению к приемнику события. Основное назначение та­кой фильтрации — опрос изменения состояния входных линий микроконтроллера. Другими словами — теперь можно аппаратно устранить дребезг контактов, которые непосредственно подключаются к выводам микроконтроллера. Такая функция избавит разработчика от необ­ходимости писать соответствующую противодребезговую процедуру и снизит нагрузку на центральный процессор.

Работа цифрового фильтра разрешена всегда. Три младших бита регистра CHnCTRL опреде­ляют длительность временного промежутка, в течение которого источник события постоян­но опрашивается. Событие будет отправлено в соответствующий канал только после того, как стабильность состояния источника собы­тия будет подтверждена в течение нескольких периодов периферийного тактового сигнала. Количество опросов (от одного до восьми) оп­ределяется тремя битами DIGFILT[2:0].

Вторая дополнительная функция — работа с квадратурно — кодированными сигналами. В состав системы событий для каналов с номерами 0, 2 и 4 включены три квадратурных декодера (QDEC). Это позволяет Event System декодировать входящие квадратурно — ко­дированные сигналы на линиях порта ввода/вывода и затем генерировать и посылать события «Data», которые могут интерпретиро­ваться таймером/счетчиком и вызывать соот­ветствующие действия по событию: считать «вверх», считать «вниз» или вырабатывать сиг­нал ошибки или сброса.

Обсуждаем на форуме https://phreaker.ru/forum/showthread.php?t=690

Знакомство с XMEGA. Часть 1

Знакомство с XMEGA. Часть 3

Материалы подготовил CivicDriver