Открытый проект встраиваемого модуля для IoT

Выполнен на чипе семейства Synergy. Ядро Cortex-M4, 240 МГц, 640 КБ RAM, 32 МБ SDRAM, 4 МБ Flash, LoRA, BLE, Wi-Fi a/b/g/n, uSD, USB HS, IMU, NV RTC, Li-ion Charger, 81 I/O, 7 мкА wakeful sleep.

Выполнен на чипе семейства Synergy. Ядро Cortex-M4, 240 МГц, 640 КБ RAM, 32 МБ SDRAM, 4 МБ Flash, LoRA, BLE, Wi-Fi a/b/g/n, uSD, USB HS, IMU, NV RTC, Li-ion Charger, 81 I/O, 7 мкА wakeful sleep.

Очень удобно все свои разработки делать на одном и том же семействе микроконтроллеров. А ещё удобнее их делать на одном и том же встраиваемом модуле с микроконтроллером. Но тогда модуль должен быть максимально универсальным. Здесь вариант такого модуля.

Модуль можно использовать в самых разных устройствах, от программируемых логических контроллеров, роботов, станков, охранных систем, логгеров, домофонов до ёлочных гирлянд со спецэффектами и брелков ДУ.

Отличительные особенности — большое количество конфигурируемых входов‑выходов в том числе аналоговых, сравнительно небольшие размеры (63×26×6 мм) и автономное питание со встроенным зарядником и дополнительным элементом питания для часов реального времени.

Модуль является продолжением линии разработки начавшейся с открытого проекта K66BLEZ

Предыдущий модуль K66BLEZ

Предыдущий модуль K66BLEZ

Новый модуль теперь имеет ещё больше интерфейсов, больший объем памяти и большую производительность.

Функции и интерфейсы на внешних выводах модуля:

  • Всего 83 входа-выхода. Из низ 81 могут конфигурироваться и как вход, и как выход.

  • В том числе 21 вход с 12-битным аналоговым преобразованием

  • В том числе 6 входов с синхронным аналогово-цифровым преобразованием (используется для прецизионного управления моторами или для анализаторов 3-фазных электросетей).

  • В том числе 6 специализированных выходов для управления BLDC и BLAC моторами

  • Интерфейс RS-485 или RS-232

  • Интерфейс CAN до 1 Мбит

  • Интерфейс I2C

  • Интерфейс SPI до 30 Мбит

  • Интерфейс USB HS

  • Интерфейс USB FS

Принципиальная схема

Микроконтроллер R7FS7G27H2A01CBD

Микроконтроллер R7FS7G27H2A01CBD

Схема питания, зарядник, RTC, USB порты

Схема питания, зарядник, RTC, USB порты

Подключение модуля Wi-Fi

Подключение модуля Wi-Fi

Подключение радиочипа

Подключение радиочипа

Подключение SDRAM

Подключение SDRAM

Внешние АЦП, держатель SD карты, чип акселерометра-гироскопа

Внешние АЦП, держатель SD карты, чип акселерометра-гироскопа

Самое интересное — это внешние разъёмы. Поэтому здесь о них подробней.

Распиновка системных разъёмов

Распиновка системных разъёмов

Большинство выводов имеют альтернативные функции. Но названия цепей на разъёмах имеют имена созвучные конкретной одной функциональности. Это сделано потому что модули изначально создавались как замена предыдущему поколению модулей с уже устоявшимися функциями. Однако это не означает что выводы нельзя применить по другому назначению. Остаётся на усмотрение разработчика сколько различных интерфейсов и функций он получит в конкретной конфигурации. Но назовём некоторые абсолютные значения достигаемые при разных конфигурациях:

  • Количество независимых интерфейсов I2C — 4

  • Количество независимых интерфейсов SPI — 3

  • Количество независимых интерфейсов UART- 3

  • Количество независимых интерфейсов CAN -1

  • Количество каналов для сенсорных ёмкостных кнопок — 6

  • Количество независимых ШИМ каналов — 17

  • Количество независимых АЦП — 4 (каналов 21)

  • Количество независимых ЦАП — 2

В списке выше не учитываются интерфейсы занятые периферией на самом модуле.

Иногда производители модулей выводят на внешние разъёмы сигналы уже занятые периферией их модулей, например сигналы SDRAM или SDIO. Видимо рассчитывая на некое мультиплексирование организуемое на материнской плате. В нашем случае не так. На внешний разъем выведены только те сигналы, которые не используются на самом модуле. Исключение лишь составляет интерфейс SPI8, который подключается на модуле к чипу часов реального времени и внешнему АЦП.

Чтобы было удобнее находить функции выводов и конфигурировать была создана интерактивная таблица в Excel. Таблица позволяет по номеру вывода на разъёме идентифицировать вывод на микроконтроллере и обратно, а также узнать весь перечень возможных функций вывода.

Таблица для поиска назначения выводов модуля и микроконтроллера

Таблица для поиска назначения выводов модуля и микроконтроллера

Могут возникнуть вопросы о странных резисторах на схеме R12, R17, R25. В полном варианте комплектации платы они не паяются, но они нужны когда изготавливается бюджетный вариант платы. Схема при этом выглядит вот так:

Лист схемы для бюджетного варианта платы

Лист схемы для бюджетного варианта платы

Конструкция модуля

Вид сверху

Вид сверху

Вид снизу

Вид снизу

Плата 6-слойная с минимальным зазором 0.1 мм и шириной дорожки 0.1 мм в верхних слоях и 0.075 мм во внутренних слоях.

Схема слоев платы

Схема слоев платы

Общий вид трассировки

Общий вид трассировки

Габариты платы

Габариты платы

Плата может размещаться в стандартном корпусе 1551CTSK, поэтому имеет такую несколько не типичную форму

Плата в корпусе

Плата в корпусе

Программирование модуля

Есть два способа начальной загрузки прошивки во Flash микроконтроллера.

Первый способ заключается в использовании штатного начального загрузчика находящегося в ROM микроконтроллера. Начальный загрузчик способен работать через интерфейсы UART9 (X6.13 — RX, X40.50 — TX) и через интерфейс USB FS (X4.58 — USB N, X4.59 — USB P). Для программирования используются утилиты предоставляемые на сайте Renesas.

Второй способ заключается в программировании через SWD/JTAG интерфейс организованный на разъёме X6

В обоих случаях применяются специальные адаптерные платы. Адаптерные платы хороши тем что позволяют одни модули заменять на другие без потери функциональности. Например показанная ниже адаптерная плата S7V30_K66BLEZ вместе с модулем S7V30 полностью функционально заменяет модуль K66BLEZ и ещё добавляет функциональности. На адаптерной плате находится стандартный разъем SWD/JTAG к которому уже можно подключать стандартные кабеля JTAG адаптеров типа JLink.

Плата адаптера на посадочное место модуля K66BLEZ

Плата адаптера на посадочное место модуля K66BLEZ

Проект адаптерной платы также находится в репозитарии.

Создание первой программы

Для микроконтроллеров семейств Synergy производителем чипов предоставляется пакет софта под названием Synergy Software Package (SSP). Там будет IDE под названием e2studio на базе Eclipse. В этой IDE делается полная настройка периферии, пинов и промежуточного программного обеспечения типа файловой системы, RTOS, TCP стека, USB стека и проч. SSP с частотой приблизительно пару раз в год обновляется, поэтому надо следить за текущей версией.

Начинается работа с конфигурирования системы тактирования на чипе:

Панель конфигурации системы тактирования на чипе

Панель конфигурации системы тактирования на чипе

Конфигурация тактирования в чипах Synergy на удивление простая в отличие например от серии STM32H.

Затем конфигурируем пины

Панель конфигурирования функций пинов

Панель конфигурирования функций пинов

Следующим этапом конфигурируем драйвера HAL и рабочую задачу

Панель конфигурирования HAL

Панель конфигурирования HAL

Тут почти все готово. Надо знать, что задачи в SSP создаются с использованием Azure RTOS. Сразу это может не стать понятным, поскольку в сгенерированных исходниках сама RTOS будет скрываться в библиотеке libtx.a. Но можно сгенерировать проект и с исходниками RTOS. Правда это будет немного не та версия, которая представлена репозитарии Azure RTOS.

Остаётся заполнить тело задачи. Как обычно, будем моргать светодиодами. На плате их три: синий, красный. зелёный. Текст нашей задачи будет выглядеть вот так:

 * @brief  Blinky example application
 *
 * Blinks all leds at a rate of 1 second using the the threadx sleep function.
 * Only references two other modules including the BSP, IOPORT.
 *
 **********************************************************************************************************************/
void blinky_thread_entry(void)
{
    /* Define the units to be used with the threadx sleep function */
	const uint32_t threadx_tick_rate_Hz = 100; // @suppress("Type cannot be resolved")
    /* Set the blink frequency (must be <= threadx_tick_rate_Hz */
    const uint32_t freq_in_hz = 2; // @suppress("Type cannot be resolved")
    /* Calculate the delay in terms of the threadx tick rate */
    const uint32_t delay = threadx_tick_rate_Hz/freq_in_hz; // @suppress("Type cannot be resolved")
    /* LED type structure */
    bsp_leds_t leds;
    /* LED state variable */
    ioport_level_t level = IOPORT_LEVEL_HIGH;

    /* Get LED information for this board */
    R_BSP_LedsGet(&leds);

    /* If this board has no leds then trap here */
    if (0 == leds.led_count)
    {
        while(1);   // There are no leds on this board
    }

    while (1)
    {
        /* Determine the next state of the LEDs */
        if(IOPORT_LEVEL_LOW == level)
        {
            level = IOPORT_LEVEL_HIGH;
        }
        else
        {
            level = IOPORT_LEVEL_LOW;
        }

        /* Update all board LEDs */
        for(uint32_t i = 0; i < leds.led_count; i++) // @suppress("Type cannot be resolved")
        {
            g_ioport.p_api->pinWrite(leds.p_leds[i], level);
        }
        /* Delay */
        tx_thread_sleep (delay);
    }
}

Этот текст, за исключением нескольких строк, сгенерирован средой SSP автоматически по шаблону Blink. Поэтому в нем так непривычно много комментариев.

А результат работы будет такой:

131518bab135f05384cba0e5469870bd.gif

Весь проект железа и софта находится в репозитарии. Надо сказать что после генерации проекта в e2studio с использованием Azure RTOS создаётся порядка 4 тысяч файлов, поэтому проект в репозитарии лежит зазипованный. В последующем будет продемонстрировано как упростить проект и избавиться от HAL.

© Habrahabr.ru