Atmel Software Framework (ASF): как это работает?

Немного теории


Atmel® Software Framework (ASF) — программная библиотека для микроконтроллеров, которая содержит широкий набор встраиваемого кода для микроконтроллеров Atmel из всех семейств: megaAVR, AVR XMEGA, AVR UC3 и SAM.
Основные преимущества:

  • упрощается использование и освоение микроконтроллеров, так как библиотека написана на высоком и среднем уровнях абстракции;
  • ASF разработана для использования на любой стадии проектирования;
  • ASF интегрирована в Atmel Studio (которая пришла на смену AVR Studio и поддерживает все семейства мк Atmel) с графическим пользовательским интерфейсом, но также может использоваться с компиляторами IAR и GCC;
  • ASF бесплатна.

5873b5a88d2748429beebea2c62df0ff.png

Немного про Atmel Studio

Atmel Studio — бесплатная среда разработки для микроконтроллеров Atmel, наследница AVR Studio. Визуальная оболочка взята от Microsoft Visual Studio. В качестве компилятора по-прежнему используется GCC.


Как видим из рисунка выше, ASF состоит из нескольких слоев абстракции:

  • печатная плата (Board),
  • драйвера (Drivers),
  • компоненты (Components),
  • сервисы (Services),
  • приложение (Applications).


В ASF используются три составных блока:

  • Модуль: программный модуль, который не содержит в себе функцию int main (void) (например модуль USART, стек USB). Модули ASF это слои: драйверы, компоненты и сервисы. Модуль ASF конфигурируется статически и/или динамически.
  • Приложение/пример: программный код в ASF, который может быть скомпилирован, зашит в микроконтроллер и выполнен. Приложения ASF состоят из слоев: драйверы, компоненты, сервисы, приложение. Для приложений ASF доступна только статическая конфигурация.
  • Печатная плата: абстрактный слой для каждого отладочного кита Atmel, поддерживаемого ASF. Обычно одному киту соответствует один микроконтроллер. Так же предусмотрена специальная пользовательская печатная плата «user board», это пустой слой абстракции для создания приложения на базе пользовательской платы.


Для каждого проекта дерево директорий (см. рисунок ниже) состоит из:

  1. Папки для выбранного семейства мк Atmel (на рисунке «sam0»)
  2. Папки с общим кодом (на рисунке «common» и «common2»)
  3. Папки с программным обеспечением сторонних производителей (на рисунке «thirdparty»).


905904d217504b7daec366411f36aab2.png
В каждой из этих папок организация подпапок соответствует уровням абстракции (приложения, сервисы, компоненты, драйверы, платы).

Основные этапы работы с ASF


Поэтапно написание кода с помощью ASF в Atmel Studio выглядит так:

  1. Загрузить ASF (с помощью extension manager, делается один раз).
  2. Выбрать проект-пример или создать свой (на стартовой странице Atmel Studio).
  3. Добавить необходимые модули (ASF Wizard).
  4. Настроить модули (файлы xxxx_conf.h).
  5. Прописать логику работы (собственно код приложения).


Далее разберём каждый из этапов подробнее.Загрузка ASF
Расширения для Atmel Studio (в том числе и библиотека ASF) загружаются с помощью Extension Manager (Tools-Extension Manager). Чтобы установить необходимое расширение:

  1. Откройте Extention Manager (Tools → Extension Manager)
  2. Введите ключевые слова в поле поиска
  3. Скачайте установочный файл (для этого надо быть зарегистрированным пользователем на atmel.com)
  4. Установите приложение


Обновление уже установленных приложений осуществляется так же через Extention Manager.
7d8e25bc352b439b8bafb609f49b4915.png

Создание проекта


При старте Atmel Studio (либо File-New-Project…/Example Project…) предлагается на выбор создать новый проект, создать проект-пример или открыть созданный ранее проект.
Проектов-примеров много, и начать изучение Atmel Studio, ASF и контроллеров Atmel удобнее всего именно с них. Для выбора нужного проекта введите в соответствующем поле семейство микроконтроллеров, отладочную плату, либо ключевое слово.
После выбора проекта укажите папку для размещения и название (если хотите, чтобы оно отличалось от названия по умолчанию).
При создании нового проекта выбирается его тип. Количество типов и сами они зависят от уже установленных модулей расширения. На рисунке ниже видно, что доступны в том числе проекты Qtouch, которые возможно создавать только после установки Qtouch Library и Qtouch Composer.
a3af665514b94290b0617d2e439a30ee.png

ASF Wizard


Если вы открыли готовый пример или создали собственный проект и вам необходимо добавить новый периферийный модуль (например, UART) или библиотеку (например, FATFS), то в этом вам поможет ASF Wizard (меню Project → ASF wizard или иконка 39ac90dde7b94f10a85e3d66af9cc33f.png). В нем можно найти модули по ключевому слову и по типу (драйвер, компонент, сервис). Если это необходимо, то настроить, как они будут работать: по прерыванию (callback в терминологии Atmel) или по опросу (polled), чем тактироваться или какую роль выполнять (master, host, mass storage и так далее в зависимости от типа периферии или библиотеки).
8f67d9c894b7482295a2c2803da742d6.pngНастройка модулей
После добавления модуля в проект в дереве каталогов в папке config появляется соответствующий файл типа conf_xxxx.h. В этом файле содержатся общие настройки модуля библиотеки.
Настройка соответствующей периферии проводится в 4 этапа:

  1. Считать параметры по умолчанию с помощью соответствующей функции.
  2. Изменить, если требуется, некоторые параметры.
  3. Записать новые параметры.
  4. Разрешить работу периферии.


Далее мы рассмотрим процедуру добавления новой периферии в проект на примере.

Написание кода


После добавления необходимых модулей, их настройки и включения, приступаем к написанию кода.Пример
Допустим, мы хотим научиться мигать светодиодами на отладочной плате SAM D21 Xplained Pro Evaluation Kit.
Рассмотрим подробно, как это сделать в Atmel Studio.
Запускаем Atmel Studio и нажимаем кнопку New Example Project:
ba264bd7eef642b08daed8605f1522ec.png
Скачиваем и устанавливаем ASF последней версии, если этого не было сделано раньше (см. выше как это сделать).
Создаем новый пример-проект (см рисунок).
Выбираем семейство контроллеров samd, вводим в поиске ключевое слово led. Видим список доступных проектов.
d3ba069e07124c668f44303490949522.png
Выбираем из них нужный.
Вводим новое название проекта и выбираем расположение.
3b5f52d9224242b7adf56798dd373e3f.png
Готово! Нажимаем «ОК». Теперь у нас есть проект-пример, который можно скомпилировать и залить в отладочную плату.
Теперь, предположим, мы хотим изменить код. Пусть у нас светодиоды зажигаются по таймеру. Для этого идем в ASF Wizard, вводим в поиске ключевое слово timer, выбираем режим callback, затем нажимаем Add и Apply.
b89ed4e1d7a647ada55e4431067723bc.png
Настраиваем таймер. Для этого объявляем глобально структуру, которая и будет хранить и параметры таймера:

struct tc_module tc_instance_tc0;


Теперь нужно настроить таймер. Добавляем функцию:

void configure_tc0(void)
{
        struct tc_config config_tc;
        tc_get_config_defaults(&config_tc);

        config_tc.wave_generation = TC_WAVE_GENERATION_MATCH_FREQ;
        config_tc.counter_16_bit.compare_capture_channel[0] = 1000;
        config_tc.clock_prescaler=TC_CLOCK_PRESCALER_DIV1024;
        //   config_tc.oneshot=true;
        tc_init(&tc_instance_tc0, TC3, &config_tc);
        tc_enable(&tc_instance_tc0);
}


Пояснения к функции:

  1. struct tc_config config_tc вспомогательная структура, которая хранит настройки таймера
  2. tc_get_config_defaults (&config_tc) считываем настройки по умолчанию (заполняем структуру). Чтобы посмотреть какие собственно настройки устанавливаются по умолчанию, щелкаем правой кнопкой мыши по функции и в выпадающем меню выбираем «goto implementation». Чтобы узнать, как называется функция, записывающая настройки по умолчанию, набираете название периферии и слово «get» через нижнее подчеркивание, а автозаполнение подскажет полное имя.
  3. Изменяем нужные нам настройки. В данном случае это предделитель, режим работы и содержимое регистра сравнения.
  4. tc_init (&tc_instance_tc0, TC3, &config_tc) Записываем измененные данные в структуру и связываем программную структуру с аппаратным таймером (TC3).
  5. tc_enable (&tc_instance_tc0) Разрешаем работу таймера.


Теперь настраиваем прерывания и пишем код, который будет выполняться по прерыванию. Для этого пишем функции:

void configure_tc0_callbacks(void)
{
        tc_register_callback(&tc_instance_tc0,tc0_callback,TC_CALLBACK_CC_CHANNEL0);
        tc_enable_callback(&tc_instance_tc0, TC_CALLBACK_CC_CHANNEL0);
} 
void tc0_callback(struct tc_module *const module_inst)
{
        port_pin_toggle_output_level(LED_0_PIN);
}


Первая функция устанавливает обработчик какого прерывания вызывается (tc_register_callback (&tc_instance_tc0, tc0_callback, TC_CALLBACK_CC_CHANNEL0);) и разрешает этот вызов (tc_enable_callback (&tc_instance_tc0, TC_CALLBACK_CC_CHANNEL0);). Вторая функция и это то, что выполняется в обработчике прерывания (callback).
Компилируем, запускаем, готово!

Atmel Studio совместно с Atmel Software Framework являются отличными средствами для первичного знакомства с периферией микроконтроллеров Atmel, значительно сокращают время освоения нового семейства микроконтроллеров за счет большого количества примеров и удобной среды разработки.

ASF+IAR


ASF можно использовать и с IAR. В этом случае скачивается stand-alone версия ASF и подключается к проекту в IAR вручную, пути к нужным файлам библиотеки указываются в меню Options-C/C++ Compiler → Preprocessor.

© Geektimes