AVR Studio 5.0 и XMEGA256A3. Начало.

AVR
Посетив хэндс-он от Атмела по AVR Studio 5, AVR Software Framework и XMEGA, хочу поделиться с сообществом свежими знаниями. Начну с того, что новая версия студии претерпела значительные изменения и на мой взгляд стала значительно удобнее для использования. Основные новшества: использование Microsoft Visual Studio 2010 в качестве основы, и объединение сред разработки для 8- и 32-битных МК в одно целое, теперь самое главное правильно указать целевой МК при создании проекта:). Ну и про введение такой штуки как AVR Software Framework(ASF) тоже не стоит забывать. Если коротко, то Атмел сделал готовый фреймворк для работы с различной перефирией МК и теперь для многих вещей достаточно подключить необходимые «драйверы» к своему проекту. Посмотрим, что же из всего этого получилось.
Оговорюсь сразу, все написанное делается на основе материалов с семинара, поэтому скриншоты я нагло стыбзил с их презентации, а все эксперименты будут делаться на отладочной плате XMEGA-A3BU Xplained, но весь код и описанные приемы актуальны и для других МК линейки AVR, главное при создании проекта правильно выбрать нужный МК и поменять порты и пины на нужные. Плата представляет собой такую штуку:

В МК уже залит бутлоадер, поэтому прнограмматор не нужен, достаточно зажать SW0, воткнуть USB шнурок, поставить дрова на новое устройство и поставить программу Atmel Flip 3.4.4.
Запускаем студию. Одно из новшеств — включение C/C++ компилятора в комплект, теперь AVR GCC отдельно ставить не надо, да и не получится походу. Ассемблер тоже на месте. Еще в комплекте идет порядка 400 примеров, которые можно открыть из студии, при этом есть возможность отфильтровать по разным критериям. Еще полезная фишка — при выборе целевого МК справа появляется прямая ссылка на его даташит и список программаторов/отладчиков совместимых с ним.


Также очень полезная фишка — Intelligent Editor (кто работал в Visual Studio, знают о чем я, просто я не помню как оно точно называется). Когда мы начинаем вводить различные ключевые слова синтаксиса или функции, содержащиеся в подключенных библиотеках, редактор кода автоматом предлагает варианты, при выборе которых сбоку появляется краткая справка из серии «чего это и нафиг оно надо».


В качестве ХеллоВорлда на семинаре предложили не классическое мигание светиком, а создание AVR Communication Device, по простому — МК подключается через USB к ПК и видится как обычный COM-порт в который можно что-то запульнуть и получить сдачи. Запускаем студию, в моем случае я выбрал уже готовый шаблон для моей платы, если платы не, то можно выбрать любой МК с поддержкой USB, поскольку насколько я понял часть ASF, отвечающая за реализацию различных USB-протоколов не привязана к каким-то определенным вещам, главное взять правильный МК и правильно модифицировать конфиги, все остальное ASF берет на себя. На семинаре показывали такую картинку:

Т.е. из кода вызываются уже готовые функции для работы с перефирией, которым передаются сведения о тех портах и пинах, где эта перефирия висит и некоторые настройки, а все остальное ASF делает сам. Итак, создаем пустой проект из шаблона и видим следующее:
#include <asf.h> //заголовочный файл для ASF

int main (void)
{
	board_init(); //если поставить курсор на функцию и нажать ALT+G, то откроется файл в котором эта функция описана
        //или список файлов, если есть перекрестные ссылки

	// Insert application code here, after the board has been initialized.
}

Теперь добавим «драйвер» для USB из ASF. Открываем Project -> Select Drivers from ASF

и видим следующую картину:

1 — Фильтр чего показывать
2 — Элементы ASF, которые мы можем подключить к нашему проекту нажатием кнопки «3»
Справа отображаются те модули, которые подключены к любому проекту по-умолчанию. Добавляем сервис USB CDC (Single Interface Device) и жмем «Next». Видим сводку по всем подключенным модулям, внимательно изучаем, а ну как забыли чего и жмем «Finish». Теперь нам надо настроить частоту МК для работы с USB. В студии в Solution Explorer открываем ветку src, в ней config и открываем файл conf_clock.h. В нем надо закомментировать дефолтные настройки и раскомментировать настройки для USB. Должно получиться следующее:

//#define CONFIG_SYSCLK_SOURCE        SYSCLK_SRC_RC2MHZ 
//#define CONFIG_SYSCLK_SOURCE        SYSCLK_SRC_RC32MHZ 
//#define CONFIG_SYSCLK_SOURCE        SYSCLK_SRC_RC32KHZ 
//#define CONFIG_SYSCLK_SOURCE        SYSCLK_SRC_XOSC 
//#define CONFIG_SYSCLK_SOURCE        SYSCLK_SRC_PLL 
 
/* Fbus = Fsys / (2 ^ BUS_div) */ 
//#define CONFIG_SYSCLK_PSADIV          SYSCLK_PSADIV_1 
//#define CONFIG_SYSCLK_PSBCDIV         SYSCLK_PSBCDIV_1_1 
 
//#define CONFIG_PLL0_SOURCE          PLL_SRC_XOSC 
//#define CONFIG_PLL0_SOURCE          PLL_SRC_RC2MHZ 
//#define CONFIG_PLL0_SOURCE          PLL_SRC_RC32MHZ 
//#define CONFIG_PLL0_SOURCE          PLL_SRC_XOSC 
 
/* Fpll = (Fclk * PLL_mul) / PLL_div */ 
//#define CONFIG_PLL0_MUL             (24000000UL / BOARD_XOSC_HZ) 
//#define CONFIG_PLL0_DIV             1 
 
// *************************************************************** 
// **                  CONFIGURATION WITH USB                   ** 
// *************************************************************** 
//! The following clock configuraiton can be used for USB operation 
//! It allows to operate USB using On-Chip RC oscillator at 48MHz 
//! The RC oscillator is calibrated via USB Start Of Frame 
//! Clk USB     = 48MHz (used by USB) 
//! Clk sys     = 48MHz 
//! Clk cpu/per = 24MHz 
#define CONFIG_USBCLK_SOURCE     USBCLK_SRC_RCOSC 
#define CONFIG_OSC_RC32_CAL      48000000UL 
#define CONFIG_OSC_AUTOCAL          OSC_ID_RC32MHZ 
#define CONFIG_OSC_AUTOCAL_REF_OSC  OSC_ID_USBSOF 
#define CONFIG_SYSCLK_SOURCE     SYSCLK_SRC_RC32MHZ 
#define CONFIG_SYSCLK_PSADIV     SYSCLK_PSADIV_2 
#define CONFIG_SYSCLK_PSBCDIV    SYSCLK_PSBCDIV_1_1 
 
// ********** END OF USB CLOCK CONFIGURATION ********************** 


Там же открываем файл conf_usb.h ищем и правим две строчки, которые содержат VENDOR_ID и PRODUCT_ID, можно поставить такие значения:

#define  USB_DEVICE_VENDOR_ID             0x03EB 
#define  USB_DEVICE_PRODUCT_ID            0x2404 

Переходим к написанию кода. Открываем в разделе src файл main.c и дописываем в него следующие строчки:
#include <sleepmgr.h> //sleep manager
#include <sysclk.h> //system clock
#include <udc.h> // USB device stack


После board_init(); добавляем:
irq_initialize_vectors(); //инициализируем вектора прерываний
cpu_irq_enable(); //разрещаем прерывания
sleepmgr_init(); //инициализируем sleep manager
sysclk_init(); инициализируем clock service
udc_start(); //запускаем USB стек
udc_attach(); //подсоединяемся к хосту
while(1); //ну и классический бесконечны цикл, куда можно добавить что-то свое. 

Сохраняемся, жмем F7 и если проект построился без ошибок, то его можно залить в МК и запустить. В системе должно появиться новое неизвестное устройство, которое после установки соответствующего драйвера превратится в обычный COM-порт, который пока ничего не шлет нам, да и в него можно слать гигабайты инфы без всякого проку. Важное отступление: Атмел рекомендует чтобы в пути к файлам проекта не было пробелов и русских букв в названии папок и файлов. У кого стоит Win7 и имя пользователя на английском это замечание неактуально, там все по-умолчанию нормально, остальным рекомендуется перенести папку, где проекты сохраняются по-умолчанию, куда-нибудь в другое место.
Добавим в нашу прошивку немного интерактива. Сделаем так, чтобы при отправке строки xmega в COM-порт, нам приходил ответ. Для работы с символами и строками через USB в ASF есть следующие функции:
udi_cdc_getc() - возвращает символ, пришедший в МК 
udi_cdc_putc() - шлет символ из МК 
udi_cdc_write_buf() - шлет содержимое буфера (например, строку) из МК 
udi_cdc_read_buf() - читает строку, пришедшую в МК, и сохраняет ее в буфер.


Добавим в бесконечный цикл следующий код:
while(1){ 
   
if (udi_cdc_getc()!= 'x') 
      continue; // Wrong key 
if (udi_cdc_getc()!= 'm') 
      continue; // Неправильный символ 
if (udi_cdc_getc()!= 'e') 
      continue; // Неправильный символ 
if (udi_cdc_getc()!= 'g') 
      continue; // Неправильный символ 
if (udi_cdc_getc()!= 'a') 
      continue; // Неправильный символ 
if (udi_cdc_getc()!= '\r') 
      continue; // Неправильный символ 
   
//когда приходит строка 'xmega', посылаем в ответ 'congratulation' 
udi_cdc_putc('\n'); 
udi_cdc_write_buf("congratulation!!!\n", sizeof("congratulation!!!\n")); 
}


Вот и все, теперь у нас есть девайс, на котором реализован полноценный обмен через виртуальный COM-порт по USB. Точно так же можно реализовывать и другие протоколы USB за исключением хоста, например:
DFU: the USB bootloader
HID (Human Interface Device): Mouse, Keyboard, Generic…
MSD: Flash disk, data logger…
CDC: Communication Device Class
PHDC: Personal Healthcare Device Class
Composite Device

Еще важной особенностью этих xmega является то, что для полноскоростной работы USB достаточно внутреннего осциллятора, никаких внешних кристаллов не требуется.

Если интересно, распишу как работать с графическим дисплеем и АЦП платы. В прилагаемом архиве даташит на xmega256A3BU, мануал к отладке XMEGA-A3BU Xplained и драйвер виртуального COM-порта. Если кому надо, пишите в комментариях, могу выложить саму студию, апдейт к ней и апдейт для ASF, которые нужны, если работать с этой платой(дома канал на аплоад очень дохлый, буду тогда заливать с работы).

UPDATE:
Архив со всеми презентациями с семинара:
http://rghost.ru/29005641
Файлы в топике: xmega.zip

Комментарии (18)

RSS свернуть / развернуть
… а это не тот тренинг на который я как-то давал ссылку? если да то платка еще круче чем я предполагал
0
Судя по программе это оно и есть, только я был на таком же семинаре в СПб 2.11.
0
а можно всю презенташку увидеть? интересные возможности AVR ST5 — не знал…
0
Добавил архив со всеми презентацими.
0
Спасибо!
0
я не могу скачать? Вы его не удаляли?
0
Проверил, ссылка работает, она должна жить 30 дней с момента публикации. Если что, пишите. перезалью еще куда-нибудь.
0
выглядит заманчиво, а то что то xmega совсем списал со счетов
0
Спасибо за статью, наконец-то информация с первых рук.

Бутлоадер — очень хорошо
Полноценный юсб — очень хорошо
Библиотека стандартных компонентов — оцень халасо, ня!
Цена и доступность — блииин…

Для «моргалок» эти процессоры слишком жирны. Для мультимедийных устройств слишком слабы, да и памяти не так уж много. В своей весовой категории появилась куча конкурентов дешевле. Лучше б сделали замену меге8 и тини2313 подешевле и с большей периферией (хотя бы ЦАП). Боюсь что клиент проголосует рублём.
0
в плюс -паябельные корпуса и богатый набор интерфейсов
0
Интерфейсов сейчас в каждом чипе навалом — это не 8051 где все надо было самому колхозить. Разве что 8 уартов, но мало кому нужно столько. Насчет паябельности вопрос спорный. Во-первых, микроконтроллеры делают не для хобби, но для промышленного производства, где все корпуса хороши. Во-вторых, радиогубители давно освоили TQFP и многие предпочитают именно поверхностный монтаж- сверлить не надо. Дип разве что для макеток хорош.
Интересная вещь получится если скрестить ежа и ужа — АтХмегу с радиотрансивером. Подобные SoC уже не новость, но дешевые и удобные пока мне не попадались.
0
из мультимедиа можно плеер замутить с просмотром картинок и чтением. У Mikroelectronica есть даже демобоард для хмег в виде готового плеера с тачскрином, только батарейку прикрутить. www.mikroe.com/eng/products/view/688/mikromedia-for-xmega/
0
Вопросик, а AVR Studio 5 не поддерживает пока xmega256A3BU, как с ней работать?
0
  • avatar
  • GIgor
  • 01 декабря 2011, 12:38
Поддерживает, там надо поставить обновление для студии и обновление для ASF, скачать можно с сайта атмела или я могу выложить.
0
Студию скачал сегодня, 5.0.1223 с апгрейтом для ASF в ASF поддержка xmega256A3BU есть, а в студии нет, в компиляторе GCC есть. Но повторить ваши шаги из статьи не удаётся, при компиляции ошибка: нет usb_protocol.h. вот.
0
Я делал так: сначала поставил скачанную с сайта студию (5.0.1163), потом на семинаре доустановил AVRStudio5-ASF-Update-2.7.0.43 и AVRStudio5-part-pack-AVR_XMEGA_AU-5.0.240. Видимо, у Вас не хватает последнего файла.
0
Спасибо, получилось.
0
В МК уже залит бутлоадер, поэтому прнограмматор не нужен — с утра неиллюзорно доставило)))
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.