Знайомство з микроконтроллерами 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 / 8x48 сегментів.
 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.c
r_cg_cgc_user.c
r_cg_it.c
r_cg_it_user.c
r_cg_port.c
r_cg_port_user.c
r_cg_timer.c
r_cg_timer_user.c
r_main.c
r_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. Ця стаття була опублікована в новому номері друкованого журналу «Вісник електроніки» .
    
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.