Содержание

Отчёт о сборке и прошивке STM32F103C8T6

Эта статья даст возможность при желании спаять свой контроллер и полезную обвеску к нему. Будет приведено достаточное число картинок для самостоятельного повторения всех действий.

Почему именно этот контроллер?

Как уже было сказано в одной статье, этот контроллер достаточно дешёвый (130 рублей на январь 2017 года), есть компилятор под него на языке **Oberon-07**, который работает как подсистема в среде BlackBox Component Builder. Контроллер весьма развит, так что это вполне разумный выбор.

Заказ контроллера

Два контроллера были заказаны на одном из интернет-сайтов, оказалось, что исполнитель проживает в городе Уфа. Получены на местном отделении Почты России. Конверт был слегка надорван (видимо ФСБ не спит, либо кто-то не очень чистоплотный), но содержимое оказалось в порядке. Вместе с пересылкой стоимость заказа оказалась около 400 рублей. Оба контроллера были упакованы в индивидуальные антистатические пакеты, всё вместе было в одном пакете с амортизирующими шариками.

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

Сборка контроллера

Для этого нам потребуются:

Также не помешают какие-нибудь газеты на рабочую поверхность, особенно, если это любимый полированный столик мамы/сестры/жены. Не забываем, что паяльник горячий – нужна подставка, которая легко делается из куска медного провода толщиной 2,5…4 мм.

Обратите внимание, что длина контактной гребёнки в разы больше длины платы. Её необходимо монтажным ножом разрезать пополам, если у вас есть какие-либо платки для расширения, либо разъёмы, либо вы можете напаять гибкие проводники сечением 0,22…0,5 мм кв прямо на плату. С монтажным проводом туго, автор статьи обошёлся слаботочным проводом из кабеля `SAS 8 x 0,22`. Но необходимо помнить: перегрев платы чреват выходом из строя контроллера. Кто уже работал с паяльником, также должны помнить о статическом напряжении. Для избежания пробоя необходимо заземлять жало паяльника и тело. Например, на батарею (Если такая батарея не покрашена и надёжно заземлена. В противном случае, может быть даже ухудшение ситуации по сохранности контроллера).

Чем подключить к ПК

Самый оптимальный вариант подключения платы к ПК – через переходник `USB-UART`. Выглядит он так:

Цена его смехотворна: можно найти за 70 рублей (на январь 2017 года)

Автор статьи со скрипом его нашёл в не самом маленьком городе. Причём, продавец по телефону сказала, что такого чуда у них нет. Не верьте продавцам!!!

Существуют и другие варианты с UART, если стандартного нет в наличии 1)

Подключение

Из-за дешевизны контроллера, его начинка упрощена до невозможности. Так, например, контроллер `Arduino` более прост в этом плане. Но и более дорогой (примерно в 4 раза, при гораздо более скромных возможностях).

На конвертере `UART` нам потребуются все сигнальные контакты: Rx (чтение), Tx (передача). Дело также не пойдёт без питания 3.3 Вольта (`3V3`), и «земли» (`GND`). На контроллере часто есть дополнительный контакт 5 Вольт. Не вздумайте его подключить к 3.3 Вольта!!!! Ваш контроллер сразу отправится на небесную лужайку для электроники, которая умерла мученической смертью. По описанию, контроллер `STM32F103C8T6` в качестве питания принимает напряжение от 2.2 до 3.3 Вольта. В ходе многочисленных экспериментов над этим контроллером, автор статьи по невнимательности подал питание через `UART`, и через блок питания от мобильного телефона на разъём `MicroUSB Type A` (на самом микроконтроллере). Результаты такой запарки были катастрофическими: вышли из строя микроконтроллер, `UART`, блок питания мобильного телефона, и есть подозрения, что в ноутбуке тоже не всё в порядке (по крайней мере, пришлось переустанавливать операционную систему).

Подключение со стороны контроллера выглядит несколько сложнее. К моменту подключения все ножки гребёнки уже должны быть распаяны, так как контакты `Tx` и `Rx` у контроллера сидят ножках. Они все подписаны, так что при нормальном зрении – они читаемы легко.

Небольшая табличка, как будет выглядеть подключение:

UART Контроллер
Tx PA10
Rx PA9
3V3 3V3
GND GND

На контроллере, по крайней мере, две точки подключения `3V3` и `GND`. Никакой разницы нет между контактами с одинаковой маркировкой. Тут проблем не будет.

Подготовка инструментов

Разумеется, потребуется BlackBox Component Builder. На этой Вики, в разделе ссылки можно скачать этот пакет. В данном случае был использован пакет для Linux (x64). Он свободно скачивается с сайта http://oberoncore.ru/, раздел «Проекты». Пакет подготовлен Иваном Денисовым 2), потому, как всегда всё работает)). Выбор такого пакета обусловлен тем, что у автора статьи на личном ноуте стоит Linux Mint (x64). Обратите внимание: чтобы под Linux запустился BlackBox – необходимо установить все пакеты, от которых зависит BlackBox. На странице загрузки Иван Денисов представил исчерпывающую информацию, как это сделать. На http://youtube.com/ можно посмотреть дополнительно видео.

Кроме BlackBox потребуется компилятор от Александра Ширяева 3). В этой подсистеме для BlackBox будет несколько папок:

Код программы

А теперь, тот код, который у автора статьи работает:

MODULE MicroSlowLed;
(* Программа имитирует плавное зажигание и плавное затухание.
Для этого постоянно меняется доля свечения и доля затухания.
Кадр зажигания должен быть 1/50 сек -- примерно 16000 тиков.
Кадров в секунду -- примерно 50 
 
^Q O7ARMv7MP.Compile @/s
 
^Q O7ARMv7MLinker.Link STM32F103C8 MicroSlowLed
 
*)
 
IMPORT SYSTEM,
	MCU := MicroSTM32F10xxD,
	PinCfg := MicroSTM32F10xPinCfg;
 
CONST
	sleepTime = 800000; (* примерно 1 сек @ Thumb-16 *)
	timeTick = sleepTime DIV 50 ; (* длительность тика при 50 тиков в секунду *)
	ziklPerSec = (sleepTime DIV timeTick - 15)*2; (* количество тиков за секунду -- примерно 50 *)
	dtPower = timeTick DIV ziklPerSec; (* прибавка времени светимости в одном тике *)
 
 
VAR
	PowerOn, iter:INTEGER;
	ModeOn:BOOLEAN;
 
PROCEDURE PowerUp;
BEGIN
		PowerOn:=PowerOn+dtPower;
		IF PowerOn > timeTick THEN
			PowerOn:=timeTick
		END
END PowerUp;
 
PROCEDURE PowerDown;
BEGIN
	PowerOn:=PowerOn-dtPower;
	IF PowerOn<0 THEN
		PowerOn:=0
	END
END PowerDown;
 
PROCEDURE Sleep (x: INTEGER);
BEGIN 
	REPEAT 
		DEC(x)
	UNTIL x = 0
END Sleep;
 
PROCEDURE SleepOn;
VAR
	sleep:INTEGER;
BEGIN
	sleep:=PowerOn;
	REPEAT 
		DEC(sleep)
	UNTIL sleep = 0
END SleepOn;
 
PROCEDURE SleepOff;
VAR
	sleep:INTEGER;
BEGIN
	sleep:=timeTick - PowerOn;
	REPEAT 
		DEC(sleep)
	UNTIL sleep = 0
END SleepOff;
 
PROCEDURE BlinkTick;
BEGIN
	IF PowerOn > dtPower THEN
		SYSTEM.PUT(MCU.GPIOCBSRR, {13}); (*  On PC13 *)
	END;
	SleepOn;
	IF PowerOn < (timeTick - dtPower) THEN
		SYSTEM.PUT(MCU.GPIOCBSRR, {13 + 16}) (*  Off PC13 *);
	END;
	SleepOff
END BlinkTick;
 
PROCEDURE Blink3;
VAR
	iter:INTEGER;
BEGIN
FOR iter:=1 TO 3 DO
			SYSTEM.PUT(MCU.GPIOCBSRR, {13}); (* !PC13 *);
			Sleep(sleepTime DIV 4);
			SYSTEM.PUT(MCU.GPIOCBSRR, {13 + 16}) (* !~PC13 *);
			Sleep(sleepTime DIV 4)
		END;
END Blink3;
 
PROCEDURE LedUp;
VAR
	iter:INTEGER;
BEGIN
	FOR iter:=1 TO ziklPerSec DO
		PowerUp;
		BlinkTick
	END;
	PowerOn:=timeTick;
	Sleep(sleepTime);
END LedUp;
 
PROCEDURE LedDown;
BEGIN
	FOR iter:=1 TO ziklPerSec DO
		PowerDown;
		BlinkTick
	END;
	PowerOn:=0;
	SYSTEM.PUT(MCU.GPIOCBSRR, {13 + 16}) (* !~PC13 *);
	Sleep(sleepTime);
END LedDown;
 
BEGIN
	PowerOn:=0;
	ModeOn:=TRUE;
	PinCfg.Configure(PinCfg.C, 13, PinCfg.outputPushPull2MHz);
	REPEAT
		Blink3;
		LedUp;
		LedDown
	UNTIL FALSE
END MicroSlowLed.
 
^Q O7ARMv7MP.Compile @/s
 
^Q O7ARMv7MLinker.Link STM32F103C8 MicroSlowLed

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

По сути, код показывает, как можно плавно (ШИМ) и дискретно управлять встроенным светодиодом. Вся программа состоит из мелких процедур, разобрать самостоятельно их совсем не сложно.

Компиляция

Файл модуля должен быть сохранён в папке `Mod` подсистемы `Micro`. Если попытаться стандартным способом скомпилировать эту программу – ничего не выйдет. Это правильно. Так как, это не Компонентный Паскаль!! Это Oberon-O7!!! Хотя, спутать их не составит никакой сложности. Разница между этими двумя языками – в деталях 5).

Если подсистема `O7` установлена верно, то должно появиться соответствующее меню – `O7`. Именно в нём и надо выбрать команду на компиляцию. В нашем случае – это архитектура ARMv7. Либо воспользоваться `коммандером` в комментариях, либо за концом модуля.

И, конечно, полученный бинарник надо скомпоновать с загрузчиком. После этого, бинарный код готов к прошивке на контроллер.

Прошивка контроллера

Для успешной прошивки контроллера необходимо установить программу stm32flash. На контроллере, для успешной прошивки необходимо перемычку boot0 поставить в положение ON6). Это разрешит прошивку контроллера в его системную память. И в завершении всего, необходимо нажать кнопку RESET. Это заставит контроллер войти в режим прошивки и ожидать информацию с порта UART1 (те самые две ножки на боковой гребёнке контроллера).

После этого, из каталога, где лежит готовый файл-прошивка с именем нашего модуля, но расширением *.hex, необходимо выполнить команду:

  stm32flash -w ./SlowLed.hex -v -g 0x0 /dev/ttyUSB0

Обратите внимание, что имя файла указано без названия подсистемы. Утилита stm32flash не понимает таких выкрутасов. Кроме того, устройство `/dev/ttyUSB0` – у читателя может называться по-другому. Чтобы узнать название устройства, необходимо запустить stm32flash без параметров 7).

Если прошивка прошла успешно, утилитка stm32flash выведет сообщение, что прошивка залита на 100%. У автора статьи за примерно 20 попыток прошить – не было ни одного сбоя. Признаком передачи информации будет моргание светодиода на контроллере `UART` (Если, конечно, такой есть. А он обычно есть).

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

Для того, чтобы контроллер работал сразу после подачи питания в автономном режиме, необходимо перемычку `boot0` вернуть в положение `OFF`. В качестве источника питания подойдёт любая зарядка от сотового телефона с выходным током от 250 мА. Если будет необходимость питать дополнительную периферию – не следует стесняться взять блок питания под 1000 мА.

Заключение

Большая часть операций выполняется один раз, привыкание к языку Oberon-O7 происходит быстро. На долю без повторений выпадает, по сути, только написание кода и полезной обвязке 8) Необходимо обратить внимание читателей: использование силовой электроники (от 50 Вольт переменки и выше) опасно для жизни. Поэтому, обязательно – почитайте про правильную работу с высокими напряжениями при завязке на низковольтные контроллеры.

И удачи всем в освоении Oberon-O7! :-)

1)
Здесь другие варианты не рассматриваются, но, возможно, у читающего взлетит вариант с Arduino в качестве UART-контроллера. Статьи на русском ищутся вполне легко
2)
Новосибирск рулит
4)
Тех самых, что стоят в наших мобильных телефонах на базе Android
5)
именно в деталях кроется дьявол
6)
изначально обе перемычки стоят в OFF
7)
если не получится посмотрите видео Ивана Денисова
8)
Схемотехника очень схожа на Arduino , с той лишь разницей, что напряжение 3,3 Вольта вместо 5 Вольт у Arduino . Все схемы адаптируются достаточно легко.