Уроки программирования на stm32

Уроки программирования на stm32

Итак, учили мы учили стм8, но останавливаться нельзя, и кто читал блог, наверняка уже видел что была давненько уже приобретена плата STM32F4Discovery с процессором STM32F407VG на борту. Собственно с этой платы я и начну входить мелкими шагами в мир STM32.

Да, многие могут воскликнуть, — ЗАЧЕМ? ведь есть давно вдоль и поперёк изученный Atmel с мегами, ардуины и прочяя атмелятина, а также PIC и т.д.))). Кто то даже отметит что STM32это барахло, а надо идти за дорого брат процессоры от Freescale и им подобным. Но тут никто никого не призывает с чего то спрыгивать, на что то пересаживаться. Мне нравиться продукция STM всеми своими сторонами, и то что она заполонила мир — это её заслуга, как в своё Windows захватил мир компов. Вобщем я тут учу STM32, а кому чего не нравиться, идите жалуйтесь в свой двор)))

Почему СТМ32 а не АтМега 2560 или AtXmega. Начну с того, что для начала советую посмотреть цены. Вот маленький пример для сравнения
СТМ32F030F4P6 -самый малыш в линейке. Корпус TSSOP20, (48 МГц, 16 Кбайт Flash, 4 Кбайта SRAM, 4 таймера 16 бит, 11 каналов 12-битного АЦП, по 1 интерфейсу SPI, I2C и USART). Да конечно, тяжеловато по первой данный корпус поставить на плату, да и расстояние между дорожками 0,25мм тоже может тяжеловато для изготовления, но это всего лишь издержки.
Цена его — 21грн

А теперь давайте попробуем найти ему альтернативу хотя бы по простейшим параметрам типа памяти
Attiny2313 — 36 грн (1кб флэш)
Atmega8 — 27 грн (8кб флэш)
Атмега16 — 52грн (16кб флэш)
STM8S003K3T6 — 21грн (8кб флэш)
ATX меги не пишу так как им цену сложить не могут

Ну а теперь всё это дело нафаршируем 32х битной математикой за один такт и получим то, что уже не остановить — технический прогресс.

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

Итак, что нам вообще нужно для работы с STM32.
Первое — либо купленный процессор, либо как в моём варианте — отладочная плата STM32 Discovery. Я взял одну из старших плат в линейке, чтобы так сказать иметь "топовое" орудие)) Оно нам потом ещё пригодится.

Программатор

Кто взял — Discovery — тому программатор не нужен. Так как в этом случае сама плата помимо отладки ещё и выполняет функцию программатора. Вам потребуется лишь USB->microUSB кабель для работы с отладочной платой.

Для тех у кого нет Discovery — за смешные деньги приобретается вот такой программатор ST-LINK V2 mini

Также, для начала можно вообще обойтись простым загрузчиком на базе UART-преобразователя (FT232RL и ему подобным) и заливать прошивку через UART, через программу ST-LINK Utility

Среда разработки
Тут на выбор несколько вариантов
IAR — давно известный но платный (в бесплатном ограничение по коду)
CooCox + GNU компилятор — бесплатный вариант (один из лучших)
Keil uVision 45 — платный, но возможны варианты))

Также STM сделало не совсем давно супер решение STM32CubeMx — программа для настройки всей периферии в любом контроллере и получении уже готового проекта. единственное что по простому данная программа не может экспортировать проект в CooCox, но это решается небольшими танцами с бубном. НО — РЕШАЕТСЯ.

Это решение стало доступно с момента выпуска библиотеки HAL, которая позволяет нам для любого процессора STM32 с минимальнейшими изменениями писать инициализацию всей нашей периферии, настраивать тактирование и т.д.

Читайте также:  Вытяжка elica hidden ix a 60 отзывы

В своих же уроках я начну с Keil, и если всё таки CooCox понравиться — то буду делать уроки для двух сред.
На этом я думаю вступление можно заканчивать (може чего и добавлю по мелочи). В следующем уроке, Уроке1, мы будем изучать нашу программу STM32CubeMX и создавать первый проект типа Hello World — моргание светодиодами.

В статье я хотел бы описать шаги на пути к написанию прошивки для микроконтроллеров stm32 без использования специальных сред разработки типа keil, eclipse и тому подобных. Я опишу подготовку прошивки с самых основ, начиная с написания загрузчика на ассемблере, скрипта для линкера и заканчивая основной программы на C. В коде на C буду использовать заголовочные файлы из CMSIS. Редактор кода может быть любым на ваш вкус, vim, emacs, блокнот, все что угодно. Для сборки проекта буду использовать утилиту make. Итак, начнем!

Почему так сурово, спросите вы. Во-первых, чтобы что-то хорошо освоить, необходимо начинать с основ. Я не хочу, чтобы мой читатель бездумно щелкал клавишами клавиатуры набирая текст очередной супер-программы для устройства, не понимая, как работает устройство. Stm32 гораздо более сложный микроконтроллер по сравнению, например с atmega8 — atmega328 (микроконтроллером, установленным на самой популярной плате серии arduino). Во-вторых, я люблю сам разбираться в любом деле с нуля, и можно сказать, данная статья — это заметки для меня в будущем, чтобы открыть и вспомнить некоторые нюансы.

Да, я забыл еще сказать, что разработку буду вести под Linux. Подойдет любой дистрибутив, например, у меня это Arch Linux. Для ubuntu процесс установки необходимых утилит я постараюсь описать в следующих частях. Можете попробовать Windows, MacOS, но для этого вам самим придется разобраться, как установить необходимые утилиты для компиляции и прошивки.

Первое, что вам нужно сделать, это приобрести плату для разработки на основе контроллера stm32f103. У меня это blue pill:

Еще одна вещь, необходимая для старта, это программатор st-link:

Плату blue pill и программатор я приобрел на aliexpress, заплатив 200 руб. за все вместе.
Второе, что необходимо сделать, это скачать набор для компиляции кода под arm GNU GCC.

Для arch linux необходимо поставить пакет gcc-arm-none-eabi:

Далее нам понадобится утилита st-link для работы с одноименным программатором st-link2:

Теперь давайте попробуем подключить нашу плату к компьютеру через программатор.

Соединяем программатор с платой blue pill в таком порядке:

  • Подключить к пину GND (ground — земля, пина два, возьмите любой, например, 4-й) на программаторе провод (желательно следовать некоторым стандартам, для земли используйте черный или синий) и подключите к пину на плате подписанному GND;
  • Подключить пин SWCLK (clock — синхронизация) на программаторе к пину SWCLK на плате;
  • Подключить пин SWDIO (IO — ввод/ввод) на прогамматоре к пину SWIO на плате;
  • И наконец, пин 3,3V на программаторе соедините с пином 3,3V на плате.

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

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

Теперь давайте проверим характеристики нашей демо-платы. Для этого в терминале запускаем команду st-info из установленного до этого пакета stlink:

Читайте также:  Как сделать полупроводниковую пластину

На выбор можем посмотреть:

—version — текущая версии утилиты st-info
—flash — выведет информацию о размере flash-памяти программ микроконтроллера, в моем случае это 0x10000 (65536 байт)
—sram — объем статической памяти — 0x5000 (20480 байт)
—descr — описание — F1 Medium-density device
—pagesize — размер страницы памяти — 0x400 (1024 байт)
—hla-serial — "x30x30x30x30x30x30x30x30x30x30x30x31"
—probe — Found 1 stlink programmers
serial: 303030303030303030303031
openocd: "x30x30x30x30x30x30x30x30x30x30x30x31"
flash: 65536 (pagesize: 1024)
sram: 20480
chipid: 0x0410
descr: F1 Medium-density device

Из важного для нас — размер flash-памяти и размер статической памяти, а также стоит запомнить что у нас устройство Medium-density.

Не следует начинать разработку без документации под рукой. Во-первых следует скачать с официального сайта Reference Manual. В нем полное описание всей периферии, регистров периферии микроконтроллера. Во-вторых, скачиваем Programmer Manual по той же ссылке. В нем узнаете о микропроцессоре семейства контроллеров STM32F10xxx/20xxx/21xxx/L1xxxx Cortex-M3, его архитектуре, наборе команд.

Далее разберем, с чего вообще начинается исполнение программы на микроконтроллере.

  1. Наш микроконтроллер stm32f103c8 сразу после включения начинает считывать по адресу 0x08000000 (для удобства чтения я буду делить тетрады пробелом — 0x0800 0000) значение для регистра SP. SP (Stack pointer) — регистр указателя стека (стр. 15 Programmer Manual). Стек начинается с конца доступной RAM-памяти и растет “вверх”;
  2. По адресу 0x0800 0004 считывает значение в регистр PC — Program counter. Это значение — адрес точки входа в нашу основную программу, другими словами по адресу 0x0800 0004 flash должен лежать адрес C — функции main(), определенной нами далее;
  3. Микроконтроллер начинает выполнение программы.

Чтобы вычислить начальное расположение стека (значение для SP регистра), обратимся к мануалу Reference Manual на стр. 65. Там указано, что RAM начинается с адреса 0x2000 0000. Ранее мы определили, что у микроконтроллера объем RAM 20480 байт:

0x2000 0000 + 0x5000 = 0x2000 5000

То есть по адресу 0x0800 0000 мы должны поместить значение 0x2000 5000.
По адресу 0x0800 0004 мы должны положить указатель на начало нашей программы. Каждый указатель имеет размер 4 байта, значит следующий адрес за 0x0800 0004 во flash памяти будет 0x0800 0004 + 4 = 0x0800 0008. Это значение и необходимо поместить по адресу 0x0800 0004.

Так будет выглядеть начальный участок нашей прошивки:

Теперь об одной особенности микроконтроллеров stm32. Дело в том, что формат команд для stm32 должен быть в Thumb представлении вместо стандартного ARM. Это значит, что при указании указателей мы должны прибавлять 1. Запомните это правило.

Хватит теории, пора переходить к практике. Надеюсь, вы еще не спите. Открывайте ваш любимый редактор кода, будем писать начальный файл для запуска нашего контроллера. Мы начнем с startup файла и он будет написан на ассемблере. Это будет единственный раз, когда я заставляю вас писать на скучном ассемблере, зато вы начнете понимать и “чувствовать” устройство изнутри.

Пишем в самом начале:

Это комментарий на языке ассемблера, каждый комментарий начинается с символа @.
Далее указываем директивы ассемблеру

И далее коротенькая bootstrap-программа:

@указатель на вершину стека. Пишем без пробелов!
@.equ директива ассемблера это почти
@тоже что и define в C или на худой конец
@думайте, что это обычное присваивание переменной
.equ StackPointer 0x20005000

@.word — указываем, что здесь машинное слово — 4 байта
@по сути отсюда (0x0800 0000) процессор
@начинает свою работу после включения
.word StackPointer

Читайте также:  Radeon r9 270 температура

@”кладем” указатель на начало основной программы.
@Reset в данном случае — метка, адрес точки входа.
@не забываем о том, что у нас набор команд Thumb,
@поэтому к указателю прибавляем единицу
.word Reset + 1

@метка Reset. Здесь мы встречаем первую, настоящую и
@единственную команду, которая нам понадобится на
@протяжении всего руководства. Это команда B —
@безусловный переход в системе команд ARM,
@аналог JMP в ассемблере для x86, или простыми
@словами goto в языках более высокого уровня.
@Аргумент команды B — это адрес безусловного перехода, в нашем случае мы пока
@указываем метку Reset, тем самым заводим процессор в бесконечный цикл.
Reset: B Reset

Программу целиком вы можете скачать по ссылке https://bit.ly/2rc7bcf
Сохраните ее под названием bootstrap.s.

А теперь давайте скомпилируем и прошьем нашу плату.

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

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

Здесь мы указываем, что хотим прочитать в файл default.bin flash-память начиная с адреса 0x08000000 и размером 0x10000 (64K), то есть всю flash-память.

st-flash — утилита для работы с прошивкой микроконтроллера, полное описание ее читайте в терминале: st-flash —help .

После этого проверим, что прошивка корректно считалась. Загрузим ее вновь, перезаписывая старую.

Что означает записать default.bin в flash память контроллера начиная с адреса 0x08000000.

Выньте и снова вставьте программатор, на плате зеленый диод должен как и раньше мигать.

Теперь давайте скомпилируем нашу самописную прошивку. В терминале в той же директории, что и сохранили запустите:

Здесь мы компилируем наш исходный файл в объектный код. Это еще не готовая прошивка, годная для заливки в микроконтроллер. Нам необходимо еще “указать” куда, по каким адресам размещать нашу программу. Этим занимается компоновщик. Мы воспользуемся самым популярным компоновщиком LD, который входит в поставку пакета arm-none-eabi-gcc. Подробнее о компоновщике и описание скрипта для компоновщика ld я расскажу в следующей части, когда мы перейдем к автоматической сборке нашей супер-простой прошивки. А пока просто скачайте этот маленький файл stm32f103.ld https://bit.ly/2HXIydu, и выполните команду:

Этой командой мы компонуем наш объектный файл с помощью скрипта stm32f103.ld, на выходе получаем elf файл.

Чтобы окончательно подготовить исполнимый elf файл к прошиванию, выполним последнюю команду:

Здесь мы преобразуем elf файл в чистый бинарный формат, пригодный для заливки в нашу плату.

Итак, наша первая программа для контроллера stm32 готова! Прошиваем!

Поздравляю! Теперь микроконтроллер обречен на вечное выполнение безусловного перехода. До следующей встречи!

Вы можете помочь и перевести немного средств на развитие сайта

Изучение STM32 на основе STM32F4. Системный таймер SysTick STM32F4. Рассмотрим работу системного таймера STM32.

Update № 1. Это небольшое дополнение к Уроку № 0. Вводному. В данной статье опишится менее затратный способ по портированию проекта из STM32CubeMX в SW4STM32.

Продолжаем изучение STM32 на основе STM32F4. Изучаем работу с портом. Мигаем светодиодом.

Переходим к изучению МК — STM32F4. Система тактирования.

Учимся программировать STM32F4. С чего все начиналось лично для меня?

Приветствую Вас на моем канале, посвященному разработке прикладного программного обеспечению для программируемых логических контроллеров и панелей оператора.

В прошлом обзоре мы создали проект в ТИА портал версии 15.1, а также рассмотрели документацию на основе которой будет вестись разработка прикладного программного обеспечения для контроллера.

Ссылка на основную публикацию
Удаление последнего элемента списка
Введение. Основные операции О дносвязный список – структура данных, в которой каждый элемент (узел) хранит информацию, а также ссылку на...
Телефон самсунг с хорошей камерой недорогой
Если вы ищете лучший телефон Samsung, тогда рейтинг поможет разобраться в их различиях. Посмотрите какой смартфон лучшие купить из всех...
Телефон перестал заряжаться быстрой зарядкой
Наверняка многие сталкивались с тем, что смартфон ни с того ни с сего перестаёт заряжаться. Другая распространённая беда — слишком...
Удаление дубликатов фотографий на русском бесплатно
Здравствуйте Уважаемый Друг. У каждого из нас на компьютере хранится большое количество различных фотографий изображений и тому подобных картинок. Парой...
Adblock detector