Знакомство с микроконтроллерами Renesas на примере линейки RL78
Если среднестатистического русскоговорящего разработчика микроконтроллерной электроники попросить назвать 3–5 наиболее известных или крупных производителей микроконтроллеров, наиболее вероятно услышать в ответ такие имена как Microchip, Atmel, TI или STM. Кто-то назовет также NXP, Freescale, Samsung или Fujitsu. Но мало кто вспомнит про еще одного производителя, который на постсоветском пространстве почти неизвестен. Речь идет о японской компании Renesas Electronics, которая, между тем, в своих годовых отчетах хвастается вот такой интересной инфографикой…Микроконтроллеры общего применения: микроконтроллеры для различных сфер применения, исключая автомобильную электронику Таким образом, «темная лошадка», о продуктах которой пойдет речь ниже, является лидером мирового рынка как микроконтроллеров общего назначения, так и рынка автомобильной электроники, и имеет полное право называть себя «поставщиком микроконтроллеров №1 в мире». Секрет такого успеха компании прост: Renesas Technology появилась в 2003 году как совместное предприятие Hitachi и Mitsubishi, а в 2010 году к ним также присоединилась Nec Electronics, образовав совместное предприятие Renesas Electronics. Итог этого сотрудничества — возможность использования хорошо зарекомендовавших себя ядер трех компаний совместно с эффективной специализированной периферией: От Hitachi были использованы ядра H8, H8S, H8SX и SuperH. От Mitsubishi в руки разработчиков попали ядра M16/M32, R32, 720 и 740. От NEC — линейки ядер V850 и 78K. Получив такое количество наработок, Renesas начала разрабатывать новые линейки с использованием доступных компаниям-участникам технологий. На замену Hitachi H8SX и Mitsubishi R32C пришла линейка 32-разрядных микроконтроллеров RX. В качестве преемника популярного NEC V850 была разработана RH850 — линейка микропроцессоров для применения в автомобильной электронике. Также было разработано ядро R8C как решение нижнего ценового диапазона, совместимое с Mitsubishi M16C. Первой самостоятельной разработкой Renesas после объединения с NEC стало новое 16-ти разрядное ядро RL78 с CISC-архитектурой. В нем разработчики попробовали совместить положительные стороны R8C и 78K0 в одном семействе. На данный момент семейство можно условно разделить на 5 «веток» для различного применения: RL78/G1x — микроконтроллеры общего назначения: до 28 каналов ADC, DAC, USB, I2C, SPI, PWM, RTCC. RL78/L1x — микроконтроллеры управления ЖКИ-панелями: поддержка USB 2.0, управление ЖКИ-индикаторами до 4×53 / 8×48 сегментов. RL78/F1x — микроконтроллеры для автомобильной промышленности: поддержка интерфейса CAN, управление двигателями, расширенный диапазон температур до +150 ºC. RL78/D1x — микроконтроллеры для приборостроения: контроллер шаговых двигателей на 4 канала прямо «из коробки», управление ЖКИ-индикаторами до 4×53 сегментов, CAN. RL78/I1x — микроконтроллеры для управления освещением: DALI/DMX512, PWM. Ассортимент микроконтроллеров RL78 просто огромен, подобрать подходящую под конкретное использование модель не составит труда. Контроллеры всех семейств могут похвастаться наличием линий DMA, ADC/DAC-преобразователями, поддержкой интерфейсов I2C и SPI, а также поддержкой работы в промышленной сети LIN. Конвейер CISC ядра RL78 состоит из 3-х стадий, около 86% инструкций могут быть исполнены за 1–2 процессорных цикла. Также поддерживается аппаратное исполнение MAC-команд 16×16 бит. В качестве основного преимущества микроконтроллеров RL78 производитель заявляет минимальное энергопотребление, называя линейку не иначе как true low power (по-настоящему низкое энергопотребление). Не смотря на это можно отметить сохранение высокой производительности и широкий диапазон рабочих напряжений. Для наглядности сведем в общую таблицу ключевые характеристики данного контроллера и основных конкурентов от «народных» брендов: Сравнение характеристик популярных микроконтроллеров STM8L STM32L PIC24 Lite MSP430 RL78 Разрядность 8 бит 32 бита 16 бит 16 бит 16 бит Производительность ~1 DMIPS / МГц, 16 МГц max ~1,04 DMIPS / МГц, 32 МГц max ~0,5 MIPS / МГц, 32 МГц max ~1 DMIPS / МГц, 25 МГц max ~1,3 DMIPS / МГц, 32 МГц max Flash 2–64 КБ 32–384 КБ 16–32 КБ 0,5–512 КБ 0,125–512 КБ RAM 1–4 КБ 4–48 КБ 1–2 КБ 0,125–66 КБ 1–32 КБ Потребление раб. 150–180 μA/МГц 214–230 μA/МГц 195–350 μA/МГц 80–280 μA/МГц 46–156,25 μA/МГц Потребление сон + RTC 1,3 μA 0,9 μA 0,5–0,7 μA 0,7 μA 0,56–0,68 μA Диапазон питания 1,65–3,6 В 1,65–3,6 В 1,8–3,6 / 2,0–5,5 В 1,65–3,6 B 1,6–5,5 В Примерный диапазон цен 0,5–4,5 $ 1,5–7,7 $ 0,8–4,2 $ 0,34–9,5 $ 0,68–8$ В этой таблице намеренно не упоминается периферия, но и тут перевес определенно не в пользу конкурентов — с периферией у Renesas традиционно все очень хорошо. Что касается полезных особенностей некоторых представителей линейки, можно отметить следующее: Data transfer control — возможность пересылки данных между периферийными модулями без участия процессора. Event link controller — обмен прерываниями между периферийными модулями без участия процессора. Flash-память c ECC. LVD — детектирование низкого напряжения. Возможность выдавать до 20 мА на GPIO пин, 5В-толерантные пины. Все это звучит хорошо и красиво, но так ли удобны микроконтроллеры Renesas при разработке? Чтобы проверить это, возьмем отладочную плату Renesas YRPBRL78G13 и попробуем оценить порог вхождения для использования микроконтроллеров Renesas серии RL78. «На борту» платы установлен микроконтроллер R5F100LEAFB, который относится к семейству RL78/G13: 64 КБ flash-памяти, 4 КБ RAM, также дополнительно выделено 4 КБ flash-памяти с увеличенным количеством циклов перезаписи для хранения данных. Встроенный ADC на 12 каналов обеспечивает разрешение до 10 бит, а DMA на 2 канала поможет сохранять полученные данные в памяти. Четырнадцать каналов таймеров, семь каналов PWM, три UART-а и семь I2C — вполне неплохо для «малыша» в корпусе LFQFP64 за 1,64$ (правда, в партиях от 1000 штук). Данная плата отнесена самим Renesas к разделу демонстрационных (promotion boards), поэтому её розничная стоимость составляет 25$. Справедливости ради, это не самое интересное предложение компании, отладочная плата YRPBRL78L12 на RL78/L12 на данный момент предлагается всего за 10$. Для желающих существует также большое количество больших, «взрослых» отладок. Отладочная плата Renesas YRPBRL78G13 Плата выполнена в компактном форм-факторе 100×30 мм и кроме самого контроллера RL78/G13 содержит аппаратный отладчик, позволяющий не только прошивать плату по USB, но и производить внутрисхемную отладку в реальном времени. Плата предусматривает питание как от шины USB, так и от внешнего источника питания. Схема отладочной платы Renesas YRPBRL78G13 Внешнее питание (+5В) может быть подведено на плату напрямую с помощью разъема J4, при этом необходимо перекоммутировать расположенные рядом контактные площадки. С помощью перемычек J6–J9 можно выбрать решим работы USB-порта, OCD (On Chip Debug) или Virtual UART (эмулятор COM-порта через USB с помощью дополнительного 8-ми битного контроллера μPD78F0730 ранее упомянутого семейства 78K0). Virtual UART, впрочем, не всегда удобно использовать из-за необходимости постоянно переставлять джамперы при отладке. При необходимости можно использовать и внешний отладчик Renesas E1, подключаемый через разъем J5. На длинные линейки J1 и J2 выведены практически все пины микроконтроллера. Коннектор J10 используется для прошивки вспомогательного контроллера 78K0 на производстве. Для контроля энергопотребления микроконтроллера питание к нему подведено через перемычку J3. Также на плате расположено два светодиода (индикатор питания и пользовательский светодиод) и потенциометр, подключенный к 10-разрядному ADC микроконтроллера. Что интересно, для регулирования потенциометра в комплекте с платой идет маленькая отвертка. Итак, с аппаратной частью все ясно, теперь посмотрим, что Renesas предлагает разработчикам программного обеспечения. Разработка начинается с документации, и тут Renesas можно назвать примером для подражания: спецификацию без проблем можно найти в свободном доступе, и с их актуальностью и полнотой чаще всего нет проблем — непосвященного человека объем документации может даже испугать. Особое внимание производитель традиционно уделяет описанию периферии и замечаниям по применению (application notes). В связи с широкой распространенностью у Renesas также есть свое онлайн-сообщество со скромным названием Renesas Rulz. Язык написания кода для RL78 — Си. В качестве среды разработки предлагается многими любимый IAR Embedded Workbench с поддержкой RL78 (версия EWRL78), традиционно существует его бесплатная версия KickStart edition с ограничением на размер кода в 16 КБ. Встроенный в IAR отладчик C-SPY полностью поддерживается: можно ставить точки останова и свободно гулять по коду с просмотром регистров/переменных. Также в качестве среды разработки возможно использование e² studio (eclipse embedded studio) с отладчиком GDB, а также множество других утилит. Код прошивки можно писать как для «голого» железа, так и с использованием RTOS: производитель предлагает использовать реализации FreeRTOS, CMX-RTX, Micrium μC/OS, OSEK Run Time Interface (ORTI), Express Logic или Segger embOS. Для любителей домашней автоматизации существует реализация стека KNX. Для заливки прошивки в контроллер существует множество приложений, например бесплатная утилита WriteEZ5. Эта утилита универсальна: для поддержки определенной модели микроконтроллера достаточно скачать соответствующий конфигурационный файл в формате pr5 и указать на него программе перед прошивкой. Наиболее интересный подход с точки зрения разработки программного кода Renesas демонстрирует своей графической утилитой Applilet. Эта утилита позволяет в удобном человеко-понятном виде сконфигурировать всю используемую микроконтроллером периферию, gpio, подсистему прерываний и режимы работы ADC/DAC, а затем на основании этой конфигурации сгенерировать код инициализации и «заглушки» для всех обработчиков событий. Сгенерированный код можно затем использовать в качестве основы проекта и, при условии соблюдения правил организации кода (об этом ниже), в любой момент иметь возможность изменения конфигурации готового проекта. Такой подход позволит сконцентрироваться на логике приложения, инициализацию периферии и API для её управления сгенерированный утилитой код возьмет на себя. При этом нет необходимости разбираться с монстроподобными библиотеками работы с периферией, как это часто бывает у других вендоров, а генерируемый код гарантированно содержит минимум избыточности. Таким образом, порог вхождения для RL78 значительно снижается, даже разработчик без опыта программирования микроконтроллеров сможет написать простую прошивку за минимальное время. В качестве примера покажем, как написать традиционный Hello world из мира микроконтроллеров — помигаем светодиодом. А чтобы было не так скучно, мигать мы будет не просто так, а используя широтно-импульсную модуляцию и таймеры для плавного включения и выключения светодиода. Всего нам понадобится 3 таймера — 2 из них будут использованы для ШИМа, а по третьему мы будем плавно менять скважность импульсов, что в нашем случае приведет к изменению яркости. Откроем утилиту Applilet от Renesas и создадим новый проект для контроллера R5F100LEAFB: Новый проект в окне утилиты Applilet3 for RL78/G13 Так выглядит окно утилиты Applilet текущей на данный момент версии 3, открытое на вкладке настройки нулевого канала таймера. При использовании соответствующего режима работы канал 0 отведен под таймер, задающий период ШИМа, поэтому настройками не изобилует. При включении прерывания INTTM00, ровно как и любого другого прерывания от периферии, в генерируемый утилитой код будет автоматически добавлен (и инициализирован) код «заглушки» данного прерывания. Канал 1 непосредственно задает активную часть периода, поэтому на вкладке его конфигурации можно задать ширину активного уровня (в процентах от периода канала 0) и настройки уровня: Настройки канала 1 в окне утилиты Applilet3 for RL78/G13 Также нам понадобится так называемый интервальный таймер, который будет генерировать прерывание каждые 0,2 секунды. Его настройка также сводится к паре «галочек» в интерфейсе утилиты Applilet. Настройка интервального таймера в окне утилиты Applilet3 for RL78/G13 Ну и конечно, нам понадобится перевести пин P77, к которому подключен наш светодиод, в режим вывода. Настройка пин P77в окне утилиты Applilet3 for RL78/G13 На этом можно остановиться, сохранить проект и нажать заветную кнопку Generate code (сгенерировать код). В качестве среды разработки будем использовать IAR. Посмотрим на файлы сгенерированного проекта: r_cg_cgc.cr_cg_cgc_user.cr_cg_it.cr_cg_it_user.cr_cg_port.cr_cg_port_user.cr_cg_timer.cr_cg_timer_user.cr_main.cr_systeminit.c Как можно понять из их названий, весь код разбит на модули согласно выполняемым функциям: clock generator, interval timer, gpio, timers, а также основной цикл программы (в нашем случае — пустой) и код низкоуровневой инициализации контроллера. В файлах вида *_user.c содержатся заглушки обработчиков событий соответствующей периферии. Откроем файл r_cg_it_user.c и модифицируем обработчик интервального таймера. Каждый вызов обработчика будет производиться уменьшение либо увеличение скважности ШИМа на величину, задаваемую количеством шагов STEPS_NUM. При достижении максимума или минимума, направление изменения яркости меняем на противоположное. #pragma vector = INTIT_vect __interrupt static void r_it_interrupt (void) { /* Start user code. Do not edit comment generated here */ int16_t TDR0_value, TDR1_value, step;
R_TAU0_Channel0_Stop (); TDR0_value = TDR00; TDR1_value = TDR01; step = TDR0_value / STEPS_NUM;
if (moving_up == 1) { if (TDR1_value > TDR0_value — step) moving_up = 0; else TDR1_value += step; } else { if (TDR1_value < step) moving_up = 1; else TDR1_value -= step; }
TDR01 = TDR1_value; R_TAU0_Channel0_Start (); /* End user code. Do not edit comment generated here */ } Как несложно заметить, сгенерированный проект изобилует комментариями, предназначенными для разделения автоматически сгенерированного и написанного пользователем кода. При соблюдении этих границ и сохранении комментариев изменить настройки периферии с помощью утилиты Applilet можно будет в любой момент без потери существующего пользовательского кода проекта. Единственное что нам осталось добавить в проект — связь состояния ШИМа и пина P77, к которому подключен светодиод. Для этого при срабатывании прерывания канала 0 таймера устанавливаем ножку контроллера в единицу: #pragma vector = INTTM00_vect __interrupt static void r_tau0_channel0_interrupt (void) { /* Start user code. Do not edit comment generated here */ P7_bit.no7 |= 1; /* End user code. Do not edit comment generated here */ } А для канала 1 — сбрасываем это значение в ноль: #pragma vector = INTTM01_vect __interrupt static void r_tau0_channel1_interrupt (void) { /* Start user code. Do not edit comment generated here */ P7_bit.no7 &= 0; /* End user code. Do not edit comment generated here */ } Все готово: компилируем проект, заливаем в контроллер с помощью утилиты WriteEZ и, переставив джамперы на нашей отладочной плате из режима отладки в рабочий режим, наблюдаем как светодиод на плате медленно и плавно зажигается и гаснет, как и требовалось. При использовании показанного подхода внутренние особенности микроконтроллеров Renesas серии RL78 остались для нас «за кулисами», что возможно не удовлетворит потребности требовательных разработчиков при реализации сложных проектов, однако для простых алгоритмов работы использование автоматической генерации инициализационного кода для обширного списка периферии контроллеров Renesas RL78 может существенно снизить время, а значит и стоимость разработки устройств с ультранизким энергопотреблением.Вопросы и комментарии приветствуются.
P.S. Эта статья была опубликована в новом номере печатногожурнала «Вестник электроники».