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


Atmel® Software Framework (ASF) — программная библиотека, которая содержит широкий набор встраиваемого кода для микроконтроллеров Atmel всех семейств: megaAVR, AVR XMEGA, AVR UC3 и SAM.
Основные преимущества:
  • Упрощается использование и освоение микроконтроллеров, так как библиотека написана на высоком и среднем уровнях абстракции;
  • ASF разработана для использования на любой стадии проектирования;
  • ASF интегрирована в Atmel Studio с графическим пользовательским интерфейсом, но также может использоваться с компиляторами IAR и GCC;
  • ASF бесплатна.




Немного про 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»).


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

Основные этапы работы с 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. Чтобы установить необходимое расширение:
  1. Откройте Extention Manager (Tools -> Extension Manager)
  2. Введите ключевые слова в поле поиска
  3. Скачайте установочный файл (для этого надо быть зарегистрированным пользователем на atmel.com)
  4. Установите приложение

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


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


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


ASF Wizard


Если вы открыли готовый пример или создали собственный проект и вам необходимо добавить новый периферийный модуль (например, UART) или библиотеку (например, FATFS), поможет ASF Wizard (меню Project -> ASF wizard или иконка ). В нем можно найти модули по ключевому слову и по типу (драйвер, компонент, сервис). Если это необходимо, можно настроить, как они будут работать: по прерыванию (callback в терминологии Atmel) или по опросу (polled), чем тактироваться или какую роль выполнять (master, host, mass storage и так далее в зависимости от типа периферии или библиотеки).


Настройка модулей

После добавления модуля в проект в дереве каталогов в папке config появится соответствующий файл с названием типа conf_xxxx.h. В нём содержатся общие настройки модуля библиотеки.
Настройка соответствующей периферии проводится в 4 этапа:
  1. Считать параметры по умолчанию с помощью соответствующей функции.
  2. Изменить, если требуется, некоторые параметры.
  3. Записать новые параметры.
  4. Разрешить работу периферии.

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

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


После добавления необходимых модулей, их настройки и включения, приступаем к написанию кода.

Пример

Допустим, мы хотим научиться мигать светодиодами на отладочной плате SAM D21 Xplained Pro Evaluation Kit.
Рассмотрим подробно, как это сделать в Atmel Studio.
Запускаем Atmel Studio и нажимаем кнопку New Example Project:

Скачиваем и устанавливаем ASF последней версии, если этого не было сделано раньше (см. выше как это сделать).
Создаем новый пример-проект (см. рисунок).
Выбираем семейство контроллеров samd, вводим в поиске ключевое слово led. Видим список доступных проектов.

Выбираем из них нужный.
Вводим новое название проекта и выбираем расположение.

Готово! Нажимаем «ОК». Теперь у нас есть проект-пример, который можно скомпилировать и залить в отладочную плату.
Теперь изменим код. Пусть у нас светодиоды зажигаются по таймеру. Для запускаем ASF Wizard, вводим в поиске ключевое слово timer, выбираем режим callback, затем нажимаем кнопки Add и Apply.

Настраиваем таймер. Для этого объявляем глобально структуру, которая будет хранить параметры таймера:
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.

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


  1. aronsky
    03.09.2015 10:19

    Весь фреймфорк заточен именно под работу с их студией, а поддержка IAR прикрученна сбоку для вида, или есть хорошая документация кода, примеры как использовать ASF? Насколько хуже/лучше документированность кода чем, например, у StdPeriphLib?


    1. marus-ka
      03.09.2015 10:29
      +1

      Изначально предполагалось, что ASF будет использоваться как с atmel studio, так и с IAR. Т.е. поддержка IAR это не прекрученная сбоку фича, а спланированная акция.
      Примеры есть и под IAR, но их чуть меньше, чем под Atmel Studio.
      Документация такая же, как у StdPeriphLib — doxygen.


  1. Fabian_red
    03.09.2015 11:25

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