Очень удобно все свои разработки делать на одном и том же семействе микроконтроллеров. А ещё удобнее их делать на одном и том же встраиваемом модуле с микроконтроллером. Но тогда модуль должен быть максимально универсальным. Здесь вариант такого модуля.
Модуль можно использовать в самых разных устройствах, от программируемых логических контроллеров, роботов, станков, охранных систем, логгеров, домофонов до ёлочных гирлянд со спецэффектами и брелков ДУ.
Отличительные особенности — большое количество конфигурируемых входов‑выходов в том числе аналоговых, сравнительно небольшие размеры (63×26×6 мм) и автономное питание со встроенным зарядником и дополнительным элементом питания для часов реального времени.
Модуль является продолжением линии разработки начавшейся с открытого проекта K66BLEZ
Новый модуль теперь имеет ещё больше интерфейсов, больший объем памяти и большую производительность.
Функции и интерфейсы на внешних выводах модуля:
Всего 83 входа-выхода. Из низ 81 могут конфигурироваться и как вход, и как выход.
В том числе 21 вход с 12-битным аналоговым преобразованием
В том числе 6 входов с синхронным аналогово-цифровым преобразованием ( используется для прецизионного управления моторами или для анализаторов 3-фазных электросетей).
В том числе 6 специализированных выходов для управления BLDC и BLAC моторами
Интерфейс RS-485 или RS-232
Интерфейс CAN до 1 Мбит
Интерфейс I2C
Интерфейс SPI до 30 Мбит
Интерфейс USB HS
Интерфейс USB FS
Принципиальная схема
Самое интересное - это внешние разъёмы. Поэтому здесь о них подробней.
Большинство выводов имеют альтернативные функции. Но названия цепей на разъёмах имеют имена созвучные конкретной одной функциональности. Это сделано потому что модули изначально создавались как замена предыдущему поколению модулей с уже устоявшимися функциями. Однако это не означает что выводы нельзя применить по другому назначению. Остаётся на усмотрение разработчика сколько различных интерфейсов и функций он получит в конкретной конфигурации. Но назовём некоторые абсолютные значения достигаемые при разных конфигурациях:
Количество независимых интерфейсов 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.
Проект адаптерной платы также находится в репозитарии.
Создание первой программы
Для микроконтроллеров семейств Synergy производителем чипов предоставляется пакет софта под названием Synergy Software Package (SSP). Там будет IDE под названием e2studio на базе Eclipse. В этой IDE делается полная настройка периферии, пинов и промежуточного программного обеспечения типа файловой системы, RTOS, TCP стека, USB стека и проч. SSP с частотой приблизительно пару раз в год обновляется, поэтому надо следить за текущей версией.
Начинается работа с конфигурирования системы тактирования на чипе:
Конфигурация тактирования в чипах Synergy на удивление простая в отличие например от серии STM32H.
Затем конфигурируем пины
Следующим этапом конфигурируем драйвера 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. Поэтому в нем так непривычно много комментариев.
А результат работы будет такой:
Весь проект железа и софта находится в репозитарии. Надо сказать что после генерации проекта в e2studio с использованием Azure RTOS создаётся порядка 4 тысяч файлов, поэтому проект в репозитарии лежит зазипованный. В последующем будет продемонстрировано как упростить проект и избавиться от HAL.