STM32F103C8T6 aka Blue Pill + STM32duino + IAR ARM: быстрый старт

разделы: STM32 , STM32duino , дата: 08 сентября 2017г.

Отладочная плата на микроконтроллере stm32f103c8t6, является одной из самых популярных в любительской среде "электронщиков". Это одна из самых удачных плат в соотношении "цена/функционал", а сам stm32f103xxxx, который выпускается уже 10 лет, является ветераном и первопроходцем микроконтроллеров на ядрах ARM Cortex M3.

    Для быстрого знакомства с платой я предлагаю пройтись по следующим пунктам:
  • Краткий обзор платы;
  • Исправление аппаратного бага с помощью термофена и паяльника;
  • Прошивка загрузчика STM32duino;
  • "Подъем" виртуального COM порта на USB-модуле микроконтроллера stm32f103c8t6 с помощью STM32Cube MX и IAR ARM. Подключение микроконтроллера к планшету на Android.
  • Подключение и написание программы опроса I2C модуля RTC DS3231 с помощью STM32duino.

Вроде не много.

    Краткое описание

  • В отличии от Maple Mini, данная плата имеет штыревой разъем для подключения китайского клона ST-Link. Что на мой взгляд является большим плюсом, т.к. на проверку, загрузчик Leafmaple/STM32duino из-за постоянного переключения между DFU-загрузчиком и виртуальным COM-портом, оказался довольно проблемным.
  • Плата имеет на борту два кварца: на 8 MHz для тактирования HSE и на 32768 Hz для LSE. Для сравнения, на Maple Mini установлен только кварц на 8 MHz.
  • Сам микроконтроллер stm32f103c8t6, несмотря на то что по документации поставляется с флешпамятью на 64KБайта, фактически поставляется с флеш-памятью на 128КБайт(!) Хотя, гарантии на это никто не дает конечно.
  • Также имеется два джампика для прошивки микроконтроллера через USB-TTL конвертер, кнопка сброса Reset, два светодиода: красный для индикации питания и зеленый подключенный к выводу PC13. Причем загорается он при логическом нуле.
  • Цифровые выводы имеют маркировку в соответствии с даташитом, за тем исключением, что из их обозначения отброшена литера "P".
  • Довершает "обвес" микро-USB разъем, который мы сегодня попытаемся задействовать.
  • Сфера применения микроконтроллера, на мой взгляд- это коммутация по USB-интерфейсу с традиционными компьютерами, одноплатными компьютерами, устройствам на Android которые возможно использовать как дисплеи(вторая жизнь для устаревших телефонов и планшетов) и т.д. Также думаю, что будет неплохая связка микроконтроллеров STM32 с SPI-дисплеями.

Полезная информация о плате собрана на страничке проекта STM32duino.

Для начала взглянем на раcпиновку платы:

и принципиальную схему:

На схеме нас будет интересовать резистор R10. На вики STM32duino, относительно этого резистора утверждается следующее:

The USB standard requires a 1.5 kΩ pullup resistor on D+, but this board is known to have a wrong value (R10 on the board). It ships with either a 10 kΩ resistor or a 4.7 kΩ resistor, but it should be replaced with a 1.5 kΩ resistor, or put an appropriate resistor value (e.g 1.8 kΩ) in between PA12 and 3.3V. It is also true that some PCs are tolerant of incorrect value so, before you change the resistance, you can try if it works in your case. 

Т.е. они пишут, что согласно спецификации USB, на линии D+ должен быть установлен резистор номиналом 1.5K в то время как китайцы ставят резисторы на 4.7К или 10К. И далее предлагается поменять его на резистор требуемого номинала. Там даже прилагается фото с результатом переделки:

Еще там сказано, что несмотря на неправильный номинал резистора, USB-хостами наш микроконтроллер все же может восприниматься корректно. Нужно пробовать, но никакой гарантии нет.

На моей версии платы был установлен резистор на 10K:

Протестировав плату на паре стационарных компьютеров и на одном планшете с Android я могу сказать, что плата скорее всего будет работать и без переделки, но возможно будет подглючивать. У меня она не всегда распознавалась в Windows, а в Android не отображалась в списке подключенных устройств, хотя терминальная программа при этом устройство видела и принимала с него данные.

Поэтому, если есть такая возможность, то резистор все же лучше поменять:

Ну и заодно я впаял штыревой разъем, что бы в лишний раз не мараться. Получилось как-то так:

Ок. теперь когда отремонтирован USB, можно начать программировать.

Прошивка и программирование Blue Pill

Подключаем плату к ST-Link и запускаем "STM32 ST-LINK Utility":

Жмем "Connect to the target" и если в графе Device чип определился правильно, значит все Оk, чип живой и готов к работе. Хотя, это конечно следовало проверить ДО того как браться за паяльник ;)

Попробуем прошить Blink через ST-Link из Arduino. Для этого запустим Arduino с установленным паком Arduino_STM32. В меню выбора платы щелкнем по Generic-STM32F103C series

Из примеров загрузим вариант Blink'а для STM32:

В тексте скетча исправим номер пина PB1 на PC13, т.е. на пин с зеленым светодиодом.

В меню выбора программатора выберем ST-Link:

После чего пробуем прошить:

В итоге имеем вес прошивки в 13 КБайт, и успешный лог выполнения. К конце прошивка немного подвисает, на этапе "waiting for tty device", т.е. в ожидании последовательного порта, как будто бы прошивка происходила через USB-загрузчик, но в целом, все ОК.

Установка USB загрузчика STM32duino

Попробуем поставить загрузчик STM32duino для прошивки через USB-кабель. Для этого скачиваем отсюда прошивку с суффиксом PC13(пин со светодиодом):

Далее загружаем скачанную прошивку в микроконтроллер:

Откладываем в сторону ST-Link, и подключаем микроконтроллер к компьютеру через microUSB разъем. Затем снова запускаем Arduino IDE и в опции "Upload Method" указываем "STM32duino bootlooder".

После чего снова пробуем прошить скетч, но уже через USB. Если все сложится удачно, то выйдет такой лог:

Замечу, что прошивалось через Linux версию Arduino IDE.

Здесь есть один нюанс. Джампики на плате должны находиться в положении "ноль". Если они, допустим, будут вообще сняты, то Arduino не сможет перезагрузить микроконтроллер перед прошивкой, и он не сможет войти в режим загрузчика. Так же должно быть понятно, что если теперь прошить микроконтроллер через ST-LINK, то загрузчик затрётся.

Теперь я отложу эту плату в сторону чтобы не затереть загрузчик STM32duino, который еще понадобится, и возьму другую. Попробуем поднять на микроконтроллере Virtual COM Port c помощью STM32Cube MX и IAR ARM.

Прошивка в Virtual COM PORT

Запускаем "куб" и открываем новый проект:

Выбираем смою модель микроконтроллера:

Выставляем тактирование от кварца, и включаем отладку по SWD:

Включаем USB Full-Speed модуль:

Выставляем режим работы USB модуля как Virtual COM Port:

Для индикации рабочего цикла задействуем светодиод на PC13 ножке:

С конфигурацией GPIO покончено, переходим к настройке тактирования. Сразу же откажемся от автоматических настроек:

Настроим тактирование например так:

Осталось дело за малым, задать идентификатор для ножки PC13:

С "кубом" закончили, экспортируем проект в IAR ARM:

Настройка параметров экспорта: имя проекта, среда разработки, рабочие каталоги:

После чего открываем проект в IAR:

В главный цикл добавим следующий код:

    HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);
    HAL_Delay(1000);
    HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);
    HAL_Delay(1000);
    CDC_Transmit_FS("Hello World!\n",13);

В начало main.c нужно еще будет добавить заголовочный файл usbd_cdc_if.h:

Все, можно нажимать на компиляцию и загружать прошивку в микроконтроллер. "Весит" она кстати тоже не мало, десять килобайт. Можно убирать в стол ST-Link, он больше не понадобится. Подключаем микроконтроллер через USB к компьютеру, если речь идет о Linux, то больше ничего делать не надо, драйвер уже имеется в ядре и при подключении выдает такой лог:

[15928.181626] usb 6-3: new full-speed USB device number 124 using ohci-pci
[15928.338706] usb 6-3: New USB device found, idVendor=0483, idProduct=5740
[15928.338717] usb 6-3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[15928.338724] usb 6-3: Product: STM32 Virtual ComPort
[15928.338730] usb 6-3: Manufacturer: STMicroelectronics
[15928.338735] usb 6-3: SerialNumber: 00000000001A
[15928.340836] cdc_acm 6-3:1.0: ttyACM0: USB ACM device

Можно открывать терминальную программку и смотреть на всплывающие строки: "hello world!"

Если же речь идет о Windows, то потребуется еще поставить драйвер com-порта. Для этого зайдем на my.st.com, залогинимся и в строке поиска ведем запрос: "stm32 virtual com port"

В выпадающем списке нам сразу предлагается STSW-ST32102, он то нам и нужен. Скачиваем, распаковываем, находим инсталятор:

Подводный камень кроется в том, что после установки драйвера его еще нужно будет установить ;)

Т.к. у меня виртуальная машина, я пробрасываю в нее свое устройство:

Операционка обнаруживает новое устройство и предлагает установить драйвер:

Нам нужно указать папку в которую распаковались драйвера.

Они должны быть в "Program Files\STMicroelectronics\Virtual comport driver\Win7". Я не знаю, чем руководствовались парни из STM кидая драйвера от WinXP в папку Win7. Если у вас операционка Win7 или Win8, то в соответствующих папках будут находиться инталяторы для этих операционок, их нужно запустить. А делать так как я показываю, не надо. Это только для Win2000/XP/Vista.

Щелкаем на установку драйвера:

В случае успеха, система выдаст соответствующий репорт:

Теперь устройство можно будет найти в диспетчере устройств:

Теперь можно запустить терминальную программку, чтобы посмотреть на выводимые микроконтроллером через USB данные:

Подключение микроконтроллера STM32F103C8T6 к Android-планшету

Микроконтроллер с USB портом можно подключить не только к стационарному компьютеру, но и Ardroid устройству.

На моем планшете с root-доступом, устройство прекрасно видно:

Скачанная наугад программка usb-терминал, сразу нашла устройство:

прием данных:

В принципе, даже не изучая Java и AndroidStudio, используя лишь NDK, можно написать хороший код для сопряжения Android-девайсов и STM32-микроконтроллеров. Это может дать новую жизнь старым смартфонам и планшетам, которые можно использовать для отображения информации или управления чем-то.

Подключение I2C модуля DS3231

Теперь я снова беру плату с прошитым загрузчиком STM32duino, и попробую сделать, как говориться, без лишней пыли, что-то более полезное чем hello_world, а именно подключить RTC DS3231 через интерфейс I2C.

Микроконтроллер stm32f103c8t6 имеет два аппаратных I2C интерфейса. Дефолтовый интерфейс в Medium_Density чипах висит на пинах PB6 и PB7:

Подключаем модуль к микроконтроллеру:

В Arduno IDE копируем этот скетч, компилируем, загружаем, смотрим на результат работы:

По-моему, проще не бывает)

поделиться: