Блог

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

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

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

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

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

pic1

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

pic2

Также нам понадобятся 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:

pic3

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

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

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

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

C++ Code:
  1. #include "gd32vf103.h"
  2. #include "lcd.h"
  3. #include "led.h"
  4.  
  5. // ------------------------------------------------------------------------
  6. // Framebuffer and other globals.
  7. // ------------------------------------------------------------------------
  8.  
  9. uint16_t g_fb[LCD_FRAMEBUFFER_PIXELS]; // LCD Color: RGB565 (MSB rrrrrggggggbbbbb LSB)
  10.  
  11. uint16_t bgcolxy(int x, int y)
  12. {
  13. x -= LCD_WIDTH >> 1;
  14. y -= LCD_HEIGHT >> 1;
  15. y <<= 1;
  16. int r = x*x + y*y;
  17. return r >> 11;
  18. }
  19.  
  20. uint16_t bgcol(int p)
  21. {
  22. int y = p / LCD_WIDTH;
  23. int x = p - y * LCD_WIDTH;
  24. return bgcolxy(x, y);
  25. }
  26.  
  27. #include "amigaball.inl"
  28. #include "starfield.inl"
  29.  
  30. int main(void)
  31. {
  32. led_init();
  33. lcd_init();
  34.  
  35. // Clear the framebuffer.
  36. for (int i=0; i < LCD_FRAMEBUFFER_PIXELS; i++)
  37. g_fb[i] = bgcol(i);
  38.  
  39. #if 0
  40. // Test pattern. Gray except for 1 pixel red border. Useful for detecting
  41. // timing/logic bugs that may cause the lcd internal pixel address register
  42. // getting out of sync with SPI upload.
  43. {
  44. for (int y=0,i=0; y < 80; y++)
  45. for (int x=0; x < 160; x++,i++)
  46. {
  47. if (x==0 || y==0 || x==159 || y==79)
  48. g_fb[i] = 0xc000;
  49. else
  50. g_fb[i] = 0x4208;
  51. }
  52. // Update in an infinite loop.
  53. for (;;)
  54. lcd_write_u16(0, 0, LCD_WIDTH, LCD_HEIGHT, g_fb);
  55. }
  56.  
  57. #elif 1
  58. // Example with framebuffer upload after each frame completion (Amiga ball).
  59.  
  60. int px = 0;
  61. int py = 0;
  62. int dx = 1 << 8;
  63. int dy = 1 << 8;
  64. int ph = 0;
  65. for(;;)
  66. {
  67. // Render into framebuffer.
  68. uint16_t* pfb = g_fb;
  69. for (int y=0; y < LCD_HEIGHT; y++)
  70. for (int x=0; x < LCD_WIDTH; x++)
  71. {
  72. int fx = (x << 8) - px;
  73. int fy = (y << 8) - py;
  74. int c = amigaBall(fx, fy, ph);
  75. if (c >= 0)
  76. *pfb++ = c;
  77. else
  78. *pfb++ = bgcolxy(x, y);
  79. }
  80.  
  81. // Trigger framebuffer upload. We rely on the upload being faster than
  82. // our framebuffer writes in the loop above so that we can render the
  83. // next frame while this one is being uploaded asynchronously in the
  84. // background.
  85. lcd_write_u16(0, 0, LCD_WIDTH, LCD_HEIGHT, g_fb);
  86.  
  87. // Update ball position.
  88. px += dx; py += dy;
  89. if (dx > 0) ph += (1 << 8); else ph -= (1 << 8); // Rotation.
  90. if (py > (16<<8)) { py = (16<<9) - py; dy = -dy; } // Floor.
  91. if (px > (96<<8)) { px = (96<<9) - px; dx = -dx; } // Right wall.
  92. if (px < (-64 << 8)) { px = (-64 << 9) - px; dx = -dx; } // Left wall.
  93. dy += 1 << 4; // Apply gravity.
  94. }
  95.  
  96. #else
  97. // Continuous framebuffer upload example (starfield).
  98.  
  99. // Enable continuous framebuffer update.
  100. lcd_fb_setaddr(g_fb);
  101. lcd_fb_enable();
  102.  
  103. // Initial stars.
  104. for (int i=0; i < NUM_STARS; i++)
  105. {
  106. g_stars[i].x = rnd_u32();
  107. g_stars[i].y = rnd_u32();
  108. g_stars[i].z = rnd_u32();
  109. g_stars[i].p = -1;
  110. }
  111.  
  112. // Render star field. Note that we only need to update the framebuffer
  113. // in memory, and the continuous upload in background makes the changes
  114. // visible on display.
  115. for(;;)
  116. {
  117. for (int i=0; i < NUM_STARS; i++)
  118. {
  119. Star* s = &g_stars[i];
  120. if (s->p >= 0)
  121. g_fb[s->p] = bgcol(s->p);
  122. update_star(s, 10);
  123. if (s->p >= 0)
  124. {
  125. int g = (0x7fff - s->z) >> 9;
  126. if (g > 31) g = 31;
  127. int r = g>>1;
  128. g_fb[s->p] += (r << 11) | (g << 5) | r;
  129. }
  130. }
  131. }
  132. #endif
  133. }

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

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