Начинаем изучать микроконтроллеры на примере stm32f030f4p6
Содержание
- 1 2.3 Считывание прошивки с платы
- 2 Libraries Included Here:
- 3 Высокопроизводительные микроконтроллеры STM32F030x на основе 32-битного ядра ARM Cortex-M0 RISC-архитектуры
- 4 Programming?
- 5 STM32F1 boards
- 6 Programming Manual
- 7 3.1 Каркас исходников
- 8 Acknowledgement:
- 9 2.2 Настройка утилиты
- 10 3.2 Алгоритм на пальцах
2.3 Считывание прошивки с платы
При самом первом моём подключении платы я решил сохранить исходную прошивку, этакий бэкап — сделаем это и сейчас. Нужно будет указать, куда сохранять эту прошивку и какие страницы памяти сохранять, также на выбор предлагается использовать hex, bin или s19 формат файла.
Если только заливать на плату или считывать с платы прошивку, то разницы между этими форматами файлов никакой нет. Далее следует страница прогресса, на которой у меня иногда надолго подвисает процесс на 99% (не обязательно именно 99), но спустя несколько секунд якобы успешно завершается — на самом деле после этого плата не выдавала то поведение, которое соответствовало бы загружаемой прошивке. Проще говоря, надо всё переподключить и заново залить прошивку, ничего критичного в этом нету.
Файл прошивки сохранился, и в будущем его можно заливать на плату.
Однако, если установлена защита от чтения, считать прошивку не получится.
Libraries Included Here:
The F030F4 has only 16K of flash. Compiling the arduino IDE with an empty sketch will use about 8K.
However, including calls in your sketch to arduino’s regular Serial will also add many K to the build size, abruptly passing the 16k limit. One Serial.println(int) and you’ve used 15.5k! Yes, that one-liner just works — on PA2/PA3, note this, not PA9/PA10 — but your sketch now has no code space left.
And the Wire pin assignments conflict with the uart header use, as built.
The most obvious implication is that we now have no easy way to «view» any output, even any debug information,
beyond toggling a LED! (No serial terminal. It’s not connected at USB connector.
And the native Serial software is too big.)
There are some new very lightweight arduino libraries included here, so that we now can communicate
with the F030F4. We can run a «Serial» on its uart header, we can run an oled display, and we can use Wire/I2C on pins of our choice. These libraries (with example files) are:
-
miniSerial — a simple software non-interrupt low-performance duplex serial driver, max 19200.
So now a terminal can be used with your sketch. TXD/RXD ie PA9/PA10, ie at the correct uart header,
but is also pin configurable if needed.
Syntax is an approximate subset of regular native Serial.
Some miniSerial info: https://github.com/BLavery/miniSerial -
miniOled — a lean and basic driver for the ubiquitous ‘0.96″ I2C SSD1306 Oled’ display.
Optionally using I2C writes via SoftWire (allowing pin choice), or native HAL I2C on PA9 PA10.
So now we can see some display output.
Derived out of Daniel Turton’s OzOled project 2014/2015.
To use the optional software I2C, you need to also fetch and install other-party libraries SoftWire and AsyncDelay.
Some miniOled info: https://github.com/BLavery/miniOled
Quality = working, if not elegant.
Code size = comfortable in our tiny flash space.
The library code is intentionally minimal — just enough to get the job done, of being able to «talk»
to this board, leaving code space still available for a modest sketch.
Other Libraries, needed for miniOled to run on pins other than PA9 PA10:
- AsyncDelay (used by SoftWire) from here: https://github.com/stevemarple/AsyncDelay
(And incidentally, SoftWire should be equally useable with other I2C libraries or devices on the ‘030F4P6.
For example, there is an instruction note in libraries folder on adapting alternative ACROBOTIC oled library for SoftWire.)
Высокопроизводительные микроконтроллеры STM32F030x на основе 32-битного ядра ARM Cortex-M0 RISC-архитектуры
Микроконтроллеры серии STM32F030x компании STMicro интегрируют 32-битный ARM-процессор Cortex-M0 с рабочей частотой до 48 МГц, высокоскоростную память (до 64 Кбайт FLASH и до 8 Кбайт SRAM), функциональный блок периферийных модулей и линий ввода/вывода. Все устройства серии поддерживают стандартный набор коммуникационных интерфейсов (до двух каналов I2C, до двух каналов SPI и до двух UART), один 12-битный АЦП, до шести 16-битных таймеров общего назначения и ШИМ-таймер с расширенными возможностями управления. Микроконтроллеры рассчитаны на работу в диапазоне температур окружающей среды от -40°C до +85°C при напряжении питания от 2.4 В до 3.6 В. Несколько энергосберегающих режимов позволяют создавать приложения с малым энергопотреблением.
Микроконтроллеры STM32F030x доступны в четырех различных корпусах с числом выводов от 20 (TSSOP) до 64 (LQFP) и в зависимости от модели оснащены различными периферийными модулями.
Внутренняя архитектура микроконтроллеров STM32F030x |
Отличительные особенности:
- 32-битное ядро ARM Cortex-M0 с тактовой частотой до 48 МГц
- FLASH память программ от 16 кБ до 64 кБ
- SRAM память данных от 4 кБ до 8 кБ с контролем чётности
- Блок вычисления кодов коррекции ошибок CRC
- Системы сброса и управления питанием
- Диапазон напряжений питания: от 2.4 В до 3.6 В
- Сброс при включении/выключении питания (POR/PDR)
- Режимы энергосбережения: спящий, останов, ждущий
- Управление частотой тактирования
- Кварцевый генератор с тактовой частотой от 4 МГц до 32 МГц
- Отдельный генератор с тактовой частотой 32 кГц для часов реального времени с калибровкой
- Внутренний RC-генератор с тактовой частотой 8 МГц и шестью узлами фазовой автоподстройки частоты
- Внутренний RC-генератор с тактовой частотой 40 кГц
- До 55 высокоскоростных линий ввода/вывода
- Карта векторов внешних прерываний
- До 36 линий ввода/вывода, поддерживающих уровень напряжения 5 В
- 5-канальный контроллер прямого доступа к памяти (DMA)
- 12-битный АЦП с временем выборки 1 мкс (до 16 каналов) и диапазоном входных напряжений от 0 до 3.6 В
- Отдельный источник питания для аналоговой части с напряжением от 2.4 В до 3.6 В
- До 10 таймеров
- 16-битный 7-канальный таймер с расширенным управлением для 6 выходных каналов ШИМ, формированием паузы и экстренной остановки
- 16-битный таймер с 4 каналами захвата/сравнения входа/выхода (IC/OC) для декодирования команд с инфракрасного датчика
- 16-битный таймер с 2 каналами IC/OC, 1 каналом OCN, формированием паузы и экстренной остановки
- Два 16-битных таймера, каждый с 1 каналом IC/OC и OCN, формированием паузы, экстренной остановки и модулятором для инфракрасного передатчика
- 16-битный таймер с 1 каналом IC/OC
- 16-битный основной таймер
- Независимый и системный сторожевые таймеры
- Таймер тактирования SysTick: 24-битный счётчик обратного счёта
- Календарь/часы реального времени с системой сигнализации и периодического пробуждения из режимов ждущий/останов
- Коммуникационные интерфейсы
- До двух интерфейсов I2C: один с поддержкой режима Fast Mode Plus (1 Мбит/с) и допустимым током 20 мА
- До двух портов приёмопередатчика USART с поддержкой синхронного SPI в режиме ведущего и управлением модемом; один из портов с автоматическим определением скорости потока
- До двух интерфейсов SPI со скоростью передачи данных 18 Мбит/с и программируемым размером кадра от 4 до 16 бит
- Последовательный отладочный интерфейс (SWD)
- Доступные корпуса
- 20-выводной SSOP
- 32-выводной LQFP, размером 7 х 7 мм
- 48-выводной LQFP, размером 7 х 7 мм
- 64-выводной LQFP, размером 10 х 10 мм
Область применения:
- Портативное оборудование
- Аудио-видео ресиверы и цифровые телевизоры
- Периферийный устройства ПК, игровые платформы
- Двухколёсные транспортные средства с электроприводом
- Бытовая техника
- Принтеры
- Сканеры
- Системы сигнализации
- Устройства видеоконференцсвязи
- Системы климат-контроля
Programming?
The USB micro connector is for 5V power only, not USB data. (The chip does not support USB!)
The easiest practical programming method is Upload Method = «STLink».
Get one ($3). (On Windows, fetch STSW_Link009 from STM for the STlink driver. Otherwise, check elsewhere if you need any further config/setup help.)
Get it running for your scenario, and programming becomes trivially easy thereafter. Simply leave the BOOT0 jumper always on the GND side.
No flash bootloader is used or needed. (And that’s a whole other hassle out of the way!)
And get a 3V TTL USB serial adapter (CP2102 and CH340 are 3V) while you are at it ($1.5). You are going to need that for «terminal», at least.
But, alternative to STLink, you can use the (ROM-based and undestroyable) factory flashing function using PA9/PA10 (ie TX/RX) and the serial adapter (TX-to-RX and RX-to-TX remember). Upload Method = «Serial». Press reset with boot0 jumper to 3V, upload with IDE, restart with boot0 to GND, and your sketch should run.
STM32F1 boards
Baite Maple Mini Clone
STM32F103C8T6
Black Board
STM32F103C8T6
Black Pill
STM32F103C8T6
Blue Header
STM32F103C8T6
Blue Pill
STM32F103C8T6
Green board
STM32F103C8T6
Maple Mini Clone
STM32F103C8T6
Purple pill
STM32F103C8T6
RobotDyn Black Pill
STM32F103C8T6
STM32 Smart V2.0
STM32F103C8T6
STM32FxCxT6 Board V5.02
STM32F103C8T6
Strange Thing
STM32F103C8T6
Ugly Board
STM32F103C8T6
Generic Board
STM32F103RBT6
STM32F103RxT6 DEMO
STM32F103RBT6
vcc-gnd.com STM32F103RBT6
STM32F103RBT6
Euse Board
STM32F103RCT6
FK103M2 V1.0
STM32F103RCT6
Generic Board
STM32F103RCT6
iShare
STM32F103RCT6
STM32 Mini V2.0
STM32F103RCT6
STM32F103RCT6 V1.0
STM32F103RCT6
Generic Board
STM32F103RET6
CJMCU-3206
STM32F103T8U6
vcc-gnd.com STM32F103VCT6
STM32F103VCT6
vcc-gnd.com STM32F103VCT6 mini
STM32F103VCT6
CZ miniSTM32F103VE-EK
Black Board
STM32F103ZET6
CZ miniSTM32F103ZE-EK
STM32F103ZET6
Euse M3 DEMO
STM32F103ZET6
F103ZE board
STM32F103ZET6
LC Technology STM32F103ZET6
STM32F103ZET6
Mini STM32 V2
STM32F103ZET6
vcc-gnd.com STM32F103ZET6
STM32F103ZET6
STM32F103Zx最小系统 (minimal system)
STM32F103ZET6
总线通信开发板 (Bus Communication Development Board)
STM32F105RCT6
最小系统 (Minimal System) Board
STM32F105RCT6
中景园 (Zhongjingyuan) Board
STM32F107RCT6
Programming Manual
Programming Manual не является документом первой необходимости в самом начале знакомства с STM-ми, однако является очень важным при углубленном изучении этих микроконтроллеров. Он содержит информацию о процессорном ядре, системе команд и периферии ядра. Причем это не та же самая периферия, которая описана в Reference manual-е. В нее входят:
- System timer — системный таймер
- Nested vectored interrupt controller — контроллер приоритетных прерываний
- System control block
- Memory protection unit
Как только мы начнем знакомится с прерываниями в STM32, нам понадобится раздел 4.3 Nested vectored interrupt controller (NVIC). Ну и системный таймер является очень прикольной вещью, который будет полезен в каких-нибудь RTOS или для создания программных таймеров.
3.1 Каркас исходников
Итак, проект создан, чип выбран, теперь добавим в проект минимальный набор исходников, без которых он вообще не сможет жить.
Выделим CMSIS BOOT и среда автоматически выделит M0 Cmsis Core, т.к. зависимости требуют этого.
Соберём проект (значок Build, или клавиша F7). По непонятным мне причинам hex файл не собрался (в консоли есть предупреждение); я несколько раз переустанавливал IDE и компилятор, заново создавал проект, но на виртуальной машине почему-то такой результат; на другом компьютере (не виртуальном, а реальном) всё один-в-один и на выходе рабочий hex. К счастью, есть bin.
Хоть код и ничего не делает, я заливаю его на плату, дабы убедиться, что залить можно (что, например, утилита его не отбраковывает). Советую сделать это и читателю. Если не получается — попробовать ещё и ещё раз, а также писать комментарии.
Acknowledgement:
The above code for IDE support is now (12 Nov) the same as this (Adminius) version:
https://github.com/stm32duino/Arduino_Core_STM32/tree/master/variants/DEMO_F030F4
(IE, Earlier version that was here has now been brought into line with forthcoming V1.5.) A couple of pin numberings have changed.
The Installation parts 1 and 2 above will become obsolete/unnecessary here when 1.5 is released.
But the library files here (Installation part 3 above) will remain working and valid.
The intention of this project here has been to get something up and running ASAP on this limited-capacity board. The board has been available «out there» now for a while. There will doubtless be in due course more elegant solutions to its limitations than the «mini» libraries above.
But on second thought … If it offends you to use simple workarounds for this chip’s limited flash space, if you really need something that can load libraries and fit in more than some simple GPIO I/O, then spend another $1 and buy one of the various STM32F103C8T6 / bluepill boards with 4 times the flash.
Related:
For my notes on the ‘F103 «BluePill», see https://github.com/BLavery/STM32F103-Arduino
For my notes on the 1024k STM32F407VG, see https://github.com/BLavery/STM32F407VG-Arduino
For my notes on the SAMD21-M0-Mini, see https://github.com/BLavery/SAMD21-M0-Mini
For my notes on using STM32 boards with ST Cube and direct C++ coding, see https://github.com/BLavery/STM32-Cube-TrueStudio
2.2 Настройка утилиты
Запустим это приложение, оно на самом деле наипростейшее (содержит минимум настроек). На первом окне выбираем:
интерфейс (у меня это COM-3);
скорость, с которой будет общаться компьютер и микроконтроллер (имхо, 9600 нормальное значение);
количество бит данных (у меня это окно почему-то недоступно, но пока это не важно);
чётность (у меня без чётности, т.е. None);
echo (у меня ВЫКЛ);
время ожидания (у меня 10 секунд).. Жмём Next, и если всё в порядке, то увидим зелёный свет и «Target is readable»; если видим красный свет, то компьютер не смог подключиться
Жмём Next, и если всё в порядке, то увидим зелёный свет и «Target is readable»; если видим красный свет, то компьютер не смог подключиться.
Порядок шагов, которые помогают всегда:
Во-первых, нужно проверить не замкнута ли перемычка BOOT на плате.
Во-вторых, в любом случае, отключить питание микроконтроллера и желательно линии TX и RX, идущие от переходника на плату (землю можно не отключать).
В-третьих, в программе прожать Back до конца, т.е. до первой странички, или же вообще закрыть её и запустить заново (вообще говоря, она иногда подвисает)
Важно перед каждым подключением к плате через эту программу всегда начинать с первой страницы.
В-четвёртых, подцепить обратно провода от переходника к плате и снова попытаться подключиться в программе (обязательно с первой странички!).
Если ничего не помогло, можно попробовать отключить всё, перезагрузить комп, и попробовать заново подключиться к плате.
Т.к. я работаю через виртуальную машину, приходится по несколько раз переподключать переходник USB-COM, чтобы он был обнаружен виртуальной машиной, а хост-машина не успела установить нерабочие драйвера.
Другой вариант, который я обнаружил рабочим во время написания этой статьи — это нажатие кнопки на плате вместо постоянного дёргания проводов. Однако замыкать и размыкать перемычку BOOT придётся в любом случае. Работает этот вариант, потому что кнопка подведена к ноге внешнего сброса NRST.
На следующем окне нужно выбрать целевое устройство Target. Кстати говоря, иногда здесь можно увидеть (возможно, это баг) вообще левое устройство, например вместо STM32 увидеть STM8 — где-то произошёл какой-то сбой, порядок лечения описан выше
Поэтому на этом шаге нельзя спешить жать Next, а всегда обращать внимание на то, что в Target выбрано нужное устройство
Как определить, какое у нас устройство? — смотрим на чип и переписываем себе всё, что на нём написано. Открываем Datasheet на наш чип, в разделе Ordering information описано, какая буква за что отвечает. В моём случае это:
Предлагается на выбор 4 действия с чипом:
- стереть память (всю или выбрать конкретную область);
- записать прошивку на устройство;
- считать прошивку с устройства;
- включить/отключить защиту от записи или чтения.
3.2 Алгоритм на пальцах
Для начала набросаем алгоритм, как с точки зрения человека микроконтроллер будет мигать светодиодом. А для этого немного рассуждений.
Каждая техника работает за счёт запасённой энергии, например некоторые двигатели могут работать на разных видах топлива, но для этого двигатель нужно скорректировать под вид топлива, которым мы собираемся его кормить. Аналогично и микроконтроллер требуется скорректировать (настроить) под источник энергии — это будет первый блок алгоритма.
Рассуждаем далее. У настольного компьютера есть монитор, колонки, клавиатура, мышь… и можно заметить, что некоторые устройства предоставляют нам информацию, а с помощью других мы предоставляем информацию компьютеру, но все они подключены к общей для всех них коробке (системному блоку). Можно догадаться, что и микроконтроллер может получать и отдавать информацию, а это значит, что его ножки могут принимать сигнал или выдавать сигнал — это будет следующий блок алгоритма.
Далее микроконтроллер должен включать светодиод, ждать какое-то время, выключать светодиод, ждать какое-то время и заново включать-ждать-выключать…
В итоге алгоритм будет выглядеть примерно так
Назначение данной блок-схемы — наглядно показать, что делает алгоритм; в первую очередь схема пишется для себя, поэтому каждый волен писатьрисовать её как хочет (для себя). Я считаю, что схема должна преследовать цель быть максимально простой, удобочитаемой и наглядной, иметь высокий уровень абстракции.
В соответствии с этим алгоритмом будем писать код.