Микроконтроллеры GIGADEVICE. Инструкция по освоению

Статья была опубликована в журнале Компоненты и технологии №7 2017 г.
Хафизов Даян, Смирнов Григорий

На сегодняшний день рынок 32-битных микроконтроллеров на основе ядра Cortex-M3 довольно широк. Популярностью у разработчиков цифровых устройств на основе микроконтроллеров пользуется продукция таких производителей, как Microchip, ST Microelectronics, NXP и т.д. Однако, недавно появился еще один производитель, готовый составить им конкуренцию – GigaDevice со своей линейкой микроконтроллеров GD32. В данной статье будет рассказано о микроконтроллерах GD32, приведено сравнение с ближайшим конкурентом, а также представлены примеры работы с одним из представителей семейства GD32 в популярной IDE Keil MDK-ARM.

Логотип компании GigaDevice
Рисунок 1. Логотип компании GigaDevice

Компания GigaDevice (рис.1) была создана в 2005 году в Пекине и вышла на китайский рынок с микросхемами памяти. В 2008 году GigaDevice начали выпуск микросхем памяти SPI NOR FLASH с напряжением питания 3,3 В по технологии 180 нм. Примечателен тот факт, что это первая полностью самостоятельная разработка в Китае. За последующие 5 лет GigaDevice укрепили свои позиции на рынке микросхем памяти и значительно улучшили технологии производства, быстро осваивая более высокие технологические нормы. Сейчас компания производит SPI NOR FLASH с напряжением питания 1,8 В по технологии 65 нм и занимает третье место в мире по объемам продаж в сегменте микросхем энергонезависимой памяти с объемом производства более 1 млрд микросхем в год. Компания GigaDevice в высокой степени сконцентрирована на инженерной работе, так в компании больше половины состава сотрудников – инженеры. Кроме этого, у компании GigaDevice более 100 патентов и около 500 заявок на патенты.
В 2013 году компания GigaDevice приобрела лицензию на ядро ARM Cortex-M3 и объявила о начале производства собственных 32-битных микроконтроллеров GD32. Внешнее сходство и сходство в наименованиях с микроконтроллерами от ST Microelectronics подталкивает к мысли о полном «копировании», но это не так. Несмотря на идентичность в расположении контактов и схожесть характеристик, отличия между GD32 и STM32 есть:

  • рабочая частота до 108 МГц для семейства GD32F1 (у STM32F1 до 72 МГц),
  • объем FLASH памяти до 3 Мб (у STM32F2 не более 1 Мб),
  • объем оперативной памяти до 256 Кб (у STM32 не более 128 Кб),
  • и проч.
    По сравнению с «одноклассником» STM32F1, микроконтроллеров GD32F1 обладают лучшим набором характеристик. В случае, когда не хватает flash-а для программы или хранения данных, или же не хватает быстродействия, оптимально использовать GD32F1. Также большим плюсом GD32 является более низкая, нежели у конкурентов, цена.

Конечно, микроконтроллеры GD32 не лишены своих слабых мест. Так, например, для начала работы требуется установка специального AddOn для IDE Keil, а объем технической документации на сайте производителя пока что не дотягивает до STM32, но тем не менее это не является серьезным препятствием на пути освоения микроконтроллеров GD32.

Ну что же, плюсы и минусы есть у всех. Проверим работоспособность микроконтроллеров GD32 на реальном железе. Возьмем отладочную плату GD32103E-EVAL (рис. 2) и рассмотрим несколько простых примеров.

Внешний вид отладочной платы GD32103E-EVAL
Рисунок 2. Внешний вид отладочной платы GD32103E-EVAL

Начало начал. Помигаем светодиодами.
Несмотря на то, что микроконтроллеры GD32 и STM32 не являются абсолютно идентичными устройствами, они являются совместимыми как по выводам, так и по карте регистров в рамках одного семейства. Следовательно, микроконтроллер GD32F103ZET6 будет совместим по выводам с STM32F103ZET6. Таким образом, мы можем воспользоваться популярным среди разработчиков генератором исходного кода STM32CubeMX для создания демонстрационного проекта (рис. 3). В данном случае, ключевым отличием GD32F103ZET6 от «собрата» STM32F103ZET6 являются максимальная частоте работы ядра: 108 МГц у GD, против 72 МГц у STM. Также отметим, что микроконтроллеры серии GD32F103 могут иметь до 3 Мб встроенной Flash памяти против 1 Мб у STM32. Это может стать решающим преимуществом GD32F103 перед STM32.

Настройка портов ввода/вывода
Рисунок 3. Окно STM32CubeMX. Настройка портов ввода/вывода

Для начала помигаем светодиодами на отладочной плате. Заведены они контакты PF0-PF3. По рекомендации производителя для тактирования будем использовать внешний кварцевый резонатор на 8 МГц (OSC_IN – 23 контакт, OSC_OUT – 24 контакт). Внутренняя схема тактирования у GD32 отличается от STM32. Во время включения требуется больше времени для стабилизации частоты, поэтому необходимо изменить настройки RCC (рис. 4): задержку ожидания готовности HSE STARTUP TIMEOUT надо приравнять 0xFFFF (у STM32F1xx равен 0x0500).

Настройки RCC для GD32F10x
Рисунок 4. Настройки RCC для GD32F10x

Далее генерируем исходный код для Keil. После установки AddON-ов от GigaDevice в закладке Device появилась возможность выбрать MCU GD32 (рис. 5). В нашем случае выбираем GD32F103ZE.

Конфигурирование Keil для работы с GD32
Рисунок 5. Конфигурирование Keil для работы с GD32

В файле main.c добавляем в цикл:
HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_1);
HAL_Delay(1000);
HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_0);
HAL_Delay(1000);
Затем собираем проект и приступаем к «прошивке» контроллера. На отладочной плате GD32103E-EVAL уже присутствует программатор GD-Link (так же, как и почти на всех отладочных наборах у STM). Так что после установки утилиты от GigaDevice, можем прошивать микроконтроллер и заниматься отладкой программы из Keil. В закладке Debug выбираем CMSIS-DAP Debugger (рис. 6) и в настройках указываем определившийся адаптер (рис. 7). Жмем «OK», прошиваем контроллер, перезапускаем контроллер, наблюдаем за двумя мигающими светодиодами ☺.

Настройка программатора
Рисунок 6. Настройка программатора

Окно выбора режима программатора
Рисунок 7. Окно выбора режима программатора

Итак, пока получается, что мало того, что для работы с GD32 можно использовать программное обеспечение от STM, так еще и библиотека HAL корректно работает.
Работа с UART, АЦП и таймерами.
Светодиодами помигали, теперь сделаем что-то посерьезнее. Будем снимать данные с АЦП и передавать их в UART. И делать это будем через прерывание от таймера.
Сделаем новый проект в STM32CubeMX. UART заведем на контакты PA9 (TX) и PA10 (RX), на PC3 заведем вход АЦП (рис. 8).

Конфигурирование входов-выходов для работы с UART и АЦП
Рисунок 8. Конфигурирование входов-выходов для работы с UART и АЦП

Настроим UART как показано на рис. 9. Для этого перейдем на вкладку Configuration и выберем USART1.

Настройки UART
Рисунок 9. Настройки UART

Также настроим ADC. Большая часть настроек остается по умолчанию.

Настройка АЦП
Рисунок 10. Настройка АЦП

АЦП на входе PC3 подключен к потенциометру на 10 кОм (рис. 11). В новом проекте будем снимать значение напряжения с АЦП. Опрос АЦП будем производить в прерывании от таймера TIM6.

Подключение потенциометра к контакту РС3
Рисунок 11. Подключение потенциометра к контакту РС3
Перейдем на вкладку Clock Configuration. В данном случае воспользуемся настройкой тактирования ядра и периферии, установленными по умолчанию: ядро тактируется частотой 48 МГц, тактирование периферии конфигуратор рассчитает автоматически (рис. 12).

Настройки тактирования
Рисунок 12. Настройки тактирования

Конфигурирование таймера TIM6
Рисунок 13. Конфигурирование таймера TIM6

Таймер TIM6 сконфигурируем так, чтобы прерывание от него срабатывало 1 раз в секунду. Поскольку периферия тактируется с частотой 48 МГц, то для получения периода в 1 секунду значение предделителя приравниваем к 47999, а регистр счетчика – к 999 (рис. 13).
Сгенерируем проект и откроем его в Keil. Все обработчики прерываний находятся в файле stm32f1xx_it.c. Находим обработчик прерывания от таймера TIM6 и вставляем туда функцию отправки данных в UART, как на рис. 14.
HAL_UART_Transmit – функция HAL для отправки данных в UART, сгенерированная STM32CubeMX. Эта и другие функции HAL для UART находятся в файле stm32f1xx_hal_uart.c
transmitBuffer – в данном случае массив, который мы объявили глобально и в который просто записали строчку, которую хотим передавать в UART.

Отправка данных в UART
Рисунок 14. Обработчик прерываний TIM6. Отправка данных в UART.

Для опроса АЦП задействуем таймер TIM3. Опрос АЦП сделаем в обработчике прерывания от таймера TIM3. В обработчике прерывания от таймера TIM3 запускаем АЦП, ждем окончания преобразования, складываем полученное значение отсчетов АЦП в переменную и останавливаем работу АЦП (рис. 15).

Код обработчика прерываний TIM3 для работы АЦП
Рисунок 15. Код обработчика прерываний TIM3 для работы АЦП
Далее, заходим в обработчик прерывания от таймера TIM6, где у уже есть функция отправки данных в UART и добавляем отправку данных от АЦП, пересчитанных в вольты, как на рисунке 16.

Код обработчика прерываний TIM6
Рисунок 16. Код обработчика прерываний TIM6
Подключив UART с микроконтроллера к компьютеру через преобразователь UART-USB, посмотрим на данные через терминал (в данном случае, terminal v1.9b). Изменяя положение регулятора на потенциометре, видим, как меняются измеренные значения с АЦП (рис. 17).

Вывод измеренных значений с АЦП
Рисунок 17. Вывод измеренных значений с АЦП

Заключение

Еще раз отметим, что микроконтроллеры GD32 - это не подделка под STM32 и не безымянный контрафакт, а полноценный микроконтроллер на Cortex-M3, предназначенный для разработки высокопроизводительных и надежных устройств. Совместимость инструментов и библиотек, предназначенных для работы с микроконтроллерами STM32, позволяет довольно легко начать процесс изучения и запустить новые разработки на GD32. Высокая степень «железной» совместимости между соответствующими семействами микроконтроллеров от GigaDevice c микроконтроллерами от ST Microelectronics позволяет создавать более гибкие по функциональности устройства, а так же не сильно зависеть от одного производителя. Необходимо учесть отличия в конфигурации отдельной периферии и тактирования.
В сочетании с бОльшим объемом встроенной flash-памяти и более высокой максимальной частотой микроконтроллеры GD32 открывают для разработчика возможности расширить функционал уже существующих устройств и задуматься об увеличении производительности в новых разработках.

Литература

  1. GD32103E-EVAL User Manual
  2. GD32F103xx DATASHEET Rev. 2.2
  3. UM1718 User manual. STM32CubeMX for STM32 configuration and initialization C code generation. Rev.20
  4. UM1850 User manual. Description of STM32F1xx HAL drivers. Rev.1
  5. User Manual GD-Link Adapter. Rev.1
  6. GD32F103xx – AN001. Software Migration Guide.