Плата Sipeed Longan Nano - RISC-V GD32VF103CBT6, инструкция по разработке

Плата Sipeed Longan Nano - RISC-V GD32VF103CBT6, инструкция по разработке

Несколько лет назад мы впервые столкнулись с микроконтроллером GigaDevice GD32, совместимым с STMicro STM32F103, но с более высокой тактовой частотой 108 МГц и внутренней флэш-памятью с нулевым временем ожидания. Микроконтроллер стал альтернативой STMicro, поскольку помимо программного обеспечения он также был совместим контактами.

Компания вернулась с новым микроконтроллером, но не на базе Arm. GigaDevice GD32V основан на архитектуре с открытым исходным кодом RISC-V. Новый контроллер GD32VF103CBT6 один из первых универсальных микроконтроллеров RISC-V, который превосходит свой аналог Arm Cortex-M3 по производительности и энергопотреблению.

Компания также анонсировала несколько плат для разработки, но их не так просто приобрести, поскольку они представлены на веб-сайте Tmall в Китае. Хорошая новость заключается в том, что Sipeed представила плату для разработки Longan Nano на базе микроконтроллера GD32VF103CBT6, и она продается на Seeed Studio за 4,9 доллара.

Технические характеристики платы Longan Nano:

  • Микроконтроллер Gigadevice GD32VF103CBT6 32-разрядный микроконтроллер RISC-V (rv32imac) с тактовой частотой 108 МГц и флэш-памятью 128 КБ, SRAM 32 КБ
  • Хранилище — слот для карты MicroSD
  • Дисплей — 0,96″ 160×80 IPS RGB LCD подключен через SPI
  • USB — 1х порт USB Type-C для питания и программирования
  • Расширение — 2×16 сквозных отверстий (шаг 2,54 мм), обеспечивающих 3x USART, 2x I2C, 3x SPI, 2x I2S, 2x CAN, 1x USBFS (OTG), 2x ADC (10 каналов), 2x DAC
  • Таймеры — 4-х 16-разрядных таймера общего назначения, 2х основных 16-разрядных таймера, 1х дополнительный 16-разрядный таймер
  • Кристаллы — пассивный высокоскоростной кристалл 8 МГц + низкоскоростной RTC кристалл 32,768 кГц
  • Отладка — 2x 4-контактный интерфейс отладки JTAG
  • Разное — Watchdog; RTC; SysTick; Кнопки загрузки и сброса
  • Питание — 5В через порт USB-C. Спецификации не упоминают об этом, но батарея LiPo может поддерживаться через контакты VB / GND. Это было бы хорошо, так как GD32V потребляет только 1/3 от Arm Cortex-M3.
  • Размеры — 46,1 х ​​20 мм

Sipeed Longan Nano - RISC-V GD32VF103CBT6

Longan Nano, который компания Sipeed также называет «Red Bill» аналогично плате STM32 Bluepill, может работать с операционными системами RT-Thread и LiteOS, а разработка программного обеспечения может выполняться с помощью таких инструментов, как PlatformIO IDE, Arduino IDE (скоро), GCC и OpenOCD.

Sipeed Longan Nano - RISC-V GD32VF103CBT6

Существует три способа загрузки встроенного ПО на плату: загрузка через USB DFU, загрузка UART ISP, загрузка JTAG. Для п<ервого способа потребуется только кабель USB-C, для других — отладочная плата USB-UART и отладчик с поддержкой JTAG (например, J-Link) соответственно.

Вы можете найти платформу разработки GD32V для PlatformIO на Github, загрузить документацию по программному и аппаратному обеспечению и инструменты из папки HTTP, а также получить поддержку в Telegram-канале. Есть также веб-сайт с документацией, но на момент написания этого обзора он почти пустой.

Помимо ЖК-дисплея, Longan Nano поставляется с акриловым чехлом.

Sipeed Longan Nano - RISC-V GD32VF103CBT6

Компиляция и запуск проекта

Для начала идем на AliExpress и выбираем подходящего продавца. Кого-то конкретно не порекомендую, продавцы все время появляются и исчезают, так что можно смело выбирать магазин с наибольшим числом проданных товаров и хорошими отзывами. Там же можно купить и отдельные микросхемы gd32vf103cbt6. В скором времени попробуем применить их в одном из новых устройств, разрабатываемых нами! Далее нам надо настроить программатор и среду разработки. Подробности и ссылки под катом:

Драйвер и программатор

Для начала со страницы gd32mcu качаем драйвер GD32 Dfu Drivers и программатор GD32 All-In-One Programmer.

Установка драйвера:

Запущенный программатор:

Также нам понадобятся Visual Studio Code и PlatformIO

Visual Studio Code

Visual Studio Code (VS Code) — это популярная интегрированная среда разработки (англ. — IDE, Integrated Development Environment) от компании Microsoft.

Этот свободно доступный редактор кода предлагает множество расширенных функций, таких как автозаполнение (или автодополнение) и Intellisense, которые делают программирование намного более приятным и быстрым занятием.

VS Code также имеет множество доступных расширений, которые улучшают его функциональные возможности. Одним из таких расширений является PlatformIO.

PlatformIO

PlatformIO — это кроссплатформенная система, которую можно использовать для разработки программных платформ для Arduino, ESP32, PIC32, AVR и RISC-V.

PlatformIO может использоваться с VS Code для предоставления мощного набора инструментов, которые помогут вам в разработке на RISC-V. Из этого материала вы узнаете как установить расширение VS Code PlatformIO для дальнейшей разработки под платы RISC-V.

загрузить VS Code можно бесплатно с официального сайта. Как только IDE будет загружена, дважды щелкните на exe-файл для установки. Сама установка достаточно стандартная.

После запуска VS Code нажимаем Ctrl + Shift + X, ищем и устанавливаем расширение PlatformIO!

Также надо установить поодержку языка C++, для этого строке поиска введите ms-vscode.cpptools.

После этих действий, можно собирать проекты под плату Sipeed Longan Nano!

К примеру по этому gd32v-lcd адресу, можно склонировать показательный проект по работе с LCD с использованием DMA канала.

В основном файле программы можно выбрать несколько видов тестирования дисплея:

#include "gd32vf103.h"
#include "lcd.h"
#include "led.h"
 
// ------------------------------------------------------------------------
// Framebuffer and other globals.
// ------------------------------------------------------------------------
 
uint16_t g_fb[LCD_FRAMEBUFFER_PIXELS]; // LCD Color: RGB565 (MSB rrrrrggggggbbbbb LSB)
 
uint16_t bgcolxy(int x, int y)
{
    x -= LCD_WIDTH >> 1;
    y -= LCD_HEIGHT >> 1;
    y <<= 1;
    int r = x*x + y*y;
    return r >> 11;
}
 
uint16_t bgcol(int p)
{
    int y = p / LCD_WIDTH;
    int x = p - y * LCD_WIDTH;
    return bgcolxy(x, y);
}
 
#include "amigaball.inl"
#include "starfield.inl"
 
int main(void)
{
    led_init();
    lcd_init();
 
    // Clear the framebuffer.
    for (int i=0; i < LCD_FRAMEBUFFER_PIXELS; i++)
        g_fb[i] = bgcol(i);
 
#if 0
    // Test pattern. Gray except for 1 pixel red border. Useful for detecting
    // timing/logic bugs that may cause the lcd internal pixel address register
    // getting out of sync with SPI upload.
    {
        for (int y=0,i=0; y < 80; y++)
        for (int x=0; x < 160; x++,i++)
        {
            if (x==0 || y==0 || x==159 || y==79)
                g_fb[i] = 0xc000;
            else
                g_fb[i] = 0x4208;
        }
        // Update in an infinite loop.
        for (;;)
            lcd_write_u16(0, 0, LCD_WIDTH, LCD_HEIGHT, g_fb);
    }
 
#elif 1
    // Example with framebuffer upload after each frame completion (Amiga ball).
 
    int px = 0;
    int py = 0;
    int dx = 1 << 8;
    int dy = 1 << 8;
    int ph = 0;
    for(;;)
    {
        // Render into framebuffer.
        uint16_t* pfb = g_fb;
        for (int y=0; y < LCD_HEIGHT; y++)
        for (int x=0; x < LCD_WIDTH; x++)
        {
            int fx = (x << 8) - px;
            int fy = (y << 8) - py;
            int c = amigaBall(fx, fy, ph);
            if (c >= 0)
                *pfb++ = c;
            else
                *pfb++ = bgcolxy(x, y);
        }
 
        // Trigger framebuffer upload. We rely on the upload being faster than
        // our framebuffer writes in the loop above so that we can render the
        // next frame while this one is being uploaded asynchronously in the
        // background.
        lcd_write_u16(0, 0, LCD_WIDTH, LCD_HEIGHT, g_fb);
 
        // Update ball position.
        px += dx; py += dy;
        if (dx > 0) ph += (1 << 8); else ph -= (1 << 8);         // Rotation.
        if (py > (16<<8))    { py = (16<<9) - py;    dy = -dy; } // Floor.
        if (px > (96<<8))    { px = (96<<9) - px;    dx = -dx; } // Right wall.
        if (px < (-64 << 8)) { px = (-64 << 9) - px; dx = -dx; } // Left wall.
        dy += 1 << 4; // Apply gravity.
    }
 
#else
    // Continuous framebuffer upload example (starfield).
 
    // Enable continuous framebuffer update.
    lcd_fb_setaddr(g_fb);
    lcd_fb_enable();
 
    // Initial stars.
    for (int i=0; i < NUM_STARS; i++)
    {
        g_stars[i].x = rnd_u32();
        g_stars[i].y = rnd_u32();
        g_stars[i].z = rnd_u32();
        g_stars[i].p = -1;
    }
 
    // Render star field. Note that we only need to update the framebuffer
    // in memory, and the continuous upload in background makes the changes
    // visible on display.
    for(;;)
    {
        for (int i=0; i < NUM_STARS; i++)
        {
            Star* s = &g_stars[i];
            if (s->p >= 0)
                g_fb[s->p] = bgcol(s->p);
            update_star(s, 10);
            if (s->p >= 0)
            {
                int g = (0x7fff - s->z) >> 9;
                if (g > 31) g = 31;
                int r = g>>1;
                g_fb[s->p] += (r << 11) | (g << 5) | r;
            }
        }
    }
#endif
}

Компилируем проект Ctrl + F5 и загружаем получившийся firmware.bin в нашу плату с помощью GD32 All-In-One Programmer.

На диспллее должен появится легендарный Amiga ball!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *