AVR XMEGA
XMEGA — старшая линейка 8-битных AVR с 16-битными периферийными модулями: DMA, системой событий, трёхуровневым контроллером прерываний, PLL и 12-битными АЦП и ЦАП. Разбираем, чем XMEGA отличается от классических ATmega, как устроены память, тактирование и прерывания, и даём примеры настройки на C.
Обновлено Редакция GAW
XMEGA — семейство 8/16-битных микроконтроллеров AVR, которое Atmel выпустила как развитие ATmega: то же ядро и та же система команд, но новая, более мощная периферия и питание 1,6–3,6 В. Ниже — по руководству XMEGA AU (8331F) и даташиту ATxmega128A1U (8385I): что изменилось по сравнению с классическими AVR, как устроены память, тактирование и прерывания, и как всё это настраивается на C.
Коротко
- Ядро AVR с 142 командами и аппаратным умножителем; регистровый файл r0–r31 лежит отдельно и в памяти данных не отображается.
- Модули периферии — порты, таймеры, USART и другие — описаны структурами регистров в I/O-памяти размером до 4 КБ.
- Тактирование: после сброса — внутренний генератор 2 МГц; есть генератор 32 МГц, PLL до 128 МГц на выходе, автоподстройка DFLL.
- Прерывания: три программируемых уровня (низкий, средний, высокий) плюс немаскируемые, круговой приоритет на низком уровне.
- Новая периферия: DMA на 4 канала, система событий на 8 каналов, 12-битные АЦП и ЦАП, дробный генератор скорости USART, AES и DES.
- ATxmega128A1U: 128 КБ Flash, 8 КБ ОЗУ, 2 КБ EEPROM, 78 линий ввода-вывода, до 12 МГц от 1,6 В и до 32 МГц от 2,7 В.
Чем XMEGA отличается от ATmega
| Классические ATmega | XMEGA | |
|---|---|---|
| Регистры r0–r31 | отображены на адреса 0x00–0x1F памяти данных | отдельное адресное пространство |
| Регистры периферии | 64 адреса I/O и расширенный I/O | I/O-память до 4 КБ, модули со структурами регистров |
| Защита настроек | своя последовательность у каждого регистра | общий механизм CCP |
| Прерывания | фиксированный приоритет по номеру вектора | контроллер PMIC: три уровня, NMI, круговой приоритет |
| Перенос данных | только программой | DMA и система событий без участия ядра |
| Прошивка | ISP (SPI), у части — JTAG | PDI, у части — JTAG |
| Питание | у ATmega328P — до 5,5 В | 1,6–3,6 В |
Система команд у XMEGA почти та же, что у других AVR; несколько команд, например обмена с памятью XCH, LAS, LAC и LAT и шифрования DES, есть только у XMEGA — подробно в системе команд AVR. Адресное пространство расширено до 16 МБ памяти программ и 16 МБ памяти данных с помощью регистров RAMP.
Память и регистры модулей
Память данных XMEGA начинается с I/O-памяти (до 4 КБ), с адреса 0x1000 может быть отображена EEPROM (по умолчанию она адресуется отдельно, через контроллер NVM), внутреннее ОЗУ всегда начинается с 0x2000, а за ним — внешняя память, подключаемая через интерфейс EBI. Регистры каждого модуля образуют непрерывный блок: в заголовках avr-libc модуль — это структура, например PORTE.DIRSET или USARTC0.BAUDCTRLA, а имя модуля указывает на её базовый адрес (PORTE — 0x0680, USARTC0 — 0x08A0 у ATxmega128A1U).
Команды IN и OUT достают только до адресов 0x00–0x3F, а битовые SBI, CBI, SBIS и SBIC — до 0x00–0x1F. Первые 16 адресов отведены под регистры общего назначения GPIO, удобные для флагов. Чтобы обращаться к порту одиночными командами, его отображают в одну из четырёх виртуальных портов VPORT0–VPORT3, которые лежат в нижней части I/O-памяти.
Защита изменения конфигурации (CCP)
Регистры, ошибочная запись в которые может нарушить работу кристалла, — выбор тактовой частоты, программный сброс, настройки сторожевого таймера — защищены. Чтобы изменить такой регистр, программа записывает в регистр CCP сигнатуру 0xD8 (IOREG), а затем в течение четырёх циклов команд — новое значение в защищённый регистр. Сигнатура 0x9D (SPM) так же открывает выполнение команд SPM и LPM для работы с Flash. На время защищённой последовательности прерывания игнорируются, а любая другая запись в I/O или память данных её прерывает. На C обе записи ставят вплотную друг к другу и проверяют по листингу, что компилятор не вставил между ними лишних команд.
Тактирование
| Источник | Частота |
|---|---|
| Внутренний RC-генератор | 2 МГц, после сброса — системная частота |
| Внутренний RC-генератор | 32 МГц |
| Внутренний генератор | 32,768 кГц |
| Генератор ULP | 32 кГц, выход 1 кГц для сторожевого таймера |
| Кварцевый генератор | 0,4–16 МГц или 32,768 кГц |
| PLL | выход 20–128 МГц, умножение ×1…×31 |
После сброса работают только генератор 2 МГц и генератор ULP, и кристалл всегда стартует на 2 МГц. Системный такт проходит через предделители с коэффициентом от 1 до 2048, причём часть периферии может тактироваться вдвое и вчетверо быстрее ядра. Внутренние генераторы 2 и 32 МГц автоматически подстраиваются модулями DFLL по опорному сигналу — внутреннему генератору 32,768 кГц, часовому кварцу на выводах TOSC, внешнему тактовому сигналу или кадрам USB (SOF), — что убирает уход частоты с температурой и напряжением. Монитор отказа переключает систему на внутренний генератор и вызывает немаскируемое прерывание, если внешний генератор или PLL остановились.
Переход на внутренний генератор 32 МГц:
#include <avr/io.h>
static void clock_32mhz(void)
{
OSC.CTRL |= OSC_RC32MEN_bm; /* enable the 32 MHz RC oscillator */
while (!(OSC.STATUS & OSC_RC32MRDY_bm)) { /* wait until it is stable */
}
CCP = CCP_IOREG_gc; /* 0xD8: unlock protected I/O registers */
CLK.CTRL = CLK_SCLKSEL_RC32M_gc; /* switch the system clock */
}
Прерывания: контроллер PMIC
У каждого источника прерывания свой вектор и своя настройка уровня: низкий, средний или высокий. Прерывание более высокого уровня прерывает обработчик более низкого. Внутри уровня порядок определяется адресом вектора, а для низкого уровня можно включить круговой (round-robin) приоритет, чтобы частые запросы не блокировали остальные. Отдельно стоят немаскируемые прерывания для критичных событий, например отказа генератора. Векторы можно разместить в начале прикладной секции Flash или в секции загрузчика.
Помимо глобального флага I в SREG — при входе в прерывание он, в отличие от классических AVR, не сбрасывается — каждый уровень разрешается своим битом в регистре PMIC.CTRL. Без этого не сработает ни одно прерывание соответствующего уровня, даже если в модуле оно включено:
PMIC.CTRL |= PMIC_LOLVLEN_bm | PMIC_HILVLEN_bm; /* enable low and high levels */
sei();
DMA и система событий
Контроллер DMA с четырьмя каналами переносит данные между памятью и периферией без участия ядра: память–память, память–периферия, периферия–память и периферия–периферия, от 1 байта до 16 МБ за транзакцию, блоками до 64 КБ с повтором. У каждого канала свой источник запуска, своё прерывание и свои режимы адресации.
Система событий — это 8 каналов, по которым модули сигнализируют друг другу напрямую: например, переполнение таймера запускает преобразование АЦП, а фронт на выводе — захват таймера. Задержка доставки события фиксирована и не зависит от загрузки ядра. В систему событий встроены квадратурный декодер для энкодера и цифровой фильтр сигналов с выводов. События работают в активном режиме и в режиме сна Idle.
Порты
Порт XMEGA управляется регистрами DIR и OUT, у которых есть «половинки» SET, CLR и TGL: запись единицы в OUTSET устанавливает только выбранные биты, OUTTGL их переключает, и чтение-изменение-запись не нужно. Каждый вывод имеет свой регистр PINnCTRL: режим выхода (двухтактный, «монтажное И», «монтажное ИЛИ»), подтяжку вверх или вниз, удержание шины, инверсию и условие срабатывания прерывания — по любому фронту, по нарастающему, по спадающему или по низкому уровню. Прерывания и события доступны на всех выводах общего назначения.
PORTE.DIRSET = PIN0_bm; /* PE0 is an output */
PORTE.OUTTGL = PIN0_bm; /* toggle PE0 */
PORTE.PIN1CTRL = PORT_OPC_PULLUP_gc; /* PE1 is an input with pull-up */
Таймеры, сторож и сон
16-битные таймеры-счётчики бывают двух типов: тип 0 с четырьмя каналами сравнения или захвата и тип 1 с двумя; у ATxmega128A1U их по четыре. Два таймера можно каскадировать в 32-битный. Период и каналы буферизованы, поддерживаются ШИМ с одним и двумя наклонами, захват с подавлением шума и захват частоты. Расширение Hi-Res повышает разрешение ШИМ, а AWeX добавляет комплементарный выход к каждому каналу сравнения и четыре узла вставки мёртвого времени с отдельной настройкой для верхнего и нижнего ключа — у ATxmega128A1U AWeX есть на двух таймерах.
Сторожевой таймер тактируется от генератора ULP (1 кГц) и имеет 11 периодов от 8 мс до 8 с, обычный и оконный режимы и блокировку настроек. Режимов сна пять: Idle, Power-down, Power-save, Standby и Extended standby; в активном режиме и Idle ненужные модули отключают регистрами снижения потребления PR. Источники сброса: включение питания, внешний сброс, сторожевой таймер, детектор пониженного напряжения, PDI и программный сброс; причину сброса показывает регистр статуса.
USART и дробный генератор скорости
Скорость USART задают 12-битное значение BSEL и масштаб BSCALE от −7 до +7. При BSCALE ≥ 0 и обычной скорости (CLK2X = 0):
Отрицательный BSCALE даёт дробное деление и позволяет получать стандартные скорости с малой ошибкой почти от любой частоты. Пример: на частоте после сброса 2 МГц для 9600 бод BSEL = 2 000 000 / (16 · 9600) − 1 ≈ 12, фактическая скорость 2 000 000 / (16 · 13) ≈ 9615 бод, ошибка +0,16 %.
/* USARTC0 at 9600 baud from 2 MHz: BSEL = 12, BSCALE = 0 */
PORTC.OUTSET = PIN3_bm; /* TXD0 (PC3) idles high */
PORTC.DIRSET = PIN3_bm; /* and is an output */
USARTC0.BAUDCTRLA = 12;
USARTC0.BAUDCTRLB = 0;
USARTC0.CTRLC = USART_CHSIZE_8BIT_gc; /* 8N1 */
USARTC0.CTRLB = USART_TXEN_bm | USART_RXEN_bm;
Ошибку скорости для других частот и делителей покажет калькулятор скорости UART.
Программирование и отладка
Все XMEGA программируются и отлаживаются через PDI — быстрый двухпроводный интерфейс, у которого линией тактов PDI_CLK служит вывод RESET, а данные передаются по выводу PDI_DATA. У ATxmega128A1U есть и JTAG с граничным сканированием. ISP-программатор для ATmega к XMEGA не подойдёт: нужен программатор с поддержкой PDI.
Классические ATmega и ATtiny описаны на странице архитектуры AVR, а обзор всех семейств AVR — в разделе AVR. Для задач, где не хватает 8-битного ядра, стоит посмотреть на ARM Cortex-M.
Частые вопросы
Чем XMEGA отличается от ATmega?
Ядро то же — AVR, но с 142 командами и регистровым файлом в отдельном адресном пространстве. Периферия устроена модулями с регистрами в I/O-памяти до 4 КБ, появились DMA на 4 канала, система событий на 8 каналов, контроллер прерываний с тремя уровнями, PLL, 12-битные АЦП и ЦАП, дробный генератор скорости USART. Питание — от 1,6 до 3,6 В, частота до 32 МГц. Прошивают XMEGA по PDI или JTAG, а не по ISP.
Почему XMEGA после сброса работает на 2 МГц?
После любого сброса XMEGA всегда стартует от внутреннего генератора 2 МГц, а остальные источники, кроме генератора 32 кГц ULP, выключены. Чтобы работать на 32 МГц, программа включает генератор 32 МГц, дожидается его готовности и переключает системную частоту — запись в CLK.CTRL защищена механизмом CCP.
Что такое CCP у XMEGA?
Configuration Change Protection — защита критичных регистров и команд SPM и LPM от случайного изменения. Программа записывает в регистр CCP сигнатуру — 0xD8 для защищённых регистров I/O или 0x9D для SPM/LPM — и в течение четырёх команд выполняет защищённую запись. На это время прерывания игнорируются.
Чем прошивают XMEGA?
Через PDI — двухпроводный интерфейс программирования и отладки, у которого линией тактов служит вывод RESET, а данные идут по выводу PDI_DATA. У части кристаллов, например у ATxmega128A1U, есть и JTAG. ISP-программатор для классических ATmega к XMEGA не подходит.
Источники
- Atmel. XMEGA AU Manual (8331F, 04/2013) — гл. 3 — ядро (142 команды, регистровый файл вне памяти данных, CCP с сигнатурами 0xD8 и 0x9D); гл. 4 — память и I/O; гл. 5 — DMA; гл. 6 — система событий; гл. 7 — тактирование; гл. 8 — сон; гл. 9 — сброс; гл. 11 — WDT; гл. 12 — PMIC; гл. 13 — порты и виртуальные порты; гл. 14 — таймеры; гл. 23 — USART и дробный генератор скорости; PDI
- Atmel. ATxmega64A1U / ATxmega128A1U Datasheet (8385I, 09/2014) — память, периферия, 1,6–3,6 В, до 12 МГц от 1,6 В и до 32 МГц от 2,7 В, корпуса, назначение выводов (PC3 — TXD0)
- AVR-LibC: заголовок iox128a1u.h (github.com/avrdudes/avr-libc) — имена регистров и масок для примеров: CCP, CLK, OSC, PMIC, PORTE, USARTC0
Нашли ошибку?
Смотрите также
- AVRATmega, ATtiny, AVR Dx/Ex: семейства, прошивка, инструменты
- Архитектура AVRЯдро, конвейер, память, порты, прерывания, сброс, такты и сон
- Система команд AVRВсе инструкции с флагами и тактами, адресация, примеры кода
- Скорость UARTUBRR, BRR, TH1 и ошибка скорости
- ARM Cortex-MЯдра M0–M85: архитектуры, FPU, DSP, MPU, TrustZone, выбор