Как скачать программу с микроконтроллера arm

от admin

Русские Блоги

Навыки использования Jlink для чтения программы внутри STM32

предисловие

В предыдущей статье серии Jlink рассказывалось, как использовать J-Flash для загрузки файлов Hex или Bin в микроконтроллер, для конкретной ссылки.Советы по использованию Jlink для загрузки файла HEX в MCU отдельно, В этой статье рассказывается, как использовать JFlash для чтения программ на однокристальном компьютере и обучения чтению файлов однокристальных программ, не для взлома программ других людей, а для изучения принципа взлома, чтобы лучше защитить свои программы от взлома. Надежда Каждый может также уважать работу других.

JFlash скачать и установить

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

  • JFlash в основном используется для загрузки и чтения программ.
  • JFlashLite, Мини-версия JFlash
  • JFlashSPI используется для загрузки программ в память SPI, например W25Q128.
  • JLinkGDBServer, отладчик для стороннего программного обеспечения, такого как Eclipse, для построения среды разработки STM32, вы должны использовать GDB Server для отладки.
  • JLink Command, окно командных операций, ввод команд для выполнения подключения, удаления, загрузки, запуска и других операций.

Подготовка программного обеспечения

  • Программное обеспечение Jlink, J-Flash
  • Jlink отладчик, такой как Jlink V9
  • Плата разработки микроконтроллера, такая как STM32F103RET6

1. Откройте JFlash

 JFlash

2. Создать новый проект

Нажмите Файл-> Новый проект

3. Выберите модель чипа

Здесь поддерживается множество основных чипов ARM Cortex. Выберите модель чипа, соответствующую MCU. Я выбрал серию STM32F103RE.

4. Подключите чип

Если выбран режим SWD, подключите три провода SWDIO, SWCLK и GND. После завершения соединения нажмите Target-> Connect. Если соединение успешно, оно будет успешно отображено в окне LOG ниже.

5. Прочитайте программу в микроконтроллере

Дело наступает! Выберите Target-> Manual Programming -> Read Back, есть три варианта для чтения разных диапазонов адресов Flash.

  • Selected sectors

Выбранные сектора можно просмотреть в параметре конфигурации проекта Параметры проекта-> Flash, чтобы увидеть, какие сектора выбраны.

  • Entire chip

Вся область Flash, обычно выбирайте эту опцию, чтобы прочитать программу всей области Flash

  • Range

Вручную укажите диапазон адресов флэш-памяти для чтения.

Здесь мы можем выбрать весь чип, прочитать всю область Flash, диапазон адресов: 0x8000000

Через несколько секунд вы увидите нижнее окно с информацией об успешном чтении.

6. Сохраните прочитанную программу

Выберите Файл-> Сохранить файл данных или Сохранить файл данных как. Тип сохранения выбирается в соответствии с вашими потребностями. Рекомендуется выбрать шестнадцатеричный формат, который уже содержит информацию об адресе.

7. Проверка процедур.

Как убедиться в правильности прочитанной программы? Это очень просто, просто заново запишите его и посмотрите, является ли бегущий феномен тем же, что и исходный.

Конкретные методы работы см. В предыдущей статье серии Jlink:Советы по использованию Jlink для загрузки файла HEX в MCU отдельно

подводить итоги

Поскольку читать программу однокристального микрокомпьютера так просто, как защитить нашу собственную программу? Очевидно, что мы можем установить функцию защиты от чтения Flash, то есть функцию «шифрования», которую все говорят, которая может предотвратить незаконный доступ к Flash. Здесь шифрование предназначено для всей области Flash. Если установлена ​​функция защиты от чтения, программа может только Обычно загружается и запускается из ОЗУ, но не может быть прочитан через отладчик, тогда другие не могут взломать. Ха-ха!

Как этого добиться?

Вот несколько библиотечных функций для операций защиты Flash:

Эта функция находится в библиотеке прошивки stm32f10x_flash.h. Чтобы использовать эту функцию, сначала добавьте этот файл библиотеки.

Установить защиту от чтения:

  • После активации защиты от чтения программа не может быть прочитана или записана, например, с помощью JLink для чтения программы или повторной загрузки программы.
  • Поэтому перед загрузкой программы необходимо отключить защиту от чтения с помощью внутреннего вызова программы. После отключения защиты от чтения флэш-память будет автоматически очищена.
  • Кроме того, после первого вызова функции Set_Protect () для запуска защиты от чтения вы не можете снова вызвать функцию Off_Protect (), чтобы отключить защиту от чтения. Необходимо отключить питание, чтобы отключить защиту от чтения.

Отключите защиту от чтения. Когда последовательный порт получает некоторые действительные данные или нажимает клавишу, он вызывается для отключения защиты от чтения:

Программа может быть реализована так:

Ссылка для скачивания программного обеспечения JLink_Windows_V614b:JLink_Windows_V614b.exe

Избранные статьи истории:

Приветствую внимание всехМой личный блог

Или отсканируйте код на WeChat, чтобы подписаться на мой публичный аккаунт

Для начинающих. С чего начать на ARM. – Часть 1

Быстрый старт для тех, кто хочет изучить 32 битные ARM микроконтроллеры. В статье подробно описываю установку среды программирования, прошивку платы, компилирование операционной системы и обращаю ваше внимание на такие детали, которые по моему значительные для начинающих.
В первую часть курса изучаем минимальный мултимедийнный компютер с операционной системой. На его основе в далнейшем соберём совершенный медиа плеер (часть 2).

Оглавление:
1, Блок-схема „минимального“ компютера и его функции
2, Основные части
3, Схема, демоплата, документация, программный пакет и всё необходимое
4, Установка среды программирования, запуск тестового образца программы для проверки работоспособности системы
5, Первая программа
6, Примеры, использование ADC, карта памяти, буззер и т.д.
7, Какую операционную систему реального времени выбираем и почему
8, Операционная система BeRTOS, Установка среды программирования, запуск демонстрационного примера программы

1, Блок-схема „минимального“ компютера и его функции
«Минималный» компютер с цветным дисплеем покажет картину, текст, выполнит вычисления и будет иметь графическое меню.
Такой компютер будет иметь три основные детали: цветной экран, микроконтроллер, клавиатура и конечно всё что нужно для их работы(осциллятор, блок питания и т.д.). Блок-схема правда сложнейшая :] и выглядит вот так.

2, Основные части
Микроконтроллер ATSAM3N4C компании Atmel.
Микроконтроллер имеет ядро ARM Cortex M3. Изучение серии M позволит гораздо легче освоить более сложные микроконтроллеры и микропроцессоры ARM.
Несложный и еффективный в использовании.
Эта модель имеет самую болшую программную память изо всех ATSAM3N-ов.
TFT цветной дисплей с SPI интерфейсом.
Результат будет более очевидным, если начать обучение с дисплея а не аудио-прибора и именно с SPI интерфейсным дисплеем потому что это простейсшиий способ вывода информации на экран. Нет необходимости в самом начале изучать принципы работы дисплеев с более сложными интерфейсами.
Клавятура, 2 кнопки любого типа

  • SAM3N-EK демоплата (на нём уже вмонтирован программатор).
  • Схема демоплаты (определим какие детали расположены на плате)
  • Программный пакет

SAM3N-EK демоплату покупаем здесь.
Схему демоплаты скачиваем от сюда.
Программный пакет скачиваем одним файлом от сюда, архив содержит все четыре файла.

4, Установка среды программирования, запуск тестового образца программы для проверки работоспособности системы

Установливаем программный пакет (Работаем на 32 битном Windows XP SP3 или SP2, в других версиях могут возникнуть проблемы).

Установливаем arm-2010q1-188-arm-none-eabi.exe. При установке ничего не меняем и выбираем Typical. После загрузки появится такое окно:

Установливаем make-3.81.exe. При установке и на этот раз ничего не меняем. Появится такое окно:

Открываем Start>>Control Panel>>System>>Advanced>>Environment Variables, выбираем PATH затем Edit

В конце строки добавим: ;C:\Program Files\GnuWin32\bin дальше OK>>OK>>OK

Установливаем sam-ba_2.10.exe. При установке ничего не меняем. При окончании компютер перезагрузится.

Установливаем SAM3N-EK_project.exe При установке ничего не меняем.

открываем C:\ATSAM\SAM3N-EK_project\examples\spi_lcd\build\gcc и запускаем build.bat.
Открывается чёрное окно и через некоторое время выглядит вот так:

И так мы закомпилировали программный код в папке C:\ATSAM\SAM3N-EK_project\examples\spi_lcd по меикфайлу C:\ATSAM\SAM3N-EK_project\examples\spi_lcd\build\gcc\Makefile. Файлы main.c, spim_master_wrapper.c, image.h и библииотеки. В папке C:\ATSAM\SAM3N-EK_project\examples\spi_lcd\build\gcc\bin был создан файл spi_lcd_sam3n_ek_sam3n4-flash.bin. Эта бинарная программа, которую прошьём в микроконтроллер с помощью COM порта.

Прошиваем.


При первом запуске на дисплее появляется Qtouch демо записанная пройзводителем. Зелённый круг двигается на экране по движению пальца.

Для прошивки сначала надо стереть то что записано. Отключаем и соединяем джампер JP3, опять включаем (на этот раз на экране ничего нет) ожидаем 10 секунд. Затем выключаем и открываем джампер JP3. Программа пройзводителя стёрлась.

Присоединяем плату COM портом к компютеру и подключаем блок питания. Открываем Start>>All Programs>>ATMEL Corporation>> SAM-BA v2.10>> SAM-BA v2.10. Выбираем COM порт, которым подключена плата и at91sam3n4-ek, затем Connect.

Из выпадающего списка выбираем Enable Flash access, затем Execute вот так:

Затем выбираем файл spi_lcd_sam3n_ek_sam3n4-flash.bin и Send File

Когда процесс записи закончится, на вопрос выбираем No.

Из списка (Enable Flash access) выбираем Boot from Flash (GPNVM1) и Execute, затем выбираем Link>> Disconnect

Нажимаем на кнопку рестарта на плате в правом верхнем углу, программа запустится и на дисплее появится изображение.

И так мы установили все нужные программы, компилировали (запуском build.bat) и прошили программу в микроконтроллере на плате с помощю SAM-BA.

  • main.c главный файл программы
  • image.h картина, (лого ATMEL)
  • spim_master_wrapper.c драйвер SPI, чтобы простые команды SPI были доступны, например SPIM_Initialize(SPI);

#include «board.h»
void main ()
<
LED_Configure( 0 );
LED_Set( 0 );
>

Теперь надо удалить из меикфайла (C:\ATSAM\SAM3N-EK_project\examples\spi_lcd\build\gcc) информацию о файлах image.h и spim_master_wrapper.c. Готовый меикфайл скачиваем от сюда.

Запускаем C:\ATSAM\SAM3N-EK_project\examples\spi_lcd\build\gcc\build.bat.
Компилированный файл C:\ATSAM\SAM3N-EK_project\examples\spi_lcd\build\gcc\bin\getting_started_sam3n_ek_sam3n4-flash.bin прошиваем на плате.

После нажатия на кнопку рестарта должен загареть один светодиод.
Поясняем программу:

/* Указываем на файл board.h, чтобы использовать команды из библиотеки */
#include «board.h»

  • Примеры кода ( встроенные устройства SAM3N4C, интерфейсы и использование компонентов расположенных на плате).
  • Библиотеки
  • Документация
  • Порт операционной системы FreeRTOS на SAM3N4C

7, Какую операционную систему реального времени выбираем и почему
Сравнительно полный список RTOS-ов (Операционных Систем Реального Времени) можно посмотреть здесь. Операционная система подходящая нашей цели, должа удовлетворять следующие требования:

1. Должна быть на открытых исходниках
2. Должна иметь многозадачный кернел со всеми необходимыми функциами
3. Низкое требование к ресурсам
4. Должна иметь систему графического интерфейса
5. Должна иметь файловую систему

Линуксоиды, даже самый маленький uClinux, довольно сложные для Cortex M3 и трудно освоить новичкам. Поэтому их исключаем.
Среди RTOS–ов, которые занимают несколько килобайтов на ROM и RAM по моему самый простой, надёжный и высокопроизводительный FreeRTOS. Но и FreeRTOS и вообще RTOS-ы этой категории имеют только кернел и больше ничего. Такие требования удовлетворяют только комерческие RTOS–ы и BeRTOS (http://www.bertos.org/). BeRTOS имеет поддержку файлсистемы FAT, один из самых стабильных и совершенных кернел, совершенный менеджмент дисплеев (манипуляция с текстурами, система окон, меню, рендер текстов, диаграмм и геометрических фигур). Вдобавок имеет упощённый SPI драивер, готовые модули различных алгоритмов, готовые комуникационные протоколы и распространяется на откритых исходниках.

8, Операционная система BeRTOS, Установка среды программирования, запуск демонстрационного примера программы
Из официалного сайта http://www.bertos.org/ или по прямой ссылке скачиваем демо версию SDK. Это гарантированный результат и вероятность допущения ошибок незначительна, во второй части объясню установку компилятора и мастера конфигурации на Eclipse.
Запускаем принятый файл и следуем за скрины:

Когда установка закончится, запускаем BeRTOS Wizard

Присвоем проекту имя, например namehere.

Выбираем версию:

Выбираем плату:

Выбираем демопроэкт:

Выбираем тулчайн:



После завершения запускается CodeLite IDE

Нажимаем на клавишу F7 и проэкт компилируется. Компилированный файл находится в папке C:\Documents and Settings\Administrator\My Documents\namehere\images\namehere.bin Прошиваем его на плате с помощью SAM-BA.
Плата запустит проэкт вот так:

Как скачать программу с микроконтроллера arm

Данная статья является первой в планируемом цикле статей по изучению программирования микроконтроллеров. Изучая различные материалы я отметил, что практически все они начинаются с того, что новичку предлагается скачать (или использовать идущую со средой разработки) библиотеку для работы с периферийными устройствами и использовать ее для написания своей первой программы (обычно мигание светодиодом).

Меня это сильно удивило. Если верить данным статьям, для программирования не обязательно даже читать документацию к программируемому контроллеру. Меня же учили премудростям «железного программирования» совершенно иначе.

В этой статье, путь от фразы «Да, я хочу попробовать!» до радостного подмигивания светодиода, будет значительно длиннее чем у других авторов. Я постараюсь раскрыть аспекты программирования микроконтроллеров, которые прячутся за использованием библиотечных функций и готовых примеров.

Если вы намерены серьезно изучать программирование микроконтроллеров данная статья для вас. Возможно, она может заинтересовать и тех, кто вдоволь наигрался с Arduino и хочет получить в свои руки все аппаратные возможности железа.

Многие могут сказать, что начинать изучение микроконтроллеров лучше с AVR, PIC, 8051 или чего-то еще. Вопрос многогранный и спорный. Я знаю достаточно примеров, когда люди изучив Cortex-M, программировали AVR, ARM7 и т.д. Сам же я начинал с Cortex-M3. Если перед вами стоит определенная задача, в интернете достаточно много информации со сравнением различных типов микроконтроллеров и решаемых с их помощью задач. На хабре этот вопрос тоже поднимался, например тут .

Будем считать, что с типом микроконтроллера мы разобрались. Но на рынке представлен огромнейший спектр различных модификаций от разных производителей. Они отличаются по множеству параметров — от размера флеш памяти до количества аналоговых входов. Для каждой задачи выбор стоит производить индивидуально. Ни каких общих рекомендаций тут нет и быть не может. Отмечу лишь, что стоит начинать изучение с МК производителей имеющих как можно больший ассортимент. Тогда, при выборе МК для определенной задачи достаточно велик шанс, что из представленного ассортимента вам что-нибудь да подойдет.

Я остановил свой выбор на STM32 (хотя и считаю, что лучше начинать изучение с МК от TexasInstruments — очень грамотно составлена документация), потому что они широко распространены среди российских разработчиков электроники. При возникновении проблем и вопросов вы сможете без труда найти решения на форумах. Еще одним плюсом является богатый выбор демонстрационных плат как от производителя, так и от сторонних организаций.

Что необходимо для изучения?

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

Сам я использую демонстрационную плату STM3220G-EVAL и программатор J-Link PRO . Но для начала, будет вполне достаточно STM32F4DISCOVERY , которую можно купить без особых проблем за небольшую сумму.

Все примеры будут именно для отладочной платы STM32F4DISCOVERY . На данном этапе нам будет совершенно не важно, что этой плате стоит МК на базе ядра Cortex-M4. В ближайшее время мы не будем использовать его особенности и преимущества над Cortex-M3. А как там будет дальше — посмотрим.

Если у вас есть в наличии любая другая плата на базе STM32F2xx/STM32F4xx, вы сможете работать с ней. В изложении материала я постараюсь максимально подробно описывать почему мы делаем именно так, а не иначе. Надеюсь ни у кого не возникнет проблем с переносом примеров на другое железо.

Как уже неоднократно упоминалось, для ARM микроконтроллеров существует достаточное количество сред разработки, как платных так и не очень. И снова хочется опустить полемику по этому поводу. Я использую IAR Embedded Workbench for ARM 6.60 . Все примеры будут именно в этой среде. Если вам по душе (или в вашей организации используется) что-то другое (Keil, Eclipse, CCS, CooCoc и т.д.) то это вам тоже не очень помешает. На особенности, связанные именно со средой разработки, я буду обращать отдельное внимание.

Почему платная среда разработки?

Возможно, кто-то будет не совсем доволен тем, что я предлагаю использовать платную среду разработки, но в IAR есть возможность получить временную лицензию без ограничения функционала, либо безлимитную лицензию с ограничением по размеру кода (32КБ для МК это очень много).

Помимо этого, сразу замечу, что для некоторых МК не существует бесплатных сред разработки. И к сожалению эти МК в некоторых областях незаменимы.

Процесс установки я описывать не буду.

Для начала создадим пустой проект. IAR позволяет создать проекты на ASM, C и C++. Мы будем использовать чистый C. Перед нами появится пустой проект с main файлом.

Теперь необходимо настроить проект для начала работы с «нашим» МК и отладчиком. На плате STM32F4DISCOVERY установлен MK STM32F407VG . Его необходимо выбрать в свойствах проекта (General Options->Target->Device):

При выборе целевого программируемого процессора происходит загрузка его описания, что дает широкие возможности для отладки (об этом будет идти речь ниже). Кроме того, автоматически присоединяется конфигурационный файл с описанием доступного адресного пространства для линкера. Если будет необходимо, мы затронем тему конфигурационного файла линкера в следующих статьях.

После этого необходимо настроить отладчик. Отладка программы происходит непосредственно «в железе». Производится это с помощью JTAG отладчика. Более подробнее ознакомиться с тем, как это происходит можно на Википедии . На плату STM32F4DISCOVERY интегрирован отладчик ST-LINK/V2. Для работы с отладчиком необходимо выбрать его драйвер в меню Debugger->Setup->Driver . Так же необходимо указать, что отладка должна производиться непосредственно в железе. Для этого необходимо поставить флаг Debugger->Download->Use flash loader(s)

Теперь проект готов для работы (программирования, заливки и отладки).

Для тех, кто увидел слово Simulator:

Теоретически, IAR позволяет отлаживать программы с использованием симулятора. Но я ни разу на практике не встречал его использования.

«ТЗ» для первого проекта

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

Не будем отходить от классики. Первым проектом будет мигающий светодиод. Благо на плате их предостаточно.Что же это означает с точки зрения программирования? Первым делом необходимо изучить принципиальную схему демонстрационной платы и понять как «заводится» светодиод.

User manual доступен на сайте производителя. В данном описании даже есть отдельный раздел про светодиоды на плате — 4.4 LEDs . Для примера, будем использовать User LD3 . Найдем его на схеме:

Простейший анализ схемы говорит о том, что для того, что бы «зажечь» светодиод необходимо на пин МК подать «1» (которая для данного МК соответствует 3.3В). Выключение производится подачей на этот пин «0». На схеме этот пин обозначается PD13 (это, наверное, самая важная информация из этого документа).

В итоге, мы можем написать «ТЗ» для нашей первой программы:

Программа для МК должна переводить состояние пина МК PD13 из состояния «0» в состояние «1» и обратно с некоторой периодичностью, различимой для человеческого глаза (важное замечание, если моргать светодиодом слишком часто глаз может этого не различить).

Прежде чем приступать к программированию, или немного теории

Прежде чем приступить к реализации нашего ТЗ, необходимо понять как производится управление МК.

Начнем с того, что любой МК включает ядро, память и периферийные блоки. Думаю, что с памятью пока все понятно. Упомяну лишь, в STM32 есть флеш память в которой хранится программа МК (в общем случае это не верное утверждение, программа может храниться во внешней энергонезависимой памяти, но пока это опустим) и другие данные, в том числе и пользовательские. Так же есть SRAM — оперативная память.

Ядро — часть микроконтроллера, осуществляющая выполнение одного потока команд. В нашем МК тип ядра — Cortex-M4. Ядро МК можно сравнить с процессором в ПК. Оно умеет только выполнять команды и передавать данные другим блокам (в этом сравнении не учитываются процессоры с интегрированными графическими ускорителями).

При этом производитель МК не разрабатывает ядро. Ядро покупается у компании ARM Limited . Главное отличие между различными МК — в периферии.

Периферийные блоки — блоки осуществляющие взаимодействие с «внешним миром» или выполняющие специфические функции, недоступные ядру МК. Современные МК (в том числе и STM32) содержат огромный спектр периферийных блоков. Периферийные блоки предназначены для решения различных задач, от считывания значения напряжения с аналогового входа МК до передачи данных внешним устройствам по шине SPI.

В отличии от ядра МК периферийные блоки не выполняют инструкции. Они лишь выполняют команды ядра. При этом участие ядра при выполнении команды не требуется.

В качестве примера можно привести блок UART, который предназначен для приема и передачи данных от МК внешним устройствам. От ядра необходимо лишь сконфигурировать блок и отдать ему данные для передачи. После этого ядро может дальше выполнять инструкции. На плечи же периферийного блока ложится управление соответствующим выводом МК для передачи данных в соответствии с протоколом. Периферийный блок сам переводит выход МК в необходимое состояние «0» или «1» в нужный момент времени, осуществляя передачу.

Взаимодействие ядра с периферийным блоком

Взаимодействие ядра МК с периферийным блоком осуществляется с помощью спецрегистров (есть еще взаимодействие через механизм прерываний и DMA, но об этом в следующих постах). С точки зрения ядра это просто участок памяти с определенным адресом, вот только на самом деле это не так . Запись данных в спецрегистр эквивалентна передаче команды или данных периферийному блоку. Считывание — получение данных от блока или считывание его состояния. Описание периферийных блоков и их спецрегистров занимает львиную долю описания МК.

ВАЖНО: После записи данных в спецрегистр и последующем чтении вы можете получить совершенно иные данные. Например, передача данных блоку UART для отправки, и считывание данных, полученных блоком от внешнего устройства, осуществляется с помощью одного и того же регистра.

Спецрегистры обычно разделены на битовые поля. Один (или несколько) бит управляют определенным параметром периферийного блока, обычно независимо. Например, разные биты одного регистра управляют состоянием разных выходов МК.

Если вы гуру в языке C, то можете смело пропускать данный раздел. Он предназначен в первую очередь для тех, кого учили (или ктоучился сам) программировать для ПК. Опыт показывает, что люди часто не помнят важных команд. Здесь я вкратце напомню про побитовые операции и работу напрямую с памятью по ее адресу.

Запись данных по адресу в памяти

Предположим, что читая описание периферийного блока, мы поняли, что для его корректной работы необходимо записать в него число 0x3B. Адрес спецрегистра 0x60004012. Регистр 32-битный.

Если вы сразу не знаете как это сделать, попробую описать цепочку рассуждений для получения правильной команды.

Значение 0x60004012 есть не что иное, как значение указателя на ячейку памяти. Нужно именно это и указать в нашей программе, тоесть сделать преобразование типов согласно синтаксису языка C:

Таким образом, у нас есть указатель на элемент. Теперь нужно в этот элемент записать необходимое значение. Делается это разыменовыванием указателя. Таким образом получаем правильную команду:

*(unsigned long*)(0x60004012) = 0x3B;

Установка произвольных бит в 1

Предположим, что необходимо установить «1» в 7 и 1 биты по адресу 0x60004012, при этом не изменив значение всех остальных бит в регистре. Для этого необходимо использовать бинарную операцию |. Сразу приведу правильный ответ:

*(unsigned long*)(0x60004012) |= 0x82;

Обратите внимание на 2 факта. Биты считаются с нулевого, а не с первого. Данная операция на самом деле занимает не менее 3 тактов — считывание значения, модификация, запись. Иногда это не допустимо, поскольку между считыванием и записью значение одного из бит, которые нам запрещено изменять, могло быть изменено периферийным блоком. Незабывайте про эту особенность, иначе могут полезть баги, которые крайне сложно отловить.

Установка произвольных бит в 0

Предположим, что необходимо установить «0» в 7 и 1 биты по адресу 0x60004012, при этом не изменив значение всех остальных бит в регистре. Для этого необходимо использовать бинарную операцию &. Сразу приведу правильный ответ:

*(unsigned long*)(0x60004012) &= 0xFFFFFF7D;

Или его более простою запись (не переживайте за лишнюю операцию, компилятор все заранее посчитает даже при минимальной оптимизации):

Некоторые особенности программ для МК

Здесь я постараюсь описать некоторые особенности программ для МК, которые важно помнить. Вещи достаточно очевидные, но все же.

У программы нет конца

В отличии от большинства программ для ПК, программа для МК не должна заканчиваться, НИКОГДА! А что собственно должен будет делать МК после завершения вашей программы? Вопрос, практически, риторический. Поэтому не забываем убедиться в том, что вы не забыли вечный цикл. При желании, можно перевести МК в режим сна.

Пользуйтесь целочисленными переменными

Не смотря на то, что мы используем МК с ядром Cortex-M4, который аппаратно выполняет операции над числами с плавающей точкой, советую вам отказаться от их использования. В МК без поддержки таких операций время вычислений будет просто огромным.

Откажитесь от динамического выделения памяти

Это только совет. Причина проста — памяти мало. Я не раз встречался с библиотеками, в которых были «медленные утечки» памяти. Было очень неприятно, когда после нескольких недель стабильной работы МК зависал с ошибкой. Лучше заранее продумать архитектуру своей программы так, чтобы не пришлось использовать динамическое выделение памяти.

Если же все-таки хочется использовать — внимательно изучите работу менеджера памяти или пишите свой.

Приступаем к работе!

Работа над программой для МК всегда начинается с чтения документации. Для нашего МК Reference manual доступен на сайте производителя. Страниц много, но все читать пока не нужно. Как уже было сказано, большую часть документации составляет описание периферийных блоков и их регистров. Так же хочу обратить внимание на то, что этот Reference Manual написан не для одного МК, а для нескольких линеек. Это говорит о том, что код будет переносим при переходе на другие МК в этих линейках (если конечно не пытаться использовать периферийные блоки которых нет в используемом МК).

В первую очередь необходимо определиться с какими блоками предстоит работать. Для это достаточно изучить разделы Introduction и Main features .

Непосредственное управление состоянием пинов МК осуществляется с помощью блока GPIO. Как указано в документации в МК STM32 может быть до 11 независимых блоков GPIO. Различные периферийные блоки GPIO принято называть портами. Порты обозначаются буквам от A до K. Каждый порт может содержать до 16 пинов. Как мы отметили ранее, светодиод подключается к пину PD13. Это означает, что управление этим пином осуществляется периферийным блоком GPIO порт D. Номер пина 13.

Ни каких других периферийных блоков на это раз нам не понадобится.

Управление тактированием периферийных блоков

Для снижения электропотребления МК практически все периферийные блоки после включения МК отключены. Включение/выключение блока производится подачей/прекращением подачи тактового сигнала на его вход. Для корректной работы, необходимо сконфигурировать контроллер тактового сигнала МК, чтобы необходимому периферийному блоку поступал тактовый сигнал.

Важно: Периферийный блок не может начать работу сразу после включения тактового сигнала. Необходимо подождать несколько тактов пока он «запустится». Люди, использующие библиотеки для периферийных устройств, зачастую даже не знают об этой особенности.

За включение тактирования периферийных блоков отвечают регистры RCC XXX peripheral clock enable register .На месте XXX могут стоять шины AHB1, AHB2, AHB3, APB1 и APB2. После внимательного изучения описания соответствующих регистров, можно сделать вывод о том, тактирование периферийного блока GPIOD включается установкой «1» в третий бит регистра RCC AHB1 peripheral clock enable register (RCC_AHB1ENR) :

Теперь необходимо разобраться с тем, как узнать адрес самого регистра RCC_AHB1ENR .

Замечание: Описание системы тактирования МК STM32 достойно отдельной статьи. Если у читателей возникнет желание, я подробнее освещу этот раздел в одной из следующих статей.

Определение адресов спецрегистров

Определение адресов спецрегистров необходимо начинать с чтения раздела Memory map в Reference manual. Можно заметить, что каждому блоку выделен свой участок адресного пространства. Например, для блока RCC это участок 0x4002 3800 — 0x4002 3BFF:

Перейдя по ссылке к Register map блока RCC находим строчкку с интересующим нас регистром RCC_AHB1ENR :

Для получения адреса регистра, необходимо к начальному значению адресного пространства блока RCC прибавить Addr. offset нужного регистра. Addres offset указывается и в описании регистра (см. скриншот выше).

В итоге, мы определили адрес регистра RCC_AHB1ENR — 0x4002 3830.

Для общего ознакомления с блоком GPIO я настоятельно рекомендую полностью прочитать соответствующий раздел Reference Manual. Пока можно не особо обращать внимание на Alternate mode . Это оставим на потом.

Сейчас же наша задача научиться управлять состоянием пинов МК. Перейдем сразу к описанию регистров GPIO.

В первую очередь необходимо установить режим работы 13 пина порта D как General purpose output mode , что означает что блок GPIO будет управлять состоянием пина МК. Управление режимом работы пинов МК производитсяс помощью регистра GPIO port mode register (GPIOx_MODER) (x = A..I/J/K) :

Как видно из описания для совершения требуемой нам настройки необходимо записать значение 01b в 26-27 биты регистра GPIOx_MODER . Адрес регистра можно определить тем же методом, что описан выше.

Настройка параметров работы выходных пинов порта GPIO

Блок GPIO позволяет применить дополнительные настройки для выходных пинов порта. Данные настройки производятся в регистрах:

  • GPIO port output type register (GPIOx_OTYPER) — задается тип выхода push-pull или open-drain
  • GPIO port output speed register (GPIOx_OSPEEDR) — задается скорость работы выхода

Мы не будем менять данных параметров, поскольку нас вполне устраивают значения по умолчанию.

Установка значения на пине МК

Читать:
Как активировать аукс audi chorus васей

Наконец-то мы подошли к моменту управления состоянием выхода МК. Для установки выходного значения на определенном пине МК есть два метода.

Используем регистр GPIO port bit set/reset register (GPIOx_BSRR)

Запись «0» или «1» в биты 0-16 приводят к соответствующему изменению состояния пинов порта. Для того, чтобы установить определенное значение на выходе одного или нескольких пинов МК и не изменить состояния остальных, необходимо будет пользоваться операцией модификации отдельных бит. Такая операция выполняется не менее чем за 3 такта. Если же необходимо в часть битов записать 1, а в другие 0, то понадобится не менее 4 тактов. Данный метод предпочтительнее всего использовать для изменения состояния выхода на противоположное, если его изначальное состояние не известно.

GPIO port bit set/reset register (GPIOx_BSRR)

В отличии от предыдущего метода, запись 0 в любой из битов данного регистра не приведет ни к чему (да и вообще, все биты write-only!). Запись 1 в биты 0-15 приведет к установке «1» на соответствующем выходе МК. Запись 1 в биты 16-31 приведет к установке «0» на соответствующем выходе МК. Этот метод предпочтительнее предыдущего, если необходимо установить определенное значение на пине «МК», а не изменить его.

Найдя адреса всех необходимых регистров, можно написать программу, которая включает светодиод:

//Enable port D clocking

*(unsigned long*)(0x40023830) |= 0x8;

//little delay for GPIOD get ready

volatile unsigned long i=0;

//Set PD13 as General purpose output

*(unsigned long*)(0x40020C00) = (*(unsigned long*)(0x40020C00)& (

*(unsigned long*)(0x40020C14) |= 0x2000;

Можно компилировать ( Project->Compile ) и заливать ( Project->Download->Download active application ). Или запустить отладку ( Project->Dpwnload and Debug ) и начать выполнение (F5).

Мигание светодиода есть ни что иное, как попеременное включение и выключение с задержкой между этими действиями. Самый простой способ — поместить включение и выключение в вечный цикл, а между ними вставить задержку.

//Enable port D clocking

*(unsigned long*)(0x40023830) |= 0x8;

//little delay for GPIOD get ready

volatile unsigned long i=0;

//Set PD13 as General purpose output

*(unsigned long*)(0x40020C00) = (*(unsigned long*)(0x40020C00)& (

*(unsigned long*)(0x40020C14) |= 0x2000;

for( i=0; i<1000000 ;++i );

for( i=0; i<1000000 ;++i );

Значение 1000000 в задержке подобрано экспериментально так, чтобы период мигания светодиода был различим глазом, но и не был слишком велик.

Минусом выбранного подхода миганием светодиодом является то, что ядро МК большую часть времени проводит в пустых циклах, хотя мог бы заниматься чем-нибудь полезным (в нашем примере других задач нет, но в будущем они появятся).

Для того, чтобы этого избежать, обычно используется счетчик циклов, а переключение состояние пина МК происходит при прохождении программы определенного числа циклов.

//Enable port D clocking

*(unsigned long*)(0x40023830) |= 0x8;

//little delay for GPIOD get ready

volatile unsigned long i=0;

//Set PD13 as General purpose output

*(unsigned long*)(0x40020C00) = (*(unsigned long*)(0x40020C00)& (

*(unsigned long*)(0x40020С14) |= 0x2020;

else if( !(i%1000000) )

Но и тут не обойдется без проблем, с изменением количества команд выполняемых внутри цикла, будет меняться период мигания светодиодом (или период выполнения других команд в цикле). Но на данном этапе мы не можем с этим бороться.

Немного об отладке

IAR позволяет осуществлять отладку приложения непосредственно в железе. Все выглядит практически так же, как и отладка приложения для ПК. Есть режим пошагового выполнения, входа в функцию, просмотр значения переменных (В режиме отладки View->Watch->Watch1/4 ).

Но помимо этого, присутствует возможность просмотра значений регистров ядра, спецрегистров периферийных блоков (View->Register) и т.п.

Я настоятельно рекомендую ознакомиться с возможностями дебаггера во время изучения программирования МК.

Несколько слов в заключение

Возможно, многие скажут, что ручное прописывание адресов в программе это не правильно, поскольку производитель предоставляет файлы с определениями регистров и битовых полей, библиотеки для работы с периферией и другие инструменты, облегчающие жизнь разработчику. Я с этим полностью согласен, но все равно считаю, что первые шаги в программировании МК необходимо делать перекапывая документацию к вручную, самостоятельно определяя необходимые регистры и битовые поля. В дальнейшем этим можно не пользоваться, но уметь нужно обязательно.

Приведу лишь несколько причин для этого утверждения:

  • В библиотеках от производителя иногда встречаются ошибки! Я один раз чуть не сорвал срок проекта из-за этого. Несколько раз перепаивал чип, думая, сто повредил кристалл при пайке (до этого такое случалось). А проблема заключалась в том, что в библиотеке был неверно прописан адрес спецрегистра. Обычно такое случается с МК или линейками МК только вышедшими на рынок.
  • Библиотеки для работы спериферией некоторых производителей не реализуют всех возможностей периферийных блоков. Особенно этим грешилb Luminary Micro , которых в последствии выкупили TI. Приходилось писать инициализацию периферии вручную.
  • Многие привыкают начинать программирование МК с изучения примеров. Я считаю, что сперва необходимо определиться с тем, что позволяет реализовать МК. Это можнопонять только прочитав документацию. Если чего-то нет в примерах, это не значит, что железо это не поддерживает. Последний пример — аппаратная поддерка PTP STM32. В сети, конечно, можно кое-что найти, но это не входит в стандартный набор от производителя.
  • Драйверы периферийных блоков некоторых производителей настолько не оптимизированы, что на переключение состояния пина средствами библиотеки тратится до 20 тактов. Это непозволительная роскошь для некоторых задач.

Спасибо всем, кто прочитал мой пост, получилось значительно больше чем я ожидал в начале.

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

Реальный код не должен так выглядеть ни при каких условиях. Вообще. Вместо кода с магическими константами:

//Enable port D clocking

*(unsigned long*)(0x40023830) |= 0x8;

лучше использовать код:

#define RCCAHB1_ENR (unsigned long*)0x40023830

//Enable port D clocking

Здесь по-прежнему не используется библиотека, по-прежнему разыменуется адрес регистра, только теперь код не выглядит так отвратительно и не прививает «говнокодерский» стиль с магическими числами.

Использовать дефайны можно и вот так (тут разобраться, откуда синтаксис указателя):

Человек в любом случае полезет в документацию, чтобы узнать, что это за регистр AHB1ENR и что за флаг RCC_AHB1ENR_IOPDEN . Правда, тут есть одна тонкость: Вот пример который скомпилируется, но не cработает:

Как считать прошивку с stm32

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

Контроллеры STM32 можно прошить двумя путями.
1) Через встроеный бутлоадер (бутлоадер, это такая маленькая программка внутри каждого микропроцессора STM32, которая прикидывается программатором — это если по простому). Прошивка в таком варианте происходит через UART (для связи с компьютером используется переходник USB>COM)

2)Внешним программатором. Из внешних программаторов на данный момент есть большой выбор. Это может быть и ваша отладочная плата STM32 Discovery, и китайский аналог ST-LINK V2 mini, и оригинальный ST-Link.

Первым вариантом я не пользовался, но сложного в нём вроде ничего нет. Нужно скачать утилиту STM32 ST-LINK Utility и на вашем прошиваемом микроконтроллере выставить определённый сигнал на ножке\ножках BOOT0\BOOt1. Допустим возьмём для примера самый дешёвый и простой микроконтроллер STM32F030F4P6 в корпусе TSSOP20. У него есть ножка BOOT0, которую если мы замыкаем на массу — то у нас контроллер будет прошиваться через SWD (то есть от внешнего программатора), а если на эту ножку подать напряжения питания, то контроллер будет стартовать с встроенного бутлоадера, и ждать пока мы его прошьём через UART, то есть с помощью программы ST-LINK Utility.

Вторым вариантом намного проще работать, так как помимо того что вы можете прошивать свои микроконтроллеры так ещё и в режиме реального времени отлаживать свои программы (дебажить))
Для прошивки в таких случаях используется всего 4 ножки (по минимуму)
1)Vcc — питание 3 Вольт
2)VSS(Gnd) — масса
3)SWCLK
4)SWDIO

Такой вариант подключения для прошивки используется в том случае, если вы не сконфигурировали ножки SWCLK и SWDIO в качестве портов ввода-вывода. Если же вы эти ножки используете в качестве портов ввода-вывода, то прийдётся ещё подключать "физичесу" линию сброса. — RST . В таком варианте у нас получается 5 проводов для подключения
1)Vcc — питание 3 Вольт
2)VSS(Gnd) — масса
3)SWCLK
4)SWDIO
5)NRST

Вот так выглядит распиновка на плате STM32F4Discovery разъёма для программирования внешних микроконтроллеров. Пин VDD_Target является пином, для снятия показаний напряжения с прошиваемого устройства. Этот если по простому — для согласования уровня напряжений между программатором и прошиваемым устройством.

Вот так выглядит разъём программатора ST-LINK V2 mini. В нём есть дополнительные средства для работы с STM8 и т.д, поэтому для работы с STM32 нам нужны пины
1)Vcc — питание 3 Вольт
2)SWDIO
3)VSS(Gnd) — масса
4)SWCLK
10)NRST

Вот так выглядит схема подключения для прошивки нашего простейшего микроконтроллера STM32F030F4P6

Как видите, никаких заморочек нет. На этом думаю всё, если будут вопросы, то пишите в коментах, я добавлю эти нюансы в статью.

1. STM32. Программирование STM32F103. Тестовая плата. Прошивка через последовательный порт и через ST-Link программатор

Микроконтроллеры STM32 приобретают все большую популярность благодаря своей мощности, достаточно разнородной периферии, и своей гибкости. Мы начнем изучать STM32F103C8T6, используя бюджетную тестовую плату, стоимость которой не превышает 2 $ (у китайцев). Еще нам понадобится ST-Link программатор, стоимость которого около 2.5 $ (у китайцев). Такие суммы расходов доступны и студентам и школьникам, поэтому именно с такого бюджетного варианта я и предлагаю начать.

STM32F103C8_01STLine_01

Этот микроконтроллер не является самым мощным среди STM32, но и не самый слабый. Существуют различные платы с STM32, в томе числе Discovery которые по цене стоят около 20 $. На таких платах почти все то же, что и на нашей плате, плюс программатор. В нашем случае мы будем использовать программатор отдельно.

Микроконтроллер STM32F103C8. Характеристики

  • Ядро ARM 32-bit Cortex-M3
  • Максимальная частота 72МГц
  • 64Кб Флеш память для программ
  • 20Кб SRAM памяти
  • Питание 2.0 . 3.3В
  • 2 x 12-біт АЦП (0 . 3.6В)
  • DMA контролер
  • 37 входов / выходов толерантных к 5В
  • 4 16-розрядних таймера
  • 2 watchdog таймера
  • I2C — 2 шины
  • USART — 3 шины
  • SPI — 2 шины
  • CAN
  • USB 2.0 full-speed interface
  • RTC — встроенные часы

На плате STM32F103C8 доступны

  • Выводи портов A0-A12, B0-B1, B3-B15, C13-C15
  • Micro-USB через который можно питать плату. На плате присутствует стабилизатор напряжения на 3.3В. Питание 3.3В или 5В можно подавать на соответствующие выводы на плате.
  • Кнопка Reset
  • Две перемычки BOOT0 и BOOT1. Будем использовать во время прошивки через UART.
  • Два кварца 8Мгц и 32768 Гц. У микроконтроллера есть множитель частоты, поэтому на кварце 8 МГц мы сможем достичь максимальной частоты контроллера 72Мгц.
  • Два светодиода. PWR — сигнализирует о подачи питания. PC13 — подключен к выходу C13.
  • Коннектор для программатора ST-Link.

Скачать тестовый файл для прошивки можно здесь. Программа мигает светодиодом на плате.

Прошивка STM32 с помощью USB-Uart переходника под Windows

Port_01Port_02

Подключаем RX и TX выходы к соответствующим выводам USART1 микроконтроллера. RX переходника подключаем к TX микроконтроллера (A9). TX переходника подключаем к RX микроконтроллера (A10). Поскольку USART-USB имеет выходы питания 3.3В подадим питания на плату от него.

STM32F103C8_UART_PROG_02

Чтобы перевести микроконтроллер в режим программирования, надо установить выводы BOOT0 и BOOT1 в нужное состояние и перезагрузить его кнопкой Reset или выключить и включить питание микроконтроллера. Для этого у нас есть перемычки. Различные комбинации загоняют микроконтроллер в различные режимы. Нас интересует только один режим. Для этого у микроконтроллера на выводе BOOT0 должно быть логическая единица, а на выводе BOOT1 — логический ноль. На плате это следующее положение перемычек:

STM32F103C8_UART_PROG_01

После нажатия кнопки Reset или отключения и подключения питания, микроконтроллер должен перейти в режим программирования.

Программное обеспечение для прошивки

После включения схемы с правильно выставленными перемычками контроллер готов к работе с Flash Loader Demonstrator.

Запускаем Flash Loader Demonstrator и выбираем порт с которым будем работать, и устанавливаем параметры порта.

FlashLoaderDemonstrator_01

После выбора параметров порта нажимаем Next после чего должны увидеть «светофор» и информацию по микроконтроллеру. Если этого не происходит, тогда проверяем корректность установленных параметров связи и проверяем действительно ли микроконтроллер введен в режим программирования.

FlashLoaderDemonstrator_02

Нажимаем Next,

FlashLoaderDemonstrator_03

На этой странице выбираем файл для загрузки в микроконтроллер. Файл может быть в формате bin или hex.

FlashLoaderDemonstrator_04

Нажимаем Next и ждем.

FlashLoaderDemonstrator_05FlashLoaderDemonstrator_06

Чтобы вывести контроллер из режима программирования, возвращаем перемычки в исходное состояние и нажимаем кнопку Reset. Программа в микроконтроллере должен заработать.

Прошивка STM32 с помощью USB-Uart переходника под Linux (Ubuntu)

Устанавливаем stm32flash

Если используем USB-UART переходник, имя порта буде примерно такое /dev/ttyUSB0

Получить информацию о чипе
Читаем с чипа в файл dump.bin
Пишем в чип

Прошивка STM32 с помощью ST-Link программатора под Windows

При использовании программатора ST-Link выводы BOOT0 и BOOT1 не используются и должны стоять в стандартном положении для нормальной работы контроллера.

STLine_02

Качаем с сайта st.com Утилиту STM32 ST-LINK Utility. Устанавливаем ее. С ней должен быть установлен и драйвер для ST-Link. Если нет, качаем и устанавливаем драйвера ST-Link: http://www.st.com/content/st_com/en/products/embedded-software/development-tool-software/stsw-link009.html Подключаем ST-Link в USB- разъем компьютера, а соответствующие выводы программатора подключаем к выводам тестовой платы согласно маркировки.

Запускаем программу STM32 ST-LINK Utility

STM32ST-LINKUtility_01

Выполняем пункт меню Target -> Connect

STM32ST-LINKUtility_02

Выполняем пункт меню Target -> Erase Chip

STM32ST-LINKUtility_03

Выполняем пункт меню File -> Open file. Выбираем файл для загрузки в микроконтроллер.

STM32ST-LINKUtility_04

Выполняем пункт меню Target -> Programm & Verify.

STM32ST-LINKUtility_05

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

STM32ST-LINKUtility_06

Прошивка STM32 с помощью ST-Link программатора под Linux (Ubuntu)

Устанавливаем софт для работы с ST-Link

Пришлось устанавливать autoconf и libusb-1.0:

Как считать прошивку с stm32

11.05.2022г. ВНИМАНИЕ! Если у вас не отображаются иллюстрации к статьям, для просмотра сайта используйте TOR браузер

STM32F103 + SPL: Программирование, прошивка, отладка микроконтроллеров STM32 в средах Windows/IAR и Linux/Eclipse используя программатор ST-Link v2

разделы: STM32 , STM32duino , среда разработки , дата: 14 октября 2016г.


рекомендуется к прочтению

Архитектуру STM32 можно мысленно разделить на две части. Первая часть, это ядро Cortex-M3, которое спроектировали в ARM и которое примерно одинаковое для всех. «Примерно», потому что, содержит опциональные модули которые могут быть у одного производителя и отсутствовать у другого. Вторая часть, это периферия знакомая по STM8, с тем отличием, что был добавлен USB2.0 интерфейс, хотя точнее было бы сказать, что этот интерфейс был «откручен» от STM8(такая у STM политика: хочешь аппаратный USB, используй STM32).

    Справочники и руководства которые нужны для работы c STM32F103x8/STM32F103xB:
  1. Справочное руководство по 32-битным микроконтроллерам серий STM32F10x Reference Manual. STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx advanced ARM®-based 32-bit MCUs или RM 0008
  2. Руководство на чипы STM32F103x8/STM32F103xB STM32F103x8 STM32F103xB Medium-density performance line ARM®-based 32-bit MCU with 64 or 128 KB Flash, USB, CAN, 7 timers, 2 ADCs, 9 com. interfaces Книга не обязательная, но на мой взгляд очень полезная.
    Небльшой ликбез по ARM и Cortex-M3 в частности:
  • Cortex-M3 основан на архитектуре ARMv7 и является усеченным вариантом архитектуры ARMv7 специально для микроконтроллеров. По сравнению с полноценным ЦПУ Cortex-A, здесь отсутствует кеш и 32-битный альтернативный набор команд ARM. Также могут отсутствовать некоторые модули, такие как модуль зашиты памяти — MPU (Memory Protect Unit).
  • Cortex-M3 включает в себя 16-битный набор команд, оптимизированный для систем с малым объемом памяти, Thumb и 32-битный дополнительный набор Thumb-2. Здесь 16-битная команда означает, что ее двоичное представление будет занимать в памяти 16-бит, т.е. она более компактная. Программный код может состоять из произвольного набора 16-битных команд Thumb и 32-битных Thumb 2.
  • В Cortex-M3 имеется аппаратное деление и умножение. Урезанная, удешевленная версия Cortex-M0 базируется на архитектуре ARMv6 и таких инструкций не имеет. ARMv6 отличается от ARMv7 отсутствием набора инструкций Thumb-2. Cortex-M4, напротив, дополнен DSP модулем, а Cortex-M4F также включает в себя FPU модуль, т.е. он аппаратно поддерживает числа с плавающей запятой.
  • Номера процессоров ARM никак не согласованы с версиями архитектур. Процессоры ARM11 имеют архитектуру ARMv6, а ARM9 имели архитектуру ARMv4.
  • Cortex-M3 имеет единую адресную 32-битную шину, которая может адресовать 4Гб памяти. Процессор построен по гарвардской архитектуре и имеет отдельные шины для памяти данных SRAM и памяти программ Flash. Программа может быть запущена из SRAM, тогда будет задействована только одна шина и код будет выполняться медленнее.
  • Cortex-M3 имеет шестнадцать 32-битных РОН (регистров общего назначения) R0-R15. Команды из набора инструкций Thumb могут обращаться только к регистрам R0-R7. Команды из набора Thumb-2 могут обращаться ко всем регистрам. При этом, регистр r13 — это указатель стека, r14 — регистр связи(хранит адрес возврата из подпрограммы), r15 — счетчик команд.

Немного о STM32:

Выпускаемые линейки микроконтроллеров изображены на следующей картинке:

Это не полный перечень, но представление давать должен. Кроме линеек, микроконтроллеры делятся по размерам flash-памяти. Чем больше flash-пямять, тем больше остальной периферии. Для 103-й линейки это выглядит так:

Блок-схема устройства STM32F103 представлена на картинке ниже:

Во всем этом хозяйстве нас будет больше всего интересовать периферия подключенная к периферийным шинам APB1 и APB2. Также полезно будет запомнить внутреннюю шину AHB.

Имеющаяся в чипах периферия перечислена в следующей табличке:

Выбор «железа»

Чип который у меня оказался под рукой — STM32F103CBT6 запаянный в плату Maple Mini:

Заказав его год назад на Али, я ради интереса загрузил в него несколько скетчей, и набалововшись бросил на полку. За этот год проект Leaf Maple накрылся медным тазом, сайт поменял содержимое, а поддержку железа передали на следующий форум: STM32 for Arduino. Я особо не расстроился, т.к. не питал особых надежд на этот проект, и планировал плату использовать для Си-программирования.

Кстати, на упомянутом выше сайте есть хороший классификатор с образчиками результатов работы китайской промышленности, содержащих чипы STM32F103, очень рекомендую ознакомится: STM32F103 boards

Если у кого-то имеется под рукой «Blue Pill», то это не беда, там установлен чип STM32F103C8T6 который от STM32F103CBT6 отличается только уменьшенным до 64кБ размером flash-памяти. Еще там светодиод подключен на PC13, в то время как на MapleMini он на PB1, и кроме этого у Maple Mini имеется кнопка на PB8.

Зато на «Blue Pill» имеется штыревой разъем для подключения программатора ST-LINK, в то время как Maple Mini нужно устанавливать в макетку что бы прошить по SWD. Прозвонкой чипа было выяснено, что на Mapple Mini SWDIO контакт «висит» на 22-pin, а SWCLK на 21-м. Но заставить работать ST-LINK с Maple Mini оказалось не просто.

Прошивка чипов через программатор ST-LINK v2

STM32 можно прошить либо через UART встроенным загрузчиком, либо через SWD-интерфейс программатором ST-LINK. Меня интересовал второй вариант, т.к. был скромным владельцем клона ST-LINK v2.

В Windows прошить STM32 через ST-LINK можно воспользовавшись фирменной утилитой «STM32 ST-LINK Utility», или непосредственно из среды разработки IAR for ARM. В Linux можно воспользоваться консольной утилитой sy-flash.

Если у вас «Blue Pill» или еще какая-либо плата отличная от Leaf Maple, то никаких проблем не будет, их можно сразу прошивать. Моя же Maple Mini никак не хотела видеться программатором, пока я не догадался во время загрузки программы из IAR в чип, несколько раз нажать на кнопку Reset на плате. После чего Maple Mini начала свободно прошиваться, но родной USB-загрузчик был на этом этапе потерт. Но это мелочи.

Ок. Посмотрим как чипы прошиваются в Windows. Войдя на сайт http://my.st.com и залогинившись, введем в строку поиска «st-link». На выходе получим такую табличку:

Щелкнув мышкой по второй строчке и промотав открывшуюся страницу книзу, увидим список предлагаемого ПО для программатора:

STSW-LINK004 — это утилита для прошивки STM32 чипов. STSW-LINK007 утилита для обновления прошивки программатора, STSW-LINK009 — драйвера для различных версий Windows. Немного выше предлагаются свежие прошивки для самого программатора. ST-LINK v2.

Как установить драйвер для ST-LINK v2 я рассказывал здесь: STM8 + IAR + ST-LINK2: программирование, прошивка и отладка из под Windows, поэтому далее будем считать, что драйвер уже установлен.

После установки и запуска «STM32 ST-LINK Utility» следует подключить ST-LINK v2 к компьютеру или виртуальной машине(мой случай), а к ST-LINK в свою очередь, должен быть подключен чип который следует прошить:

После чего следует пройти по меню: «меню-> Target — > Settings. » и должно появится такое окно:

Во-первых, сам программатор ST-LINK V2 должен быть опознан программой, показана версия его прошивки. Во-вторых должен быть опознан чип подключенный к программатору. В третьих, рабочий протокол должен быть установлен как SWD, а не JTAG.

Когда я впервые воткнул ST-LINK полученный год назад с Али, мне вместо номера прошивки показывало что-то вроде «Old firmware», поэтому мне пришлось воспользоваться утилитой обновления прошивки ST-LINK, что бы флешеры нормально работали с моим клоном ST-LINK. К сожалению у меня не сохранились скрины.

Здесь у меня изначальная версия прошивки(цифра после буквы J) была то ли 20, то ли 21. В итоге меня обновили то текущей версии. Кстати, из под виртуальной машины обновляется прошивка без проблем.

Вернемся к STM32 ST-LINK Utility. После нажатия кнопки «Ок» в окне «Settings», появится рабочее окно программы:

Следует запомнить, что стартовый адрес флеш-памяти начинается с 0x08000000. Встроенная оперативка начинается c 0x20000000. Чтобы программа стартовала с оперативки, контакты boot0 и boot1 должны быть сконфигурированы специальным образом.

Щелкнув по вкладке «binary file» можно выбрать файл с прошивкой, затем пройдя по «меню->Target->Program. » эту прошивку можно прошить в микроконтроллер:

Наряду со знакомым форматом прошивок HEX, в stm32 широко используется бинарный raw-формат «*.bin».

Через меню «File->Save As» можно сохранить прошивку чипа в файл:

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

Еше интересной штукой являются Option Bytes знакомые по STM8:

Пока не будем их трогать.

Теперь, что касается st-flash для Linux, то там с одной стороны все проще, а с другой — сложнее. Сложнее, потому что глючит. Может к этим глюкам как-то можно привыкнуть, но я пока не сумел.

Пока я обнаружил такую закономерность, команда очистки флеш-памяти «st-flash erase» помогает избавиться от глюков:

Программирование STM32 с помощью IAR и SPL в Windows

Если на сайте http://my.st.com ввести в строку поиска «stm32f10x standard peripheral library» то нам предложат скачать SPL для чипов STM32F10x:

В отличии от SPL для STM8, библиотека разделена на CMSIS и саму SPL. CMSIS (Cortex® Microcontroller Software Interface Standard) — это стандарт описания периферии микроконтроллера, то что в STM8 размещалось в файлах stm8s.h/stm8l.h

Подключить SPL к IAR достаточно просто, в сети множество видео и пошаговых инструкций. Я лично делал по этому видео: STM32 Discovery IAR and StdPeriph Lib настройка и загрузка проекта

Проект компилируется и заливается в чип, после чего успешно работает. Наверное больше и не надо, но я предлагаю забрать результирующий объектный файл с расширением *.out и перенести его в Linux, для внимательного изучения:

Программирование STM32 с помощью Eclipse и SPL в Linux

В Linux попробуем посмотреть, что за файл генерирует на выходе IAR:

Как видим, это обыкновенный эльф. Смотрим дальше:

Из «эльфа» мы всегда можем получить файл прошивки в HEX формате:

или бинарный файл:

Также можно посмотреть ассемблерный код:

Даже можно попытаться загрузить на чип в режиме отладки. Для этого понадобиться сервер st-util который входит в набор утилит st-flash и сам отладчик gdb.

Подключаемся к ранее запущенному серверу:

Ставим точку останова и запускаем на исполнение:

Но при попытке распечатать исходный листинг программы выдаст сообщение об ошибке:

кое-что сделать конечно можно

На этом этапе думаю лучше оставить прошивку с IAR в сторону, и попытаться скомпилировать нормальный объектный файл в Linux.


некоторые не ищут легких путей.

Проблема в том, что нельзя вот так просто взять компилятор, исходный текст и скомпилировать прошивку для stm32. Почему? Потому что в опциях gcc компилятора можно указать только тип архитектуры «cortex-m3», а чипов на этой архитектуре выпускаются различными фирмами — тьма тьмущая. И у всех них разные карты памяти и периферия. Как минимум понадобиться скрипт линкера для вашего чипа.

О масштабах проблемы можно почитать например тут: ARM-ы для самых маленьких: тонкости компиляции и компоновщик. Более-менее толковый самопальный Makefile который мне удалось найти можно взять тут: Еще один шаблон проекта под STM32 на gcc.

После некоторых размышлений я решил взять в качестве основы сборочные файлы из какого-нибудь IDE. Традиционным IDE для ARM в Linux стал Eclipse, который ненавидят наверно все linux-пользователи за глючность и тормознутость. Справедливости ради, должен упомянуть, что генерации проектов существует специальная фирменная утилита STM32CubeMX. Но может ли она генерировать проекты для gcc или нет, я не знаю.

Поддержка ARM в Eclipse ставится через плагин: GNU ARM Eclipse

На странице установки предлагается несколько способов установки ARM плагина. Но, например, на LinuxMint мне этот плагин установить не удалось. В репозитории какая-то древняя версия Eclipse 3.8, это версия от 2012(!) года. И установка плагина заканчивается фейлом:

Поэтому пришлось вспомнить про старую добрую Slackware GNU/Linux. В этом году вышла новая версия 14.2.

Для начала нужно будет скачать ARM toolchain c сайта ARM:

Скачанный архив я распаковал в /usr/local

Теперь чтобы скачать Eclipse, зайдем в репозиторий и введем в строку поиска «eclipse-cpp»:

После чего попадаем на страницу с пакетом:

Т.к. уменя Слакваръ 64-битная, то для установки выполняем следующие манипуляции:

Поставив Eclipse мы сделали полдела. Еще нужно поставить jdk. C 6-й и 8-й версии JDK Eclipse отказывался работать и вылетал. С 7-й тоже глючит, но кое-как работает. В гугл вбиваем «java jdk 7 download» попадем на страницу: Java SE Development Kit 7 Downloads

Теперь можно запускать Eclipse:

Жмем OK, это будет рабочий каталог проектов:

Далее открываем Marketplace:

В строку поиска вводим ARM:

и щелкаем по «install»

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

Если погода на Марсе будет солнечной, то в конце установки предложат перезагрузить Eclipse:

После перезапуска Eclipse создаем новый проект:

В открывшийся форме нужно будет заполнить имя нового проекта и выбрать его тип:

В следующей форме необходимо выбрать параметры чипа. Замечу, что по дефолту(поле Content) предлагается не пустой проект, а проект с blink’ом:

Следующую форму можно оставить как есть:

Здесь нужно указать путь к папке toolchain’ом:

Осталось закрыть окно «Welcome»

И перед нами открывается окно проекта:

Это совсем не тот простенький Blink который был в IAR. Здесь задержки формируются по таймеру и кроме этого используется модуль трассировки. Задать номер pin’а к которому подключен светодиод, можно в файле Blinky.h

Чтобы задать светодиод на PB1 нужно константы BLINK_PORT_NUMBER и BLINK_PIN_NUMBER установить в единицы. После чего можно скомпилировать проект:

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

Там будет объектный файл прошивки. Получаем бинарный файл:

Если, опять же все нормально, то светодиод начнет мигать с интервалом в одну секунду. Заливать прошивку можно и из Eclipse, но эта IDE меня интересует только как генератор проектов.

Попробуем взглянуть на makefile файл который лежит в этой же папке:


некоторые вещи бывает сложно объяснить

Пробуем еще раз загрузить полученный файл в отлдачик. Запускаем сервер:

подключаемся к серверу:

ставим точку останова:

Запускаем на выполнение:

Выполнение программы приостонавливается на точке останова. Смотрим листинг:

В этот раз все в прорядке. Однако если мы еще раз дадим команду continue, то будет возможно, неожиданный эффект:

Программа останавливается по сигналу SIGTRAP и дальше ни в какую не идет.

Проблема кроется в отладочном интерфейсе semihosting, которого как понимаю, в чипе просто нет, но который позволяет выводить отладочные сообщения через функцию trace_printf().

Чтобы решить эту проблему, нужно в Eclipce через меню->project->proporties, открыть вкладку Settings в «C/C++ Build»:

В настройке препроцессора следует удалить макроопределение OS_USE_TRACE_SEMIHOSTING_DEBUG. После чего пересобрать проект. и полученный объектный файл заново загрузить в отладчик:

Посмотрим что нам пытаются вывести:

здесь вроде все нормально

Посмотрим значение переменной seconds:

Почему то у меня после blink_on() светодиод гаснет, а после blink_off() наоборот загорается

Похожие публикации