Доброго времени суток! Не так давно я опубликовал небольшую статью на основе своего онлайн-урока для студентов 2020 года, по работе с GD32F103TB. Статья была выложена в ВКонтакте и как оказалось, была многим полезна. По этой причин я решил выложить её здесь с дополнительными комментариями, а так же продолжить цикл статей по данным контроллерам.


Для работы с данными контроллерами была выбрана IDE Keil uVision. Данная среда мне не очень нравиться, но с ней будет меньше всего проблем с настройкой (см. под спойлер), что будет крайне важно для старта.

Возможные проблемы с настройкой среды

Изготовитель GigaDevices выложил не полный комплект Firmware (на момент написания статьи 29.12.2023), в котором отсутствуют скрипты линковки (ld-файлы). В целом, если Вы опытный разработчик, то большой проблемы это не вызовет, но если мы говорим о начале работы, то это проблема.

Если Вы не страшитесь написания ld-скрипта, то советую использовать Eclipse for Embedded Developer

Следующим шагом, перед тем как начать, необходимо обзавестить SWD программатором. Для GD32 есть фирменные программаторы GD-Link, отлично работающие с фирменным софтом GD-Link Programmer. Классно? Да! Однако программатор GD стоит от 2 тыс. руб. и в продаже почти не найти. По этой причине нам прекрасно подойдёт любой ST-link V2, цена которого варьируется от 200 до 5000 рублей, с софтом ST-Link Utility. Почему? А вот тут кроется интересная особенность контроллеров GD32F - они являются скопированными совместимыми с STM32F. Речь не только о корпусе, а о самой периферии. С большой вероятностью код написанный для STM32F103C8T6 будет корректно работать на GD32F103C8T6.

Ключевые различия между GD32F и STM32F

Главные различия контроллеров заключаются в размере памяти и максимальной частоте работы ядра. Так же важным моментом является особенность подключения внутренней Flash памяти. Насколько я верно понял документацию, она подключена через внутренний QSPI, что как по мне не однозначное решение

И так, мы определились с средой разработки и обзавелись необходимым программатором. Теперь необходимо загрузить всё программное обеспечение. Сделать это можно с официальных сайтов. Учитывайте, что Вас попросят заполнить информацию о себе. Не указывайте страну - Россия. При такой конфигурации Вам не дадут ничего загрузить)

Теперь запустим Keil. При первом включении Вы должны увидеть окно Pack Installer. Если по какой-то причине Вы его закрыли, открыть его можно через панель инструментов

Рис. 1. Расположение Pack Installer на панели инструментов
Рис. 1. Расположение Pack Installer на панели инструментов

В открытом окне Pack Installer необходимо найти наш контроллер. В рамках серии статей использоваться будет GD32F103TBU6 (последние 2 символа не важны при установке пакетов). В левом меню необходимо найти нужный контроллер (можно воспользоваться поисковой строкой).

Рис. 2. Выбор нужного пакета для контроллера
Рис. 2. Выбор нужного пакета для контроллера

Выбрав нужный контроллер (на скриншоте они подсвечены зелёным, но до установки они будут серыми) перенесите взгляд в правую часть окна. В нём необходимо найти раздел Device Specific. В данном разделе содержатся пакеты с описанием периферии и подготовленной библиотекой StdPeriph. Жмём установить.

Рис. 3. Выбор необходимого пакета для работы StdPeriph
Рис. 3. Выбор необходимого пакета для работы StdPeriph

Отлично. Мы закончили настройку IDE - быстро, удобно и просто. Теперь можно закрывать Pack Installer и приступать к созданию проекта.

Рис. 4. Создание нового проекта
Рис. 4. Создание нового проекта

В верхней панели выбираем раздел Project → New uVision Project. После этого перед Вам появится окно выбора цели проекта - выбор микроконтроллера из установленных пакетов. Выбираем тот что потребуется нам

Рис. 5. Выбор нужного контроллера
Рис. 5. Выбор нужного контроллера

Нажимаем ОК и переходим к настройке проекта. На данном этапе важно настроить только основные элементы, недостающие элементы всегда можно подключить по ходу разработки. Важно подключить следующие модули:

  • CMSIS - Core (основа всех библиотек)

  • Device - GD32F10x_libopt, Startup (файл первоначальной настройки и общий заголовочный файл для удобства работы с StdPeriph)

  • Device - GD32F10x_StdPeripherials - MISC, PMU, RCU (основные модули работы с микроконтроллером)

  • И дополнительно модуль работы с GPIO (так как мы хотим всё протестировать работу устройства) Device - GD32F10x_StdPeripherials - GPIO

Рис. 6. Выбор необходимых модулей периферии
Рис. 6. Выбор необходимых модулей периферии

Далее можно нажать кнопку ОК и приступить к работе с кодом. Наконец-то!

По умолчанию Keil создаёт пустой проект, так что нужно добавить новый исходник (*.с файл).

Рис. 7. Добавление нового файла к проекту
Рис. 7. Добавление нового файла к проекту

Для файла в котором храниться точка входа (main() функция) я обычно выбираю логичное имя - main.c

Теперь запишем стартовый код и разберёмся как он работает.

#include <gd32f10x_libopt.h>

int main(void)
{
  SystemInit();
  rcu_periph_clock_enable(RCU_GPIOA);
  gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_2MHZ, GPIO_PIN_10);

  gpio_bit_write(GPIOA, GPIO_PIN_10, 1);
  while(1)
  {

  }
}

Как ранее было описано, Вы добавили модуль GD32F10x_libopt. Этот модуль очень простой, всё что он делает, так это создаёт файл gd32f10x_libopt.h. Там наверное куча готового кода?) Нет. В нём находятся все необходимые include для работы с StdPeriph, не более. Мелочь, а приятно.

Далее у нас вызывается функция настройки системы тактирования - SystemInit(). Она входит в модуль RCU. По умолчанию контроллер запускается от внешнего источника на 8 МГц и при помощи PLL повышает частоту ядра до 108 МГц. Не смотря на низкую точность внутреннего RC источника и сильную зависимость от температуры, в рамках данного урока его будет достаточно. Для быстрой настройки в файле system_gd32f10x.c есть набор define'ов. Закомментируем 59-ую строчку и раскомментируем строку 49.

Рис. 8. Переключение источника тактирования
Рис. 8. Переключение источника тактирования

Далее по коду происходит включение тактирования периферии. Опять же при помощи готовых функций и макросов StdPeriph.

gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_2MHZ, GPIO_PIN_10);
gpio_bit_write(GPIOA, GPIO_PIN_10, 1);

А на этом моменте можно немного остановиться. Сейчас мы его разберём, что бы в дальнейшем не останавливаться. Функция gpio_init(), как ни странно, инициализирует порты GPIO.

  1. GPIOA - адрес порта (или имя, если так удобно)

  2. GPIO_MODE_OUT_PP - режим работы. Посмотреть весь перечень режимов можно в Reference Manual или в файле gd32f10x_gpio.h

  3. GPIO_OSPEED_2MHZ - скорость работы. Все варианты описаны там же где и режим работы

  4. GPIO_PIN_10 - номер пина в порту (можно указать несколько через побитовые ИЛИ).

Для записи значений в порт используется gpio_bit_write(). Аргументы думаю наглядны и не нуждаются в описании)

Теперь можно переходить к компиляции и прошивке. Необходимо скомпилировать программу и залить её на контроллер. Первым делом открываем настройки проекта: Project → Option for target 'Target 1'. Переходим во вкладку Output и ставим галочку «Crate HEX File»

Рис. 9. Настройки выходных файлов
Рис. 9. Настройки выходных файлов

Нажимаем кнопку ОК. Теперь пора запустить компиляцию и прошить контроллер. Компиляцию можно вызвать клавишей F7 или в меню Project → Build Target. По итогу, если всё успешно в нижней части экрана мы увидим сообщение о успехе

Рис. 10. Вывод терминала
Рис. 10. Вывод терминала

Теперь запускаем ST-Link Utility, подключаем программатор к вашему контроллеру/отладочной плате и нажимаем на кнопку Connect (вилка) либо Target → Connect. Далее вы увидите прошивку контроллера в HEX формате и сообщение о успешном подключении (не обращайте внимания, STM32 и GD32 идентичны и ST-Link думает что это родные STM32).

Рис. 11. Страшные цифры внутри контроллера
Рис. 11. Страшные цифры внутри контроллера

Далее открываем свой файл прошивки File → Open (он лежит в папке проекта →Objects) и выбираем Target → Program & Verify …
Жмём Start…

Несколько секунд и … Готов! Он светится!

Рис. 12. It's a LIGHT
Рис. 12. It's a LIGHT

Это обрезанный скриншот с учёбной трансляции. На фото, слева, находится STM32 Nucleo. Её я использую только как программатор. Сама же "отладка" с GD32 почти вне кадра.

Надеюсь я смог достаточно хорошо объяснить самый первый шаг работы, а именно настройка среды работы. В дальнейшем будут выходить новые статьи. Буду рад обратной связи. Всем спасибо!

Комментарии (23)


  1. Kudriavyi
    29.12.2023 22:33

    Я тут ковыряя ch32 обнаружил, что их китайская версия клипса под названием MounRiver Studio работает с gd32 (они есть в списке МК для выбора, можно создать пустой проект и подключить в него сдк). Однако я ещё не пробовал в эту сторону идти, gd32f303 программирую в кейле. И ещё один забавный факт: я купил демо плату с gd32e230, там есть программатор, но работает он только с данной серией МК. Так что демо плата как программатор не прокатит


    1. MrJones Автор
      29.12.2023 22:33

      MounRiver Studio работает с gd32 (они есть в списке МК для выбора, можно создать пустой проект и подключить в него сдк)

      Все верно, но насколько я понял, там именно поддержка GD32V, это контроллеры на основе ядра RISC-V.

      я купил демо плату с gd32e230, там есть программатор, но работает он только с данной серией МК. Так что демо плата как программатор не прокатит

      Можете сказать название или дать ссылку на эту отладку? Было бы интересно изучить, а может и улучшить))


      1. Kudriavyi
        29.12.2023 22:33
        +1

        Ссылка на отладку

        Смотри, что есть на AliExpress! Доска для обучения начального уровня, GD32E230F-START за 3 245 ₽
        https://sl.aliexpress.ru/p?key=Q6UwO0W

        Но не рекомендую. За эти деньги можно купить там же китайский j-link, штук пять микроконтроллеров и сделать макет. Так как на отладке даже потребление не измерить.

        По поводу MounRiver - доберусть до компьютера, соберу мигалку светодиодом и отпишу


  1. OldFashionedEngineer
    29.12.2023 22:33
    +3

    Попадалась статья, где этот контроллер "вскрывали". Как я понял, там память стоит вторым ярусом на отдельном кристале. У gd32 с stm условно совместимая программная модель, а так по всей видимости китайцы его сами синтезировали.


    1. MrJones Автор
      29.12.2023 22:33

      Как я понял, там память стоит вторым ярусом на отдельном кристале

      Да, и как раз подключена через QSPI. Думаю сделать отдельный эксперимент по работе Flash у GD32 и STM32


      1. DrGluck07
        29.12.2023 22:33

        Насколько я понял, флеш подключен через QSPI и кешируется куда-то в RAM. Поэтому у них в даташите отдельно указан размер Code Area и плюс есть Data Area. Первая кешируется через RAM, вторая нет.


  1. milssky
    29.12.2023 22:33

    Для меня самым главным отличием gd32 от stm32 было энергопотребление и максимальный ток одного вывода. Разница прям ощутимо чувствовалась.

    Ну и код, написанный и скомпилированный под стмку в stm32 отлично завелся на gd32 вообще без правок ( ничего сложного правда в нем не было: usb, adc, dma да пяток таймеров).


  1. longtolik
    29.12.2023 22:33

    В прошлом году сделал проект для GD32 в EmBitz IDE. Всё работает: и отладка через ST-Link, и регистры можно смотреть, и т.д. И в ОЗУ, и во Flash пишется прямо из IDE.

    На процессор есть Errata - некоторые задержки надо править после Cube.

    Еще штука - там написано, что ножка, настроенная на вход, имеет напряжение 2.6 Вольта. Вот мы с схемотехником спорили. Он доказывал, что я ее на выход настроил. Пока не показал ему под нос место в документе...


  1. kt368
    29.12.2023 22:33
    -1

    А почему, собственно, STM32 не использовать? Ковид же кончился, производство ST возобновилось.

    Ах да, России же мало чего буржуйского купить можно...

    Хм, может нужно в корень проблемы посмотреть?


    1. MrJones Автор
      29.12.2023 22:33

      Хм, может нужно в корень проблемы посмотреть?

      Рассматривался вариант использования микроконтроллеров от Миландр. Однако теперь их купить крайне сложно и стоят они слишком дорого.

      Сейчас вот ждём выхода на продажу физическим лицам МК АМУР32 на RISC-V от Микрон


      1. OldFashionedEngineer
        29.12.2023 22:33
        +1

        Года три ждём, когда можно будет купить отечественные мк. Их то и до ковида не просто было достать.


        1. strvv
          29.12.2023 22:33

          идёт только заводам, да и то там постоянно срывы поставок по срокам происходят. проще с нииэт штучные процессоры согласовать ;)


    1. mlnw
      29.12.2023 22:33

      Если заказывать у китайцев платы, они вам на нее любой STM поставят.


    1. DrGluck07
      29.12.2023 22:33

      Ежели речь про госзаказовские проекты, то это будет лотерея. Заказчик может не разрешить STM32 (а ведь проект уже готов), а через неделю разрешить, а через три недели запретить, а через два месяца разрешить... И вот так уже полтора года. Кстати, с GD32, GE32, SOMETHING32 ровно всё то же самое. В один день они требуют срочно пересадить всех на условные Миландр, потом осознают, что Миландра нет, разрешают юзать китайцев, потом запрещают китайцев, но некоторым разрешают аж STM32, потом по кругу.


    1. Coppermine
      29.12.2023 22:33

      А в чём был смысл этого, простите за мой французский, высера? Предлагаете автору идти свергать правительство?


      1. kt368
        29.12.2023 22:33
        +2

        Нет, что вы, зачем же вы совершаете такое жёсткое мыслепреступление!

        Просто часто на хабре я вижу серьезные инженерные статьи и в которых авторы и комментаторы лезут далеко в глубь проблемы (про те же обходы блокировок), переворачивают горы, делают реально сложные научные изыскания, но корень то проблемы не в этом. Как инженеру это все очень интересно читать, но как члену общества на это смотреть очень жалко, неприятно что ли. Что делать - не знаю. Но не делать ничего однозначно нельзя!


        1. ducemollari
          29.12.2023 22:33

          Попустило?


  1. Gorthauer87
    29.12.2023 22:33
    +1

    Щупал вот версию GD32V под RISC-V, как по мне, она более интересная, так как на более открытой и современной процессорной архитектуре. В этом смысле ещё esp32s3 прикольный.

    Но опять же, в моем случае это было просто на поиграться, но штуки типа таймеров, dma, spi, wifi, работали более менее хорошо.


    1. MrJones Автор
      29.12.2023 22:33

      Щупал вот версию GD32V под RISC-V, как по мне, она более интересная, так как на более открытой и современной процессорной архитектуре.

      Вы совершенно правы. Ко мне скоро приедет этот контроллер, как разберусь с ним тоже выпущу статью.

      Однако цель именно данной публикации в знакомстве с GD32F, так как они сейчас сильно дешевле и в целом являются хорошей альтернативой STM32


  1. DrGluck07
    29.12.2023 22:33
    +2

    В некоторых библиотеках для GD32 есть странные дефайны "bool Bool", или типа того, которые ломают сборку. Приходится править это прямо в библиотеке.

    Ещё у Gigadevice есть серии контроллеров, проекты под которые у нас вообще не собирались в Кейле, вот прямо совсем. Причём, условно говоря, GD32E103C8 собирается, а GD32E103RB нет. Модели взял просто для примера, у нас с E103 всё хорошо.

    Какой-то из контроллеров не заводился на максимальной заявленной частоте 120 МГц, только на 72 МГц. В библиотеке была ошибка в настройке RCU.

    Короче, косяки у них есть, не без этого. Но другие нам показались ещё хуже, например Geehy.

    p.s. В последний день перед НГ поигрался с отладочной платой F450 и воспроизвёл старинный эффект шариков из Shock Megademo со Спектрума. При этом на какое-то время сломал мозг более младшим программистам. Было интересно наблюдать, как они пытались понять в чём загадка.


    1. MrJones Автор
      29.12.2023 22:33
      +2

      В некоторых библиотеках для GD32 есть странные дефайны "bool Bool", или типа того, которые ломают сборку. Приходится править это прямо в библиотеке.

      Увы, у наш Китайских коллег куча проблем с этим) Не только по этой, но и из-за неё в частности, было принято решение о написании ряда подобных статей. Контроллеры хорошие, но есть проблемы при работе с ними (особенно у новичков).

      p.s. В последний день перед НГ поигрался с отладочной платой F450 и воспроизвёл старинный эффект шариков из Shock Megademo со Спектрума. При этом на какое-то время сломал мозг более младшим программистам. Было интересно наблюдать, как они пытались понять в чём загадка.

      Красивое :-)


  1. BARSRAB
    29.12.2023 22:33
    +1

    А вот чем "подготовка среды" под китайца отличается от тех же stm32? И зачем вообще использовать Keil, когда есть Visual Studio?


    1. MrJones Автор
      29.12.2023 22:33

      Приятно увидеть хорошее замечание. В целом серьезных отличий мало. В основном проблема в малом количестве уроков по этим контроллерам, а при работе с ними есть специфика (опять же проблема с документацией и библиотеками).

      Касательно Visual studio. Эта среда под embedded мне не очень нравится, возможно дело привычки. Всегда использовал Eclipse CDT for Embedded (важный момент для меня это кросс-платформ)