«Программирование мышкой» для микроконтроллеров
Многие микроконтроллерные платформы поддерживают инструменты для создания начальной конфиграции периферийных устройств и портов ввода/вывода. Обычно это графическая среда, в которой задаются параметры работы кристалла и может быть сгенерирован исходный код — заготовка будущего проекта.

При использовании такого конфигуратора вы существенно упрощаете начальный этап программирования, но делаете это не в ущерб пониманию процессов, происходящих на кристалле.
Ниже приведен пример использования конфигуратора для микроконтроллера C8051F930 от Silicon Labs. Будем управлять яркостью светодиода с потенциомера, написав руками всего две строчки кода. Just for fun, конечно.
Исходные данные
Все программные средства разработки для микроконтроллеров Silicon Labs доступны в составе программной платформы Simplicity Studio. Платформа распространяется бесплатно и содержит IDE, документацию, массу примеров программ, а также дополнительные утилиты вроде профайлера энергопотребления и конфигуратора. В этом примере будут использоваться конфигуратор и среда разработки.
В качестве аппаратной платформы послужит отладочная плата C8051F930-TB, так как на ней установлены потенциометр и светодиод, а микроконтроллер C8051F930 имеет необходимые блоки АЦП и ШИМ. В общем, к плате предъявляется нехитрый набор требований, под который подходит множество средств отладки. Но C8051F930-TB таки была под рукой 🙂
Шаг 1. Подготовка
Подготовка заключается в установке и запуске Simplicity Studio на компьютере и включении отладочной платы. Плата запитывается от батареи или от сети и, за неимением встроенного отладчика, подключается к компьютеру через программатор DEBUGADPTR1-USB.

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

Шаг 2. Создание проекта

Для известной отладочной платы диалог создания нового проекта появляется сразу после нажатия на иконку конфигуратора. Мастер создания проекта не содержит никаких необычных элементов, только выбор целевого контроллера, названия и расположения проекта и т.п.
Интерфейс самого конфигуратора состоит из трех основных частей:
- Конфигуратор периферийных устройств
- Конфигуратор портов ввода/вывода
- Граф состояний микроконтроллера
Шаг 3. Настройка периферии
- Активировать и настроить АЦП чтобы обрабатывать сигнал с потенциометра;
- Активировать и настроить таймер чтобы инициировать преобразование на АЦП с нужной частотой;
- Активировать и настроить блок PCA (т.н. программируемый массив счетчиков), на котором в микроконтроллерах C8051Fxxx доступен аппаратный ШИМ-генератор.

После настройки тактирования переходим к таймерам-счетчикам. Опрашивать АЦП будем раз в 1 мс, поэтому настраиваем TIMER2 на переполнение с соответствующей частотой: ставим галочку на блоке TIMER2, указываем частоту в микросекундах, задаем Start в поле Run Control чтобы работа таймера начиналась автоматически.

При активации TIMER2 модуль Timer Setup загорелся красным цветом. Timer Setup должен быть активирован для работы таймеров/счетчиков, ставим галочку.

По переполнению таймера будет начинаться преобразование на блоке АЦП. Настройка АЦП включает разрешение работы блока, указание события для старта работы, указание линии ввода/вывода для приема измеряемого сигнала и выбор 8-битного режима преобразования без усиления.

Опорное напряжение для АЦП указывается в отдельном блоке Voltage Reference. В соответствующем пункте указываем напряжение питания платы.

Итак, при корректном выполнении описанных настроек мы получим работающий кристалл, на котором раз в миллисекунду значение в регистре результата АЦП обновляется в соответствии с положением колесика потенциометра. Чтобы использовать это значение для формирования ШИМ-сигнала необходимо, кроме настройки блока ШИМ, разрешить прерывание от АЦП и настроить обработчик этого прерывания (копирование значения из регистра результата АЦП в регистр данных блока ШИМ). Средствами утилиты Configurator можно только настроить контроллер прерываний: активируем блок Interrupts и прерывание от ADC0, разрешаем все прерывания.

Осталось настроить блок PCA на генерацию ШИМ-сигнала. Выбираем нужный режим на Channel0 и задаем автоматический (т.е. сразу после включения или reset’а) старт работы.

Шаг 4. Настройка портов ввода/вывода
Режим работы контроллера создан. Переходим на соседнюю вкладку чтобы настроить порты ввода/вывода — понадобится определить вход АЦП и выход ШИМ в соответствии с топологией платы.
Линия P0.6, подключенная к потенциометру, была указана в качестве входа для сигнала ещё при настройке ADC0. Она отмечена на распиновке кристалла. Справа, в окне настройки режима работы выбранной «ножки», два красных крестика недвусмысленно намекают что нужно поправить два параметра.

Режим Open Drain не подходит для аналогового входа, меняем его на Analog I/O. Параметр Skip относится к CROSSBAR’у — цифровому коммутатору, который устанавливает связи типа «периферийный модуль -> порты ввода/вывода» в микроконтроллерах C8051Fxxx. Поскольку линия P0.6 является входом микроконтроллера, в CROSSBAR’е она не должна учитываться. Выбираем Skipped.
Переходим к настройке выхода для ШИМ-сигнала — нулевой канал блока PCA должен быть выведен на линию P1.6, к желтому светодиоду. Такая связь как раз задается через CROSSBAR. Разрешаем его работу.

Появилось меню настройки CROSSBAR’а. Ставим галочку на нулевом канале PCA, ШИМ автоматически оказалась на линии P0.0.

ШИМ нужно «передвинуть» на P1.6, а для P1.6 указать режим работы Push-Pull Output вместо Open Dain.

Шаг 5. Генерация и дополнение исходного кода
Генерация и обновление исходного кода из заданной конфигурации происходит при сохранении проекта или по команде Generate Source, доступной из меню по нажатию правой кнопки мыши. Исходный код нужно дополнить обработчиком прерывания, причем шаблон обработчика создан автоматически благодаря разрешению прерывания от АЦП.

Пишем те самые две строчки кода: снимаем флаг прерывания по окончанию преобразования, копируем содержимое регистра данных АЦП в регистр ШИМ.
ADC0CN_ADINT = 0; PCA0CPH0 = (U8) (ADC0 >> 2);
Кроме конфигураторов периферии и портов, для 8-разрядных микроконтроллеров доступен инструмент задания графов состояний. Инструменты, которые использовались выше, описывают дефолтный режим работы контроллера, а в графе состояний есть возможность создать несколько режимов, каждому из них будут соответствовать собственные конфигураторы периферии и портов. Впрочем, в этом примере C8051F930 функционирует в единственном режиме.
Шаг 6. Компиляция, запуск
Проект создан, остались сборка, компиляция и программирование кристалла.
Результат работы — на видео.
Новые 8-разрядные микроконтроллеры Silicon Laboratories с RTC-модулем Текст научной статьи по специальности «Компьютерные и информационные науки»
Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Родионов Михаил
В статье рассмотрены особенности нового семейства микроконтроллеров SiLabs со встроенными часами реального времени RTC (Real Time Clock), описаны средства отладки, выпускаемые Silicon Laboratories для поддержки разработок на базе данных МК. В заключение дается сравнение с аналогичными изделиями других производителей элементной базы, а также представлен краткий обзор готовых решений, предлагаемых на сайте компании в качестве готовых примеров (Reference Design). Основная цель данной статьи — сформировать у разработчиков полное представление о функциях и возможностях нового семейства МК.
i Надоели баннеры? Вы всегда можете отключить рекламу.
Похожие темы научных работ по компьютерным и информационным наукам , автор научной работы — Родионов Михаил
Новые компоненты SiLabs для 8-разрядных встраиваемых систем
Микроконтроллеры XMEGA — новые возможности проверенного решения
Новое семейство 8-разрядных микроконтроллеров для автомобильной электроники компании Freescale Semiconductor
Как работать с АЦП и ЦАП в микроконтроллерах SiLabs
Беспроводные решения на основе микроконтроллеров семейства CC430F61xx/CC430F513x от Texas Instruments
i Не можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.
Текст научной работы на тему «Новые 8-разрядные микроконтроллеры Silicon Laboratories с RTC-модулем»
Уже длительное время 8-разрядные МК SiLabs представлены набором семейств, сбалансированных по функциональности, производительности, экономичности и стоимости. Но компания Silicon Laboratories не останавливается на достигнутом и продолжает активное развитие этой платформы. Основными тенденциями развития являются как улучшение параметров существующих, так и интеграция новых периферийных блоков при сохранении старых типоразмеров корпусов микросхем. С каждым годом МК SiLabs покрывают все более широкий спектр возможных приложений, захватывая все новые и новые ниши на рынке.
Последней разработкой компании Silicon Labs в сегменте 8-разрядных МК стало семейство C8051F41x, в котором реализованы несколько новых идей и технологических решений. Большинство из них связаны с интегрированными часами реального времени (модуль smaRTClock), которые впервые появились в структуре МК SiLabs и позволили покрыть целый класс приложений, специфика которых требует постоянно осуществлять контроль реального времени. Чаще всего в таких приложениях лишь изредка используется вся мощь процессорного ядра и встроенной периферии МК, а большую часть времени система ожидает появления каких-либо событий (т. е. работает по прерываниям) и выполняет одну единственную функцию — контроль реального времени. Традиционно при разработке таких систем использовались два подхода.
• Во-первых, для отсчета времени можно
использовать один из встроенных тайме-
Новые 8-разрядные микроконтроллеры Silicon Laboratories
В статье рассмотрены особенности нового семейства микроконтроллеров SiLabs со встроенными часами реального времени RTC (Real Time Clock), описаны средства отладки, выпускаемые Silicon Laboratories для поддержки разработок на базе данных МК. В заключение дается сравнение с аналогичными изделиями других производителей элементной базы, а также представлен краткий обзор готовых решений, предлагаемых на сайте компании в качестве готовых примеров (Reference Design). Основная цель данной статьи — сформировать у разработчиков полное представление о функциях и возможностях нового семейства МК.
ров МК. Однако в этом случае невозможно достичь минимального энергопотребления, так как нельзя отключить задающий тактовый генератор, необходимый для функционирования таймера. Кроме того, такой подход обеспечивает весьма ограниченный набор RTC-функций, что делает его приемлемым только для самых простых приложений.
• Во-вторых, можно использовать внешний модуль RTC. В настоящее время такие модули широко представлены на рынке и обеспечивают достаточно хорошую функциональность. Однако они требуют дополнительного места на плате и для связи с ними необходимо выделить один из интерфейсов МК или несколько портов ввода/вывода.
Микроконтроллеры со встроенными RTC-модулями позволяют избавиться от недостатков, присущих традиционным способам построения систем с часами реального времени. В настоящее время в связи с бурным развитием рынка портативных устройств с батарейным питанием все более привлекательными становятся именно такие решения. И новое семейство C8051F41x, которое уже появилось на отечественном рынке, непременно займет среди них достойное место.
Структура МК C8051F41x
Новое семейство малогабаритных микроконтроллеров C8051F41x является продолжением линейки 8051-совместимых МК компании Silicon Laboratories и состоит из 4 устройств, которые отличаются друг от друга объемом встроенной Flash-памяти, количест-
вом портов ввода/вывода и типом корпуса (LQFP-32 или QFN-28). Со структурной схемой данных МК можно ознакомиться в работе [3, рис. 4]. Как и другие микроконтроллеры SiLabs, МК C8051F41x использует высокопроизводительное процессорное ядро CIP-51, максимальная частота тактирования которого может достигать 50 МГц. По системе команд ядро CIP-51 полностью совместимо с широко распространенным стандартом MCS-51™ (всего поддерживается 109 инструкций, на выполнение которых требуется от 1 до 8 тактовых циклов). Благодаря использованию конвейерной архитектуры, примерно 70% команд выполняются за 1 или 2 системных тактовых цикла, что при определенных условиях позволяет достичь максимальной производительности вплоть до 50 MIPS.
Развитая система прерываний (поддерживаются в общей сложности до 18 источников прерываний с двумя уровнями приоритета) позволяет аналоговым и цифровым периферийным модулям функционировать независимо от процессорного ядра и прерывать работу МК только при необходимости. Контроллер прерываний может перепрограм-мироваться в ходе работы для динамического изменения приоритетов и разрешений прерываний от различной периферии. Задержка обработки прерываний (от момента возникновения прерывания до начала выполнения первой команды процедуры ISR) составляет от 7 до 19 системных тактовых циклов в зависимости от конкретной ситуации.
Впервые МК компании Silicon Laboratories имеют расширенное напряжение питания — от 2,0 В до 5,25 В. Это обеспечивается наличием в C8051F41x встроенного стабилизатора
Таблица 1. Режимы электропитания C8051F41x
Режим SYSCLK Ядро CPU Периферийные модули Модуль smaRTClock Энергопотребление
Active Активен Активно Включены или отключены Максимальное
Idle в зависимости от настроек Включен Среднее
Suspend Остановлено (нет обращений к Флэш-памяти) Включены (но не работают) или отключены в зависимости от настроек или отключен Низкое
Stop Остановлен Цифровые — отключены; Аналоговые — включены (но не работают) или отключены в зависимости от настроек Отключен Очень низкое
напряжения [3, рис. 4]. Выходное напряжение этого стабилизатора (2,1 или 2,5 В) выдается на вывод VDD микросхемы и поэтому может использоваться для питания не только внутренних модулей МК, но и внешних устройств с общим током потребления не более 50 мА.
Все представители семейства C8051F41x содержат двухпроводный интерфейс C2, который предназначен для программирования Flash-памяти и выполнения внутрисхемной отладки уже готовых изделий с установленным (не в разъем, а припаянным на плату) МК. Для отладки необходимы только компьютер с запущенным отладчиком из комплекта SШcon Labs IDE и адаптер-переходник для интерфейса C2. В процессе отладки можно считывать и модифицировать ячейки памяти и регистры, расставлять точки останова, выполнять программу в пошаговом режиме. Отладка осуществляется в режиме реального времени «неинтрузивным» способом, то есть не используются внутренние ресурсы МК (память, таймеры, каналы связи), а все цифровые и аналоговые периферийные модули полностью сохраняют свою работоспособность.
Остальные структурные модули и особенности МК C8051F41x будут рассмотрены далее в соответствующих разделах.
Система тактирования и режимы электропитания
МК C8051F41x отличаются довольно простой, но в то же время достаточно эффективной системой тактирования (рис. 1). Для генерации системного тактового сигнала (SYSCLK) можно использовать четыре различных источника.
1. Программируемый внутренний генератор, который является источником сигнала SYSCLK по умолчанию (то есть после сброса системы) и не требует использования каких-либо внешних компонентов. В процессе производства МК частота этого генератора устанавливается равной 24,5 МГц, но может быть подкорректирована в небольших пределах с помощью специального регистра. Погрешность установки частоты не превышает ±2%. К выходу внутреннего генератора подключен делитель с программируемым коэффициентом деления от 1 до 128.
2. Внешний генератор, основная схема которого интегрирована внутри МК, а в качестве задающего элемента должен использоваться внешний кварцевый/керамический резонатор, RC-цепочка или конденсатор. Кроме того, через один из входов этого генератора может подаваться внешний тактовый сигнал (например, от КМОП-счетчика).
3. Умножитель частоты, на вход которого подается выходной сигнал внутреннего или внешнего генератора (напрямую или через делитель на 2). Умножитель частоты повышает частоту в четыре раза. К выходу
умножителя частоты подключен делитель с программируемым коэффициентом деления от 1 до 31/2.
4. Низкочастотный (32 кГц) генератор модуля smaRTClock.
Как известно, между тактовой частотой и энергопотреблением МК существует прямая зависимость: чем выше частота, тем больше энергопотребление. С учетом требований конкретного приложения (высокая производительность, минимальная стоимость, низкое энергопотребление) пользователь может выбрать конкретную конфигурацию системы тактирования, наилучшим образом подходящую для его случая. Кроме того, предусмотрена функция переключения источников тактирования «на лету». Это позволяет для каждого режима работы системы обеспечить наиболее оптимальное сочетание параметров (например, высокая производительность при цифровой обработке сигналов и низкое энергопотребление в режиме ожидания). Следует также отметить, что с целью уменьшения энергопотребления каждый из генераторов может быть остановлен, при этом останавливается тактирование всех структурных блоков, использующих выходной сигнал этого генератора.
Минимизация энергопотребления достигается не только за счет гибкого использования различных конфигураций системы тактирования. МК C8051F41x поддерживают также различные режимы электропитания: Active, Idle, Suspend и Stop (табл. 1). Общий ток потребления в каждом из этих режимов определяется конкретным набором включенных/отключенных модулей, поэтому с целью минимизации потребляемой мощности рекомендуется
всегда отключать неиспользуемые периферийные модули и тактовые генераторы. Для перехода из режимов пониженного потребления обратно в активный режим могут использоваться не только различные типы сброса, но также прерывания и события пробуждения. Это позволяет исключить практически все холостые циклы тактирования.
Таким образом, в МК C8051F41x реализован достаточно гибкий механизм управления энергопотреблением, позволяющий создавать очень эффективные системы. Используя различные режимы электропитания, меняя «на лету» источники тактирования и включая/отключая по мере необходимости периферийные модули, можно объединить в одном устройстве высокопроизводительные функции и низкое энергопотребление, что имеет огромное значение в условиях постоянно растущих требований к вычислительным возможностям портативных устройств.
В МК C8051F41x доступны три типа памяти (рис. 2).
• Внутренняя Flash-память объемом 32 кбайт ^805^410/1) или 16 кбайт ^805^412/3).
• Внутреннее ОЗУ данных SRAM объемом 256 байт, отображенное в адресном пространстве внутренней памяти данных.
• Внутреннее ОЗУ данных XRAM объемом 2048 байт, отображенное в адресном пространстве внешней памяти данных. Встроенная Flash-память отображена в пространстве памяти программ и может использоваться как для хранения программного кода, так и для хранения данных. Возможно
ПАМЯТЬ ПРОГРАММ/ДАННЫХ (Flash)
ПАМЯТЬ ДАННЫХ (SRAM) Адресное пространство внутренней памяти данных
0x7 Е00 ЗАРЕЗЕРВИРОВАНО OxFF Старшие 128 байт SRAM (только косвенная Регистры специального назначения (только
0x7 DFF 0x80 адресация) прямая адресация)
32 кбайт Flash 0x7 F 0x30 (Память, доступная в режиме прямой и косвенной адресации) Ч Младшие 128 байт к БРАМ
(Возможно внутрисистемное 0x2F 0x20 Память с битовой адресацией ‘ (доступны в режиме прямой и косвенной адресации)
программирование секторами по 512 байт) 0x1 F 0x00 Регистры общего назначения /
0x0000 ПАМЯТЬ ДАННЫХ (ХРАМ)
Адресное пространство внешней памяти данных
0x4000 RESERVED Тот же самый 2048-байтный блок памяти ХРАМ (0x0000—0x0 7 ЕЕ), отображенный во всем диапазоне 64-кбайтной внешней памяти данных в виде 2048-байтных блоков
0x3FFF 16 кбайт Flash 0x0800
программирование секторами по 512 байт) XRAM — 2048 байт (Для доступа используется команда MOVX)
Рис. 2. Структура памяти C8051F41x
программное стирание и/или программирование памяти во время работы приложения, что значительно повышает гибкость использования микроконтроллера. Реализованы функции защиты флэш-памяти, которые позволяют не только защитить ее от случайного изменения со стороны программы, но и исключают возможность просмотра программного кода, являющегося объектом интеллектуальной собственности.
Так как время доступа к Flash-памяти составляет 40 нс, а минимальное время выполнения команды равно 20 нс (при SYSCLK = 50 МГц), то для выполнения программного кода без задержек в МК C8051F41x реализован двухбайтный механизм упреждающей выборки. Этот механизм считывает инструкции из Flash-памяти по два байта за раз и передает их для выполнения процессорному ядру CIP-51. Благодаря этому линейный программный код (то есть без каких-либо переходов и ветвлений) исполняется без задержек. Если встречается программный переход, то процессор может остановиться на время до двух тактовых циклов, пока следующий набор команд (кодов) не будет извлечен из Flash-памяти.
Внутренняя память данных организована достаточно оригинально. На старшие 128 адресов пространства внутренней памяти данных отображены два физически реализованных блока памяти (рис. 2): команды, использующие косвенную адресацию, обращаются к старшим 128 байтам памяти SRAM, а команды, использующие прямую адресацию, обращаются к регистрам специального назначения. Младшие 128 адресов пространства памяти данных используются только для памяти
SRAM в полном соответствии с архитектурой MCS-51™: доступ к младшим 128 байтам памяти SRAM возможен в прямом и косвенном режимах адресации, самые младшие 32 байта разбиты на четыре банка регистров общего назначения, следующие 16 байт могут адресоваться побитно как 128 битовых флагов.
В архитектуре MCS-51™ для работы с внутренней памятью данных используются 8-разрядные адреса, поэтому в пространстве внутренней памяти данных нельзя отобразить (одновременно) более 256 байт физически реализованной памяти, что явно недостаточно для современных приложений. Обычно в случае нехватки адресного пространства используются более сложные режимы адресации (например, через индексные регистры, страничная адресация). Компания Silicon Labs пошла несколько иным путем: дополнительное ОЗУ объемом 2048 байт отображено в адресном пространстве внешней памяти данных (XRAM — eXtemal RAM), хотя физически интегрировано внутри МК. Доступ к этой памяти осуществляется только с помощью команд MOVX, а значит, только через аккумулятор. Это следует иметь в виду при разработке приложений, критичных к скорости работы подсистемы памяти. МК C8015F41x не позволяют использовать действительно внешние устройства памяти (так как отсутствует интерфейс внешней памяти, как в некоторых других микроконтроллерах SiLabs), поэтому оставшиеся адреса пространства внешней памяти не резервируются, а разбиты на страницы размером по 2 кбайт, каждая из которых указывает на все тот же блок памяти XRAM. В некоторых случаях это позволяет
упростить процесс переноса программного обеспечения с одной версии МК на другую.
Кроме рассмотренных устройств памяти есть еще резервное ОЗУ модуля smaRTClock, но подробнее о нем будет рассказано далее в разделе, посвященном описанию цифровых модулей (см. ниже).
Аналоговые периферийные модули
Из всей аналоговой периферии МК C8051F41x наибольший интерес представляет модуль АЦП. Рассмотрим его поподробнее. Модуль АЦП обеспечивает производительность до 200 тыс. преобразований в секунду и содержит следующие основные блоки (рис. 3): входной 27-канальный аналоговый мультиплексор, схему выборки-хранения, непосредственно АЦП с 12-разрядным регистром последовательного приближения, программируемый детектор диапазона. Кроме того, в состав модуля АЦП входит специальная логика, обеспечивающая поддержку пакетного режима функционирования. Этот режим впервые реализован в МК SiLabs и позволяет автоматически (без вмешательства CPU) включать АЦП, производить одно или несколько преобразований, а затем снова отключать АЦП. Еще одна новинка — аппаратный аккумулятор-накопитель. Он позволяет автоматически накапливать (суммировать) до 16 результатов преобразований, причем как в нормальном режиме функционирования, так и в пакетном. Принцип управления модулем АЦП остался прежним — выбор режимов преобразования и условий запуска, настройка аналогового мультиплексора и детектора диапазона осуществляются программно с помощью регистров специального назначения.
Аналоговый мультиплексор позволяет измерять не только напряжения на любом порту ввода/вывода, но и уровни VDD и GND, а также выходной сигнал встроенного датчика температуры. Запуск преобразования может быть инициирован одним из четырех способов: программно путем установки соответствующего бита, переполнением таймера 2, переполнением таймера 3 или по фронту внешнего входного сигнала. Для тактирования АЦП используется либо сигнал, производный от SYSCLK (в нормальном режиме работы), либо выходной сигнал специального независимого генератора (в пакетном режиме).
Пакетный режим позволяет существенно уменьшить мощность, потребляемую модулем АЦП. В этом режиме по сигналу запуска преобразования АЦП «пробуждается» из режима пониженного энергопотребления, накапливает до 16 выборок, используя тактовый сигнал внутреннего генератора (приблизительно 25 МГц) и затем снова переходит в режим пониженного энергопотребления. Так как сигнал тактирования АЦП никак не связан с SYSCLK, то в пакетном режиме модуль АЦП может выполнить несколько
Продолжение истории про «Сердце» электронного устройства или простейшее программирование Silicon Labs C8051F320

Не так давно я написал статью про мою поделку на основе микроконтроллера Silicon Labs C8051F320. Пришло время рассказать и про программирование данного мк под простейшие задачи.
Подробности под катом.
Итак, в предыдущей статье я рассказал о небольшой платке, которая должна стать основой будущего устройства. На ней расположен сам микроконтроллер и его небольшая обвеска, предназначенная для ресета прошивки, питания мк и т.д. Одной из задач, которую данное устройство должно было выполнять у нас на работе, было управление некоторыми устройствами на исследовательском стенде. Так как по сути задача была не шибко сложной, то и прошивка для мк не требовала каких либо сложных решений наподобие работы с USB и прочими специфичными штуками, но разбор этой прошивки может в будущем хорошо помочь тем, кому придется работать с подобным мк по учебе (у моего друга вроде как сейчас по учебе идет программирование 51го ядра) или по работе. Но обо всем по порядку.
Задача
Задачу поставили довольно несложную — организовать простейшее включение/выключение удаленных устройств от микроконтроллера, организовав необходимые задержки между срабатываниями. В теории, надо было еще сделать управление этими задержками с ПК через USB, но, как оказалось потом, это не так важно.
Аппаратная часть
Для решения данной задачи нужна была реализация апаратной части устройства, отвечающео за сопряжение мк с удаленными устройствами, так как само «сердце» ничего такого на борту не несло, да и изначально оно расчитывалось на уравление периферийной платой. Особо зацикливаться на аппаратной части не буду, так как статья про прошивку, но все же для полноты картины представлю ее схему и краткое описание.
Всего удаленных устройств было 6 штук, три из которых управлялись по оптоволоконнной связи, два через реле и одно простым импульсом в размере 5 вольт. Так как наше начальство не любит, чтобы все делалось с умом и, соответственно, денег на грамотную работу выделять не желает, принципиальная схема была наворочена быстро и на коленке, так что в ней возможны небольшие недочеты. Вот она.

Убедившись, что никаких изменений в устройстве не предполагается, а точнее уточнив у начальства, что не будет всяких там «Ой, а давайте-ка. », после которых придется делать совершенно новую схему, мы приступили к изготовлению печатной платы. Про отсутствие денег я уже говорил, так что всего лишь скажу, что делалось все из подручных элементов — плата травилась у нас же на коленке из куска старого текстолита, элементы нашлись в кладовке. В общем, полная разруха. НИИ, что еще сказать… В общем, результат виден на фото:


К слову, потом все же случилось «Ой, а давайте-ка. », поэтому пришлось клепать пару мелких платок, резать дорожки на этой и все это соплями соединять, но пост не об этом.
Программная часть
Описание программной части будет состоять из нескольких подпунктов, чтоб было проще читать и понимать, о чем вообще речь.
Алгоритм работы
- Проверяем наличие внешнего сигнала «Старт» от вышестоящего устройства
- Если сигнал получен — отрабатываем заданную последовательность, наплевав на проверку срабатывания устройств. К слову, этот метод показался мне не совсем корректным, поэтому все же одну проверку я сделал, чтоб не бабахнуло, но реализовал ее просто аппаратно, а не в прошивке.
- Возвращаемся в пункт первый
Алгоритм выбран, аппататная часть готова, приступаем ко конфигурированию и программизму микроконтроллера.
Конфигурирование микроконтроллера
Вот что мне нравится в SILabs, так это то, что у них есть куча плюшек в виде программ для инициализации, конфигурирования, прошивки и прямого дебага их микроконтроллеров. Итак, берем их программу для начального конфигурирования МК с их сайта и запускаем ее. Выбираем в настройках нужный нам мк и начинаем конфигурацию.


В процессе настройки МК нам нужно будет настроить его порты ввода/вывода, чтоб в исходном состоянии на них был логический ноль, настроить таймер-счетчик на нужный нам интервал (ЕМНИП я ставил 50 микросекунд), включить прерывания от таймера и еще по мелочи. Точно я все не помню, делал давно, покажу просто пример. В меню Properties выбираем нужный нам пункт и видим октрывшееся окно, где все необходимые нам параметры настраиваются в GUI.

При нажатии ОК все настройки копируются в окно с кодом. Настроили МК, но не спешим закрывать конфигуратор, он там еще понадобится. Качаем с того же сайта Silicon Labs IDE, с помощью которой и будем прошивать МК. Запускаем ее.
Тут есть один нюанс, ей нужно подсунуть компилятор от Keil С51, чтобы она его использовала. Не буду на этом зацикливаться, просто покажу картинкой как это делается. Открываем меню Project — Tool Chain Integration и указываем пути к компиляторам кейля.

Открываем конфигуратор и копируем из него получившийся код в IDE.
//--------------------------------------------------------------------------------// // Initialization of timer // //--------------------------------------------------------------------------------// void timerInit(void) < TMOD = 0x10; TMR2CN = 0x24; TF2LEN = 1; TMR2RLL = 0xCF; TMR2RLH = 0xFF; TMR2L = 0xCF; TMR2H = 0xFF; T2SPLIT = 0; T2SOF = 0; ET2 = 1; TMR2 = 0xffff; // set to reload immediately ET2 = 1; // enable Timer2 interrupts TR2 = 1; // start Timer2 >//--------------------------------------------------------------------------------// // Initialization of ports I/O // //--------------------------------------------------------------------------------// void portIOInit(void) < P1MDOUT = 0x7F; XBR1 = 0x40; P0 = 0x00; P1 = 0x00; P2 = 0x00; >//------------------------------------------------------------------------------// // Interrupts init // //------------------------------------------------------------------------------// void interruptsInit(void) < IP = 0x20; IE = 0xA0; >//----------------------------------------------------------------------------- // SYSCLK_Init //----------------------------------------------------------------------------- // // This routine initializes the system clock to use the internal 24.5MHz / 8 // oscillator as its clock source. Also enables missing clock detector reset. // void SYSCLK_Init (void) < OSCICN = 0xC3; // configure internal oscillator for // its lowest frequency RSTSRC = 0x04; // enable missing clock detector >//------------------------------------------------------------------------------// // Device init // //------------------------------------------------------------------------------// void deviceInit(void) < // disable watchdog timer PCA0MD &= ~0x40; // WDTE = 0 (clear watchdog timer SYSCLK_Init(); timerInit(); portIOInit(); interruptsInit(); EA = 1; // enable global interrupts //------------------------------------------------------------------------------// // Main function // //------------------------------------------------------------------------------// void main(void) < _delay1 = 0; _delay2 = 19980; _widthImp = 20; _cDelay = 0; _state = ST_IDLE; deviceInit(); while(1) < >; > >
Реализация основной задачи
Итак, МК сконфигурирован, приступаем к реализации основной задачи — проверяем входящий сигнал и отрабатываем последовательность.
Алгоритм работы данной функции такой — запускаем таймер на щелчки через каждые 50 микросекунд. Создаем глобальную переменную _state, которая будет отвечать за текущее состояние контроллера. По умолчанию делаем ее равной 0, т.е. первому состоянию. Остальные состояния МК сделаем более читабельными с помощью define:
#define ST_IDLE 0 #define ST_DELAY_0 1 #define ST_RNT_START 2 #define ST_DELAY_1 3 #define ST_RNT_STOP 4
Смотрим по даташиту контроллера таблицу прерываний и узнаем, что прерывание нужного нам таймера имеет вектор (номер) 5. Код, реализующий работу функции:
//------------------------------------------------------------------------------// // Timer ISR // //------------------------------------------------------------------------------// void timerISR (void) interrupt 5 < TF2H = 0; TF2L = 0; // Clear Timer2 interrupt flag switch(_state) < case ST_IDLE: if (_inputPulse == 0) < _state = ST_DELAY_0; _cDelay = 0; >break; case ST_DELAY_0: _cDelay++; if (_cDelay>=_delay1) < _state = ST_RNT_START; _rntStart = ON; _cDelay = 0; >break; case ST_RNT_START: _cDelay++; if (_cDelay >= _widthImp) < _state = ST_DELAY_1; _rntStart = OFF; _cDelay = 0; >break; case ST_DELAY_1: _cDelay++; if (_cDelay >= _delay2) < _state = ST_RNT_STOP; _rntStop = ON; _cDelay = 0; >break; case ST_RNT_STOP: _cDelay++; if (_cDelay >= _widthImp) < _state = ST_IDLE; _rntStop = OFF; _cDelay = 0; >break; default: _state = ST_IDLE; break; >
Итак, что мы делаем? При кажом щелчке таймера проверяем состояние МК. Если оно равно 0 — проверяем, есть ли на входе стартовый сигнал. Если он есть (inputPulse == 1) — запускаем последовательность. Длительность задержек между сигналами регулируем количеством щелчков таймера, проверяя его при каждом щелчке в коде обработки состояния. При завершении всего цикла работы — возвращаем МК в состояние 0 и ожидаем следующего входящего сигнала.
Прошивка
Компилируется и прошивается МК довольно просто, из той же IDE нажатием одной кнопки. Подключаем программатор к плате (как — показано в предыдущей статье), включаем питание, жмем кнопку «Подключиться», потом кнопку «Download code». Все, МК прошит. Запустить код на выполнение в МК можно отсюда же, нажав кнопку «Go». Здесь же можно расставить точки останова и провести с ним сеанс дебага, рассматривая результаты на осциллографе.

Кнопки показаны на рисунке и подписаны разными цветами.
Заключение
Как видите, не все так сложно при работе с данным МК. Думаю, что кому-нибудь этот пост поможет с ним разобраться.
Silicon laboratories что это за программа
О работе с BLE модулем BGM111 фирмы Silicon Labs
Автор: Сергей Безруков (aka Ser60), sergeilb60@mail.ru
Опубликовано 19.08.2016
Создано при помощи КотоРед.
Сегодня в свете бурного развития направления IoT (Internet of Things) приёмо-передающие устройства на базе законченных радио-модулей вызывают всё больший интерес у разработчиков. Естественно встаёт вопрос о разработке программных приложений на их основе. Все фирмы-производители поддерживают программное обеспечение для своей продукции и для её широкого внедрения ищут способы упрощения средств разработки приложений. Уникальному подходу фирмы Silicon Labs для их BLE (Bluetooth Smart) устройств, и посвящена настоящая статья.
Я уже рассказывал о подходах фирм Anaren/Broadcom [1] и Cypress [2,3]. Обе они предлагают развитые интерактивные графические интерфейсы с пользователем для программирования своих BLE модулей, настолько простые, что позволяют быстро вникнуть в тему даже начинающим. Подходы этих фирм предполагают знание лишь основ технологии BLE, предоставляя среде разработки дополнить проект необходимыми техническими деталями. Прежде чем переходить к описанию подхода Silicon Labs, рассмотрим вкратце её BLE продукцию.
Бóльшую часть своих настоящих BLE чипов и модулей фирма унаследовала от финской компании Bluegiga после поглощения её в середине 2015. В состав линейки изделий фирмы хорошо зарекомендовавшие себя модули BLE112 и BLE113, выполненные на основе чипов CC2540 и CC2541 от Texas Instruments. Фирма Bluegiga ещё до поглощения разработала с нуля свой BLE стек для этих и других чипов и язык программирования BGScript, о котором речь пойдёт ниже. Имеются и комбинированные Bluettoth Smart Ready модули BT121 и BT111 способные работать с протоколами Bluetooth Classic и BLE. Заметим, что BT121 содержит микроконтроллер архитектуры ARM Cortex-M0 от ST-Micro и может также выполнять программу пользователя. Наконец, имеются совсем новые модули BGM113 и BGM111, разработанные уже после поглощения Bluegiga. Оба последних модуля основаны на новых ARM Cоrtex-M4F микроконтроллерах семейства EFR32. Мы рассмотрим подробнее работу с одним из самых новых модулей BGM111, появившегося на рынке осенью 2015.
Отличительной особенностью всех модулей фирмы является высокая чувствительность и повышенная выходная мощность (до +8 и даже +12 dBm) по сравнению с BLE модулями других фирм. Модуль BGM111 имеет малые размеры (всего 13×15×2.2 мм) и программируется через SWD/JTAG интерфейс или UART. На плате модуля установлена чип-антенна.
![]() |
![]() |
Для работы с модулем имеется соответствующий Кит SLWSTK6101A с JLink программатором на борту, графическим дисплеем, сенсором Si7021, и платой расширения (на снимке ниже не показана). Ethernet коннектор на плате может быть использован для программирования модуля через проводную сеть, при этом USB интерфейс используется только для питания платы. Это позволяет использовать Кит в составе прототипа устройства и программировать его дистанционно. Если эта опция не требуется, отладку можно производить и через USB интерфейс. С помощью Кита можно программировать чипы вне демо-платы.

Следует отметить, что несмотря на большую мощность (+8 dBm) и заявленную дальность связи модуля до 200 м, реализовать такую дальность на основе этих демонстрационных плат невозможно, поскольку на дочерней плате установки модуля (видимо из-за геометрических ограничений состыковки с motherboard) не соблюдены рекомендации фирмы по размерам контура земли вокруг чипа.
Перейдём к разработке программы приложения. Для этого имеется неколько возможностей. Первая – использовать API стека BLE и написать всё приложение на языке С, отладив его в среде Simplicity Studio фирмы или в среде IAR EWARM. Это наиболее сложный из рассматриваемых и в тоже время наиболее гибкий способ, позволяющий использовать все аппаратные возможности модуля и программные возможности стека BLE. В рамках одной статьи описать это нереально, для получения более развёрнутого представления рекомендуется прочитать как минимум документы [4,5]. Вторая возможность – использовать модуль в режиме NCP (Network Co-Processor), в котором МК модуля будет лишь поддерживать BLE стек и коммуницировать с внешним МК, на котором реализована вся логика приложения. При этом внешний МК может работать со стеком модуля через эксклюзивный последовательный интерфейс BGAPI (см. правую часть диаграммы ниже). Наконец, при используемом нами подходе модуль работает в режиме SoC (System on Chip) и его МК выполняет функции стека BLE и программу пользователя (левая часть диаграммы), написанной на языке BGScript.

Полное описание скриптового языка BGScript приведено в [6]. Овладеть этим языком тривиально, всё его описание занимает всего 9 неполных страниц в [6]. Для упрощения общения с BLE стеком язык BGScript имеет свои API, полное описание которых содержится в документе [7] на вебсайте фирмы. Там-же описано обращение к функциям BGAPI на языке C внешним МК при использовании модуля в режиме NCP.
Итак, что-же мы хотим запрограммировать? Для сравнения подходов фирм запрограммируем приложение, описанное в [3]. Именно, наше устройство будет предоставлять стандартные сервисы Environmental Sensing и Battery. Иными словами, устройство будет измерять температуру и влажность воздуха, а также состояние своей батареи, и отсылать эти данные клиентам по запросу после соединения. Исходный код проекта распределён по трём текстовым файлам, упомянутым в заголовочном файле проекта bgm111ess.bgproj. Это XML файл с очевидным синтексом, который определяет назначение каждого из вовлечённых файлов. После компиляции проекта получим файл bgm111ess.bin для загрузки в МК. В этом файле будет наше приложение вместе со стеком BLE.

Определение GATT сервисов, поддерживаемых нашим устройством, а также их характеристик и дескрипторов, содержится в файле gatt.xml (см. файлы проекта в приложении). Я создал его в Notepad++ с использованием UUID аттрибутов, принятых группой BLE SIG и представленных на её вебсайте [8]. Синтакс XML файла описания BLE профиля см. в [9]. Когда я делал это в первый раз, я неоднократно вспоминал с благодарностью графический интерфейс системы PSoC Creator в подходе фирмы Cypress [2,3], вставляющий все GATT аттрибуты и их UUID автоматически. Но, всё дело привычки, и буквально после пары дней работы с BGM111 я освоился и перестал считать многократное обращение к ресурсу [8] принципиальным неудобством.
Описав сервисы нашего устройства, следующим шагом является конфигурирование периферии в XML файле hardware.xml. В нашем случае для проекта потребуются 3 модуля МК: I2C интерфейс, DC-DC конвертер, и ADC для измерения напряжения батареи. Понижающий DC-DC конвертер уже имеется на плате модуля и требуется для обеспечения его малого токопотребления. При его отключении регулировка напряжения ядра осуществляется линейным стабилизатором модуля. При этом уменьшаются шумы и помехи и расширяется диапазон напряжения питания, но и ощутимо снижается эффективность использования источника питания. Для конфигурирования I2C нужно только прописать какие выводы модуля использовать для этого. В случае демо-платы сенсор Si7021 подключён к модулю через выводы PC10/PC11. Параметр sleep позволит модулю входить в режим глубокого сна EM2 в периоды неактивности, в котором его токопотребление не превосходит 2.5 мкА.

Наконец, мы вплотную подошли к описанию логики приложения на безтиповом скриптовом языке BGScript. В начале файла bgm111ess.bgs декларированы все используемые нами переменные (строки 2 – 8) и процедура чтения температуры и влажности из датчика Si7021 (строки 10 – 30). Переменные определяются с помощью служебного слова dim и представляются в МК как 32-битные знаковые числа. Вызовы подпрограмм и API функций производится посредством call. Возвращаемые API функциями значения присваиваются переменным, определённым в скобках после передачи параметров функции в строке вызова.

Остальная часть скрипта содержит функции обработки событий стека. Каждая такая функция начинается со слова event, передаваемые в функции параметры описаны в [6]. В нашем случае используются 4 события, структурно показанные ниже. Первое событие генерируется по подаче питания на модуль и содержит код инициализации системы. Второе генерируется по разрешению и запрещению клиентом передачи нотификаций об изменении параметров среды или напряжения батареи. Третье генерируется таймером, определяющим период измерения параметров среды (в нашем случае 1 сек). Наконец, последнее генерируется при разрыве соединения с клиентом, в случае чего следует возобновить передачу advertisement для обеспечения возможности новых соединений клиентов с нашим сервером. Конечно, это далеко не все события, генерируемые стеком BLE в ходе работы нашего приложения, но остальные обработчики событий будут автоматически заменены пустыми заглушками.

В обработчике первого события мы инициализируем переменные в RAM, определяем мощность передатчика и опорник АЦП, устанавливаем передачу advertisement раз в секунду на всех трёх BLE каналах (37,38,39), и разрешаем всем клиентам обнаружить наш сервер и установить с ним соединение.

По разрешении или запрещении клиентом передачи нотификаций нашим сервером, вызывается второй обработчик событий, где мы запоминаем статус разрешения посылки нотификаций (да/нет) в переменных notifyT, notifyH, notifyB, соответственно для температуры, влажности, и состояния батареи. Ниже в строках 72 – 78 показана часть кода для notifyB, остальные переменные устанавливаются аналогично. Помимо этого, мы запускаем программный таймер (строки 80 – 85) для ежесекундного измерения параметров среды. Если все нотификации будут запрещены клиентом, таймер останавливается (строки 86 – 91) и измерение всех параметров, соответственно, прекращается.

В обработчике прерываний таймера производства ежесекундных измерений мы читаем данные из сенсора Si7021 (строка 101), и если разрешена посылка соответствующей нотификации, то вычисляем значение параметра среды по сырым данным сенсора (строка 105 для температуры). Затем записываем вычисленное значение в GATT database сервера (строка 109) и посылаем его клиенту как нотификацию (строка 111). Для минимизации числа передач нотификации посылаются только если измеренное значение отличается от посланного ранее. Ниже приведён код отсылки нотификаций температуры. Обработка остальных данных производится аналогично. Данные температуры и влажности, согласно стандарту сервиса ESS, следует представлять умноженными на 100, тогда они будут автоматически форматироваться клиентом как числа с двумя дробными знаками. Данные для сервиса Battery, также согласно соответствующему стандарту, следует представить как процент по отношению к максимальному напряжению батареи (у нас 3.6В). Напряжение батареи измеряется SoC на выводe AVDD чипа с помощью внутреннего мультиплексора каналов АЦП.

Наконец, последний обработчик прерываний в случае разрыва соединения возобновляет посылку advertisement (строка 143), останавливает таймер измерений (строка 146) и запрещает нотификации параметров (строки 150 – 152).

Приложение готово, следующий этап – это его компиляция и загрузка в МК. Эти действия можно осуществить из командной строки как описано в руководствах. Однако, можно использовать и графический интерфейс. В любом случае загружаем с сайта фирмы систему Bluetooth Smart SDK и после её установки вызываем программу BG-Tool и подключаем Кит к компьютеру. Система автоматически распознает порт JLink адаптера и запросит какой Кит используется. Затем входим в закладку Upload tool, в поле Project File устанавливаем путь к файлу проекта (у нас bgm111ess.bgproj) и нажимаем Build.
Если ошибок не обнаружено, в нижней строке окна Build result получим ALL OK, и имя сгенерированного файла для загрузки автоматически появится в поле Binary File. Нажав на Upload, дожидаемся DONE в нижней строке окна загрузки и нажимаем кнопку Reset на демо-плате Кита, тем самым запуская приложение в режиме Advertising. Отметим, что приложение вместе со стеком занимает около 120К флеша.
Перед тем как тестировать приложение на соединение мне интересно было измерить токопотребление в режиме Advertising. На демо-плате Кита имеется измеритель потребляемого тока с периодом 100 микросекунд. Данные измерителя можно прочитать инструментом Energy Profiler, входящего в состав штатной системы разработки приложений фирмы Simplicity Studio. Установив систему, увидим на экране пики токопотребления в момент передачи advertisement с периодом в 1 сек, согласно установленным в программе параметрам. В верхней строке показано среднее токопотребление Avg Current за период измерений.

Но не обольщайтесь амплитудой пиков токопотребления порядка 1 мА при мощности передатчика 0 dBm. Передача adversisement занимает около 3.8 мс и разрешения дисплея просто не хватает, чтобы отобразить все результаты измерений. Для получения реальной картины следует растянуть график по обоим осям. В результате увидим следующую кривую для одного из пиков.

Точки на графике соответствуют фактически измеренным значениям тока и явно прослеживаются 3 горба при передаче advertisement на трёх каналах. Согласно ДШ, при такой мощности передатчика токопотребление должно быть около 8.2 мА. Однако, не ясно, относится-ли это только к передатчику, или ко всему чипу. Похоже, что скорее первое, и дополнительные 2 мА потребляются спящим в момент передачи ядром МК в режимe EM1. В паузах между передачей advertisement суммарное токопотребление модуля с сенсором снижается примерно до 2-3 мкА при спящем ядре в режиме EM2. Следует отметить, что фирма постоянно совершенствует стек, и где-то месяц назад при прошлом его релизе пики тока были на уровне 15 мА. Видимо, при этом МК не спал во время передачи (может ещё что-то). Потребление ядра Cortex-M4F на уровне 7-8 мА в активном режиме при тактировании на частоте 38 мгц вполне нормально. Примерно такое потребление у нас в паузах между горбами, когда ядро перестраивает радио на новую частоту. Вот ещё один график для максимальной мощности передатчика +8 dBm.

Для тестирования работы сервера в режиме соединения я использовал один из донглов, работа с которым подробнее описана в [3],

. а также систему CySmart фирмы Cypress. В результате увидим знакомую по моим прежним публикациям и ожидаемую таблицу всех обнаруженных донглом аттрибутов сервера (см. детали в [3]).
По поводу этой таблицы интересно отметить, что в ней присутствуют дескрипторы характеристик, которые я не декларировал явно в файле описания профиля gatt.xml. Вероятно, система добавляет их автоматически при компиляции проекта. К слову сказать, что в настоящей версии документа [9] вообще отсутствует возможность спецификации дескрипторов. Однако, как выяснилось, XML таг поддерживается системой, и его описание просто «забыли» включить в документацию. Это, кстати, не единственный «забытый» момент.
Какой-же из трёх модулей лучше – нынешний, или описанные в [1] и [3]? Все модули имеют примерно одинаковые размеры и могут выполнять программу пользователя. У модуля на A20737A от Anaren/Broadcom [1] имеется печатная антенна, которая при всех равных обычно более эффективна чем маленькая чиповая. У модулей BGM111 и EZ-BLE от Cypress чиповыe антенны и последний по габаритам меньше всех. Далее, МК в модуле [1] имеет архитектуру Cortex-M3, а в [3] – Cotrex-M0. Модуль BGM111 содержит Cortex-M4F и по этому параметру превосходит обоих конкурентов. Кроме того, у него гораздо бóльшая выходная мощность и меньшее токопотребление. Эти обстоятельства делают модуль очень интересным для разработчиков, что подтверждается блогом на вебсайте фирмы. Потребление радио у BGM111 в режимах приёма и передачи примерно в 2 раза ниже, чем у модуля в [3]. Однако, как следует из приведённых выше измерений и данных в [2] при мощности 0 dBm, среднее потребление обоих модулей в режиме Advertising с периодом 1 сек примерно одинаковое и находится в пределах 23 – 25 мкА.
А как обстоят дела с программным обеспечением? У каждой из трёх фирм имеются свои достаточно простые и интуитивные подходы. Mодуль [1] мы программировали в системе Anaren Atmosphere путём рисования схемы алгоритма на дисплее и кода там вообще не видели (хотя можно всё писать на С на броадкомовском IDE). Модуль [3] мы программировали частично в графическом конфигураторе, частично на С с использованием системы PSoC Creator и её API. Полная длина исходного кода для нынешнего модуля и для [3] примерно одинаковая. Однако, API фирмы Cypress позволяют получить доступ к каждому винтику системы и настроить буквально каждый бит. В контрасте с этим, функции BGScript API для BGM111 (на настоящий момент) очень ограничены. В частности, ими (и языком BGScript) не поддерживаются данные с плавающей точкой, что фактически сводит на нет все преимущества архитектуры M4F для приложений, где плавающая точка существенна. Более того, код на языке BGScript не компилируется, а интерпретируется ядром. Скорость выполнения кода на BGScript всего порядка тысячи инструкций в секунду. Это делает невозможным обработку некоторых данных в реальном времени. Настройки периферии скриптом также ограничены. Например, нет контроля скорости тактирования I2C и на сегодня она фиксирована на уровне примерно 46 кгц. Пока вообще нет доступа к SPI и ЦАП. Ещё отмечу, что обработчики прерывания на языке BGScript выпоняются атомарно. Иными словами, прерывания при работе каждого обработчика запрещены. Таким образом, скрипт подходит не для всех приложений. Однако, простота его для несложных проектов подкупает, в частности открывает широкую дорогу начинающим.
Отмечу, что язык BGScript разработан фирмой Bluegiga давно и первоначально для SoC на основе процессора 8051, или вообще для использования модулей в качестве ко-процессоров. Silicon Labs/Bluegiga постоянно улучшают возможности настроек модуля, выпуская новые и новые расширения функций API. Модули BGM111/BGM113 достаточно свежие и более-менее приличная версия BGAPI для них вышла только где-то в апреле 2016. В документах [4,5] описаны примеры программирования модулей на С, что позволяет получить гораздо более гибкую конфигурацию модуля и задействовать все его функции. Однако, это несравненно более сложно, чем подход описанный здесь, и заслуживает отдельной статьи. К сожалению, на сегодняшний день даже при использовании системы Simplicity Studio фирмы, и несмотря на то, что она основана на Eclipse, в качестве компилятора для модуля BGM111 (но не для всех других продуктов фирмы) можно использовать только IAR. И для BLE приложений, конечно, нужна версия IAR без ограничения на длину кода. Однако, в планах фирмы предполагается предоставление возможности для использования GNU ARM компилятора. Будем надеяться на улучшение этой ситуации в скором будущем.
Литература
1. Разработка BLE приложений в системе Anaren Atmosphere
2. Bluetooth Smart Broadcaster на RSoC фирмы Cypress
3. Реалиазция стандартного GATT-BLE профиля на RSoC фирмы Cypress
4. Silicon Labs UG136: Silicon Labs Bluetooth® Smart SoC Application Developer’s Guide
5. Silicon Labs AN945: Bluetooth® Smart Application Development with IAR
6. Silicon Labs UG173: Blue Gecko BGScript™ Developer’s Guide
7. Silicon Labs Bluetooth Smart Software API Reference Manual
8. GATT Services
9. Silicon Labs UG118: Blue Gecko Bluetooth® Smart Profile Toolkit Developer’s Guide

