Модули последовательных коммуникаций.
Микроконтроллеры 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». Для конфигураций Pulldown и 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
Материалы подготовил CivicDriver