Iar и stm32 cortex m0. часть 0x01. подготовка платформы iar

Программирование STM32. Часть 2: IAR + CMSIS

Это вторая часть цикла статей про микроконтроллеры STM32F1xxx, начало тут. Здесь мы поговорим о библиотеке CMSIS, зачем она нужна, где взять и как ее подключить к своему проекту. Все стати цикла будут находиться здесь: http://dimoon.ru/category/obuchalka/stm32f1

Введение

Cortex Microcontroller Software Interface Standard (CMSIS) содержит описание всех регистров микроконтроллера, таблицу векторов прерываний и некоторый стартовый код, который выполняется перед передачей управления функции main(). Вообще говоря, СMSIS является необязательным компонентом проекта, однако, в этом случае придется самому заботиться об огромном количестве вещей. Кроме того, эта библиотека позволяет писать в некоторой степени переносимый код с одного микроконтроллера, на другой.

Качаем CMSIS

В данный момент CMSIS поставляется совместно с STM32Cube MCU Package. Скачать его можно на странице выбранного микроконтроллера (там, где качали даташит, Reference manual и так далее), называется STM32CubeF1:

Для скачивания нужно зарегистрироваться у них на сайте. Феее, ну и нафига они это сделали?: Оставлю ка я ссылку на архив в конце статьи, чтоб не возится во всеми этими регистрациями. Но все же лучше скачать актуальную версию библиотеки на официальном сайте. Весит архив к стати довольно много, 97 метров.

Создаем проект в IAR ARM

Теперь проводим небольшую подготовительную работу по созданию проекта в IAR ARM. Запускаем среду IAR Embedded Workbench:

В IAR-e все проекты (Projects) находятся внутри Workspace-а, причем количество проектов в одном воркспейсе может быть несколько.

Выбираем Project->Create New Project…

В открывшемся окне выбираем тип проекта: C->main:

Нажимаем ОК, набираем какое-нибудь имя (в моем случае test_proj) и сохраняем в какой-нибудь папке:

Проект создан. После этого выбираем File->Save All и в открывшемся окне набираем имя нашего Workspace-а, его можно назвать так же, как и проект.

Теперь нам надо настроить проект под конкретный микроконтроллер, а именно STM32F103C8. Нажимаем правой кнопкой мыши на названии нашего проекта и выбираем пункт Options…

В разделе General Options на вкладке Target выбираем наш микроконтроллер:

Далее настаиваем уровень оптимизации компиляции. При отладке иногда натыкался на некоторые проблемы при высоком уровне оптимизации, поэтому советую в C/C++ Compiler на вкладке Optimizations ставить None или на крайняк Low:

Складывать все файлы исходников в корень проекта не очень хорошая идея, в дальнейшем будет трудно ориентироваться среди кучи файлов, поэтому для CMSIS создадим одноименную папку CMSIS . Но нам необходимо указать компилятору путь, где искать исходники. Для этого на вкладке Preprocessor надо указать путь к папке с библиотекой. Чтоб не указывать абсолютные пути, в IAR-е существует переменная $PROJ_DIR$, в которой хранится путь к папке с проектом:

Первая строчка указывает на корень проекта, где лежит main.c, это вроде как не обязательно, но пусть будет, вторая на будущую папку с CMSIS. Обращаем внимание на стрелки прокрутки вкладок, выделил синим:

Теперь отладчик. В разделе Debugger на вкладке Setup выбираем ST-LINK, который идет в комплекте с отладочными платами Discovery:

и на вкладке Download ставим галочку Use flash loader(s):

После этого в разделе ST-LINK выбираем тип интерфейса подключения, у нас по SWD:

Фух, проект настроили. Нажимаем OK для сохранения изменений.

После этого идем в каталог с проектом и создаем там папку CMSIS, в нее мы будем складывать файлы библиотеки CMSIS:

Библиотека CMSIS

Архив с STM32CubeF1 скачали, разархивировали. В нем содержится много разных вещей: документация, примеры для отладочных плат, драйверы HAL и сам CMSIS, который нам и нужен. CMSIS расположен в .STM32Cube_FW_F1_V1.6.0DriversCMSIS.

Вначале идем в .CMSISDeviceSTSTM32F1xxInclude:

У нас тут куча .h файлов для разных микроконтроллеров, но чего-нибудь наподобие stm32f103x8.h не видно. Открываем stm32f1xx.h. Там есть вот такая вещь:

Обращаем внимание на строчку:

Ага, STM32F103C8 тут есть. Значит для нашего микроконтроллера подойдут исходники, от B версии: STM32F103xB. Запомним это. Из этой папки копируем в CMSIS проекта следующие файлы:

Далее переходим в .CMSISDeviceSTSTM32F1xxSourceTemplates и отсюда забираем файл system_stm32f1xx.c

После нам нужен стартап-файл. Заходим в .CMSISDeviceSTSTM32F1xxSourceTemplatesiar. Там нас так же ждет большое количество файлов и мы так же ищем тот, который оканчивается на xB: startup_stm32f103xb.s. Копируем его в $PROJ_DIR$CMSIS.

Затем переходим в .CMSISInclude и забираем вот эти 3 файла:

Так как в STM32F103C8 микропроцессорное ядро Cortex M3, то и берем соответствующие исходники.

  1. stm32f1xx.h
  2. stm32f103xb.h
  3. system_stm32f1xx.h
  4. system_stm32f1xx.c
  5. startup_stm32f103xb.s
  6. core_cm3.h
  7. core_cmFunc.h
  8. core_cmInstr.h

Вот так это должно выглядеть в папке $PROJ_DIR$CMSIS:

Теперь эти файлы надо добавить в обозреватель проекта в IAR-е. Для удобства создадим группу с одноименным названием CMSIS. Нажимаем правой кнопкой мыши на названии проекта и выбираем Add->Add Group…

Вводим название группы и нажимаем OK:

После этого в группу CMSIS добавляем файлы из папки CMSIS:

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

В результате получаем вот это:

После этого открываем файл stm32f1xx.h и раскомментируем стоку с #define STM32F103xB:

Далее пишем следующий main:

Выбираем Project->Make. Если все сделали правильно, то получаем сообщение об успешной компиляции проекта:

Вот мы и научились подключать CMSIS к нашему проекту. В следующей статье мы продолжим изучение микроконтроллеров STM32 Продолжение тут.

IAR и STM32 CORTEX M0. Часть 0x01. Подготовка платформы IAR

В одной и прошлых статей [1] я уже настраивал IAR (для STM32F10x), поэтому разберем этот процесс еще раз (не надо искать логику, повторение — мать заикания!). После запуска программы выбираем Project → Create New ProjectC → main → OK. Будет предложено выбрать папку и название проекта. Для большей пользы (ква, и удобства!) мы будем не просто клепать примеры, а оформим их как библиотеки (понадобится нам какой-нибудь UART — раз и подключили!). Так что рекомендую проект назвать main, он будет базой для наших самописных буль-буль. библиотек.

Структуру папок будем настраивать в соответствии со статьями [2, 3] (далее — выжималка из них). Сворачиваем пока IAR, идем в папку с проектом (ага, вы ведь запомнили, куда он сохранился?!). Видим там файлик main.c (ворчим под нос что-то про беспорядок), создаем папку src и переносим его туда. Теперь возвращаемся в IAR, находим дерево в панели Workspace и удаляем оттуда main.c:

Затем последовательность действий следующая:

  • жмем правой кнопкой мыши (ПКМ) на корень дерева, выбираем Add → Add Group → src →OK;
  • ПКМ на src, Add → Add Files. Находим наш main.c и нажимаем открыть;
  • Сворачиваем IAR, в папке src создаем папки CMSIS, inc, lib, startup;
  • Копируем в папку CMSIS файл system_stm32f0xx.c (лежит в архиве после статьи);
  • Копируем в папку inc файлы stm32f0xx.h, system_stm32f0xx.h (лежат в архиве);
  • Копируем в папку startup файл startup_stm32f0xx.s (в архиве);
  • Копируем в папку lib. ничего не копируем, мы еще не написали библиотек 🙂
Читайте также  Еще раз а также немного о прерываниях

Лирическое отступление. Папки CMSIS, inc и startup я специально вынес в отдельный архив, потому что хотя их теоретически и можно найти на официальном сайте, но мне пришлось потратить не один час, выискивая их по разным уголкам. Если сейчас их можно где-то найти в нормальном виде (на офсайтах), просьба отписаться в комментах.

А мы продолжаем:

  • Возвращаемся в IAR;
  • ПКМ на src → AddAdd Group. → CMSIS;
  • ПКМ на src → AddAdd Group. → inc;
  • ПКМ на src → AddAdd Group. → startup;
  • ПКМ на src → AddAdd Group. → lib;
  • ПКМ на CMSIS → Add Files. Добавляем файлы из папки CMSIS;
  • ПКМ на inc → Add Files. Добавляем файлы из папки inc;
  • ПКМ на startup → Add Files. Добавляем файлы из папки startup;
  • ПКМ на lib → Add Files. ну вы поняли 🙂

В результате должно получиться такое дерево:

Теперь нужно настроить CMSIS, выбрать камушек и прописать пути:

  • ПКМ на корень дерева → Options. , откроется окно настроек:

  • General Options → вкладка Target → опция Device → кнопка справа → ST → STM32F030 → ST STM32F030×6;
  • General Options →вкладкаLibrary Configuration →галкаUse CMSIS;
  • C/C++ Compiler →вкладкаPreprocessor. В поле Additional include directories добавляем две строки «.inc» и «..inc» (без кавычек);
  • Output Converter →вкладкаOutput →галкаGenerate additional output → Output format: binary;

Теперь нажимаем OK. На этом подготовка платформы закончена. Копируем в правое окно простейший код:

И пытаемся скомпилировать: F7. Если вы все сделали правильно, должно скомпилироваться без ошибок. Однако, информация по дефолту скудная: непонятно, сколько наш код весит и сколько оперативки потребляет. А с учетом наших ограничений, вопрос не праздный, потому жмем ПКМ → Options. ну и так далее, на картинке все видно:

Да-да, вы все правильно поняли: наш «ничего не делающий код» занимает 712 байт флеша (readonly code memory) и килобайт оперативки (readwrite code memory)! Ужас, будь это авр, мы бы удавились с такой расточительности :)) Но у нас не авр, так что давайте приступим к программированию. хотя. стойте, а что программировать-то будем.

Reverse engineering STM32 firmware

MCU manufacturers usually provide protection of the non-volatile memory from read-out by debugging probes. At first glance, the main problem of cloning the firmware of the device is solved.

However, having obtained unencrypted firmware one can analyze the workflow of the code, and even change it as they wish.

For example, take BlackPill board with STM32 MCU and a small firmware that checks the secret key (transmitted via UART) and either blocks the device (lines 30–37) or performs the basic functionality — sends ADC measurements every second via USB.

The full project code written in C for System Workbench for STM32 is located here.

0x00 Firmware dump

The first step is to get a device memory dump. This can be achieved either by downloading firmware updates from the official website or by reading the flash memory of the device itself.

The following OpenOCD command downloads the first 32kB of the device flash memory.

Try changing the command in a way, so that you download all 64kB of BlackPill’s flash memory. By the way, there is actually 128kB present and the programmed limit of 64kB can be bypassed 😉

0x01 Quick analysis

A quick analysis will give us an understanding:

  • is the flash content encrypted?
  • which string literals are present in the firmware?

Any of the following tools can do the job for us: strings, binwalk, https://binvis.io.

File visualization allows you to evaluate the entropy of different parts of the file and to detect the presence of text information. Use https://binvis.io/ and download firmware.bin for visual analysis.

0x02 Disassembly

We will use radare2 as a disassembler. ARM Cortex-M uses the Thumb instruction set. From the official ARM documentation:

The Thumb instruction set is a subset of the most commonly used 32-bit ARM instructions. Thumb instructions are each 16 bits long and have a corresponding 32-bit ARM instruction that has the same effect on the processor model. Thumb instructions work with the standard ARM register configuration, allowing excellent interoperability between ARM and Thumb states.

On execution, 16-bit Thumb instructions are transparently decompressed to full 32-bit ARM instructions in real time, without performance loss.

Thumb code is typically 65% ​​of the size of the ARM code and provides 160% of the performance of the ARM code when running from a 16-bit memory system.

In other words, the instructions are 16-bit and are expanded to 32-bit in hardware.

Let’s recall what the function calls and conditional transitions in ARM look like:

As we see two instructions are used to organize conditions and loops:
cbnz (compare, branch on non-zero),
cbz (compare, branch to zero).

Entry point
For stm32f1xx MCUs the documentation provides the following information on workflow and code entry point:

The point from which the execution begins — is the ResetHandler. In the interrupt vector, there is a 0x04 shift from the beginning of the flash (ResetHandler @ 0x0800 0004).

Talk is cheap. Show me the code!

Here we launch radare2 specifying the ARM architecture with the instruction set to be 16-bit, set start address offset to 0x08000000, enable firmware editing and binary file path.

aaa command is used to analyze calls, jumps, and symbols and give them auto-generated names.

pd 32 command outputs 32 commands starting from the current offset. It is indicated to the left of the cursor (0x08000000 in yellow, so it is at the beginning of the file).

Let’s analyze ResetHandler. We shift to 0x08003ac4 and output disassembly:

Immediately we see 3 function calls ( bl fcn.08003xxx). Which are these functions? Let’s look at the project file /startup/startup_stm32f103xb.s and find the matches.

Three function calls are SystemInit (clock setup and flash initialization), libc_init and main. Let’s go to main and output the function listing:

In the beginning, the call address is stored and space for the local variables are allocated on the stack (it grows downwards, so the stack pointer simply subtracts the required number of bytes).

Next up are function calls that initialize different peripherals. After that, two loops are located with a conditional jump to one of them. It’s easier to inspect them by rendering the transition graph:

Читайте также  Изготовление и ввод в эксплуатацию электронных систем

If r0 register has a non-zero value after calling 33a4 function, the flow will go to the right. Hence, if r0 has zero value — the left branch is executed.

0x03 Patch

On the left, the pointer to something (aav.0x08004430) is loaded into the registry r0. Let’s see what is there. We output 32 values ​​starting at address aav.0x08004430:

So, going to the left branch of the graph, we fall into the loop that blocks the device. We need to change the conditional jump.

There are two options:

  • invert it ( cbnz -> cbz )
  • replace it with an unconditional jump to the address 0x80034c8 (location of main code that does ADC measurements, etc.)

An unconditional jump will make the firmware pass the check regardless of the condition, and the inversion — will work only in the absence of a key.

We will place an unconditional jump instead of cbnz :

wa command writes the opcodes corresponding to the assembly line “b 0x80034c8” at the offset 0x080034ac.

0x04 Upload & test

Let’s upload the modified firmware to the device and make sure it works.

0x05 DIY

The key check function can be called from different locations in the firmware. It is, therefore, more efficient to patch the isUnlocked function so that it returns a non-zero value regardless of the key being present. Try that yourself

Iar и stm32 cortex m0. часть 0x01. подготовка платформы iar

1. ПОНЯТИЕ И СОСТАВ ПРОЕКТА В IAR Electronic Workbench for ARM

Как и в любой другой IDE, проект в IAR EWARM содержит в себе всю информацию, необходимую для создания пользовательской программы или библиотеки, в т. ч.:

описание взаимосвязей подключаемых файлов.

.asm или .s Исходные тексты в кодах Ассемблера. Файлы используется при компиляции (ассемблировании) и компоновке. .eww Файл конфигурации рабочей области (Workspace). .ewp Файл, содержащий информацию о проекте. .c* Исходные тексты программ на языке C/C++. Компилируются и компонуются. .dep Файл с информацией о связях между составляющими проекта. .h Заголовочные файлы, включаемые в проект. Содержат определения структур (регистровых файлов) и различных пользовательских констант. .o* или .lib Объектные или библиотечные файлы. Могут быть использованы только на этапе компоновки. Другое Файлы, не включаемые в проект по умолчанию.

1.2. Рабочая область проектов (Workspace)

2. СОЗДАНИЕ ПРОЕКТА

2.1. Создание проекта

[ File] > New > Workspace.

Для создания проекта:

[Project] > Creat New Project.

2.2. Настройка проекта

[Project] > Options (Alt+F7)

Вид диалогового окна настройки опций проекта показан на рис. 2.

2.2.1. Category > General Option (Основные опции)

Опции вкладки Target

Опции вкладки Output

[Output directories]. Выбор путей (директорий) для размещения выходных файлов.

Опции вкладки Library Configuration

Опции вкладки Library options (опции стандартной библиотеки языка С)

Опции вкладок MISRA-C: 2004 / MISRA-C: 1998

2.2.2. Category > C/C++ Compiler

Опции вкладки Language

Опции вкладки Code

Опции вкладки Optimizations

Опции вкладки Output

Опции вкладки List

Опции вкладки Preprocessor

…; строки тестового кода

Опции вкладки Diagnostics

2.2.3. Category > Assembler

Опции вкладки Language

Управление генерацией ассемблерного кода.

Опции вкладки Output

Опции вкладки List

#included text Подключение файлов в list-файл через директиву #include Macro definitions Включение макросов в list-файл Macro expansions Включение макрорасширений в list-файл Macro execution info Вывод информации при каждом вызове исполнении макроса Assembled lines only Исключениеиз list-файла «неассемблируемых» строк из ассемблерных секций Multiline code Вывод кода, генерируемого через директивы, в несколько строк (при необходимости)

Опции вкладки Preprocessor

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

Опции вкладки Extra Options

[Use command line options]. В поле можно определить дополнительные аргументы командной строки.

STM32 Переходим с Arduino на Stm32. Шаг за шагом.

  • Форумы
  • Мастерская
  • Программирование

Волков Олег

Переходим с Arduino на Stm32. Шаг за шагом.

Привет друзья!
Решил выпустить небольшую серию видеоуроков о переходе с платформы Arduino на STM32.
Скажу сразу — я не профессионал. Я так же учусь. Надеюсь мои разборы хоть кому-то будут полезны
Данный курс нацелен больше на новичков. Тех, кто только-только начинают осваивать 32-битные МК от STMicroelectronics. Если есть чего предложить, показать — милости просим к нам в команду.

Ссылки:

  • Группа ВК
  • Канал YouTube
  • GitHub

Уроки и практические занятия будут дополняться со временем

Список уроков:

SieOK

Переходим с Arduino на Stm32. Шаг за шагом.

Привет друзья!
Решил выпустить небольшую серию видеоуроков о переходе с платформы Arduino на STM32.

Если есть чего предложить, показать — милости просим к нам в команду.

Эдуард Анисимов

Никогда не верьте этому чуваку.
Пиздобол 146%. Информации много, но качество говно. Особенно видосики. 20 минут жуёт сопли и 3 минуты полезной информации.
Остальные два ресурса заслуживают внимания.
Я все сайты с полезной информацией перегоняю в pdf. На этого чувака напоролся на самого первого. Но когда нашёл ресурсы
DiMoon
Microsin
Hamper
и т.д. я понял что человек фуфло и без сожаления стёр весь каталог с его уроками.

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

Волков Олег

@Эдуард Анисимов,
Да, на narod stream очень много чего лишнего и не по делу, особенно собирание проекта в total commander. Много ошибок и прочего.
Но я все равно ему очень благодарен, т.к. он дал мне огромный рывок для старта. Особенно его пояснения по языку C.
Да и вообще в целом, ничего плохого про него сказать не могу. Да, человек явно работает на количество контента, а не на качество. Но это его дело.
Тут уж кому что нравится, тот то и смотрит. Главное усвоить материал и уметь им пользоваться.

Для тех, кто только начинает переходить на Stm32, обычно советую:
Книгу: «Си для встраиваемых систем«.
Ну и курс этого же автора «Штурмуем STM32«.
По языку Си имею всегда под рукой книгу: «Си для программистов с введением в C11«

Эдуард Анисимов

Волков Олег

Эдуард Анисимов

Видел этот курс. У них защита от копирования. Только они не думали, что на бывшего веб программиста напорятся.

Это более менее систематизированная информация. https://yadi.sk/d/BTdrPwCa_7eDcg

Волков Олег

Видел этот курс. У них защита от копирования. Только они не думали, что на бывшего веб программиста напорятся.

Это более менее систематизированная информация. https://yadi.sk/d/BTdrPwCa_7eDcg

bort707

Судя по оглавлению, книжка выше — банальный букварь Си, в котором иногда (зачем-то?) упоминается стм32. Нафига за нее платить 15 баксов, мало в сети бесплатных учебников?

Если хочется реально разобраться в архитектуре СТМ — я вот такую книжку советую
Сarmine Noviello Mastering-stm32

Читайте также  Устройство записи с телефонной линии

Можно найти в инете бесплатно в ПДФ, если поискать.
А книжкам наших авторов я как-то не доверяю, на 90% это пиратские перевранные переводы иностранных книг. только еще с ошибками.
Лучше сразу оригинал читать.

Эдуард Анисимов

bort707

m_sav

Эдуард Анисимов

@m_sav, Так давайте здесь это замутим.
Алекс добро дал. Подраздел для STM выделил.
Когда полезные материалы разрастутся, можно будет и дальше думать.

А сделать материал 100% как по ардуино невозможно.
У одних только таймеров столько режимов, что одна их инициализация занимает много страниц во множественных талмудах.

Эдуард Анисимов

kostyamat

Эдуард Анисимов

kostyamat

@Эдуард Анисимов,
Да, действительно, сейчас работает. Ночью все, кроме главной, было 440.

Пс. Ваша подборка на я.диске кстати тоже куда-то делась.

Эдуард Анисимов

STM32

Эдуард Анисимов

В каталоге «Статьи» добавлен каталог :
Сенсорные кнопки.
Регистры периферии.

В разделе «книги» закачана книга «Кармин Новиелло — Освоение STM32» на русском.

Залит каталог «Схемы и прошивки для разных MCU.

Diman

Эдуард Анисимов

Подкинул файлов на диск.
Вот список.
СтатьиSPI STM32 SPI LCD — Вы всё делаете не так.pdf

Статьи_Прерывания Изменение вектора прерывания.pdf
Статьи_Прерывания Прерывания, события и NVIC.pdf
Статьи_Прерывания Прерывания в STM32. Регистры..pdf
Статьи_Прерывания Контроллер прерываний NVIC.pdf

СтатьиАвтор — Microsin STM32F4xx интерфейс SPI.pdf

Статьи_Память Проектирование стека и кучи в IAR.pdf
Статьи_Память Азы распределения памяти и кода.pdf

Статьи_Энергопотребление Оптимизация энергопотребления.pdf

Статьи_Программирование Передача массивов.odt

Статьи_Регистры периферии Регистры часов реального времени в микроконтроллерах STM32.pdf

Техническая документация STMОбщее AN2606 — STM32 microcontroller system memory boot mode.pdf
Техническая документация STMОбщее AN3070 — Managing the Driver Enable signal for RS-485.pdf
Техническая документация STMОбщее AN3155 — USART protocol used in the STM32 bootloader.pdf
Техническая документация STMОбщее AN3997 — Audio playback and recording using the STM32F4DISCOVERY.pdf
Техническая документация STMОбщее AN4076 — Two or three shunt resistor based current sensing circuit design in 3-phase inverters.pdf
Техническая документация STMОбщее AN4229 — How to implement a vocoder solution.pdf
Техническая документация STMОбщее AN4488 — Getting started with STM32F4xxxx MCU hardware development.pdf
Техническая документация STMОбщее AN4838 — Managing memory protection unit in STM32 MCUs.pdf
Техническая документация STMОбщее AN4989 — STM32 microcontroller debug toolbox.pdf
Техническая документация STMОбщее AN5020 — Digital camera interface (DCMI).pdf
Техническая документация STMОбщее AN5027 — Interfacing PDM digital microphones.pdf
Техническая документация STMОбщее AN5225 — USB Type-C Power Delivery.pdf

Техническая документация STMДаташиты на Русском STM32F4xx — Datasheet.pdf

Техническая документация STMCortex-M3 STM32F10xx RM0008 — STM32F10xx RU.pdf
Техническая документация STMCortex-M4 STM32F3xx_F4xx RM0090 — STM32F4xx — RU.pdf

Книги Принципы программирования микроконтроллера STM32F407VGT6 d среде Keil.pdf
Книги STM32 — Внутреннее устройство.pdf

Из вкусного: Референс мануалы на серию 32F1xx и 32F4xx на русском языке.
Вся документация, кроме файлов с названиями на английском языке, переводы. Где то авторские, где то в свободной форме.