Формат hex файла stm32

Обновлено: 07.07.2024

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

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

Не на много сложнее оказалось и решение проблемы с пустыми местами. В *.hex файлы решили писать не всё подряд, а только полезные данные (т.е. пустые места бинарника решили не писать). Но в этом случае нужно было кроме самих данных ещё и как-то указывать адреса, по которым эти данные расположены. Окей, стали писать ещё и адреса.

Записи бывают следующих типов:

  • Data Record (данные); для всех форматов данных
  • End of File Record (конец файла); для всех форматов данных
  • Extended Segment Address Record (расширенный адрес сегмента); для 16- или 32-битного форматов данных
  • Start Segment Address Record (начальный адрес сегмента); для 16- или 32-битного форматов данных
  • Extended Linear Address Record (расширенный линейный адрес); только 32-битного формата данных
  • Start Linear Address Record (начальный линейный адрес); только для 32-битного формата данных

Все записи имеют следующий формат:

В данном случае:

А теперь о некоторых типах записей подробнее:

Эта запись используется в 32-битных прошивках для определения битов 16-31 линейного базового адреса (LBA), при этом биты 0-15 равны нулю. Сами биты 16-31 называются верхним базовым адресом (ULBA).

Абсолютное значение адреса байта данных в памяти получается добавлением LBA к смещению, вычисленному сложением поля LOAD OFFSET в последующих записях данных и индекса байта в поле DATA этих записей. Все суммирования делаются по модулю 4G, таким образом мы получаем циклический (от FFFFFFFFh происходит переход к 00000000h) 4-х гигабитный (4G=2 32 ) линейный адрес (Linear Address).

ByteAddr=(LBA+DRLO+DRI) mod 4G, где

Эта запись используется для определения битов 4-19 базового адреса сегмента (SBA), при этом биты 0-3 равны нулю. Сами биты 4-19 называются верхним адресом сегмента (USBA).

Абсолютное значение адреса байта данных в памяти получается добавлением SBA к смещению, вычисленному сложением поля LOAD OFFSET в последующих записях данных и индекса байта в поле DATA этих записей. Сложение LOAD OFFSET и индекса выполняется по модулю 64K, таким образом мы получаем циклический (от смещения FFFFh происходит переход к 0000h) 64-х килобитный (64K=2 16 ) адрес в заданном сегменте.

ByteAddr=SBA+[(DRLO+DRI) mod 64K], где

Эта запись используется для указания адреса, с которого начинается исполнение объектного файла. Значение поля EIP определяет адрес, который заносится в регистр EIP процессора. Отметим, что эта запись определяет только адрес точки старта кода в пределах 32-х битного линейного адресного пространства защищённого режима процессора 80386. В реальном режиме для определения точки старта должна использоваться запись Start Segment Address Record, поскольку она описывает содержимое пары регистров CS:IP, необходимое для реального режима.

Эта запись используется для указания адреса, с которого начинается исполнение объектного файла. Значение поля CS:IP определяет 20-ти битный адрес, заносимый в регистры CS:IP процессора. Отметим, что эта запись определяет только адрес входа в 20-ти битном сегментированном адресном пространстве процессоров 8086/80186.

Когда дописывал прошлую статью, на радиокоте наткнулся на тему где обсуждали в каком формате передавать прошивку бутлоадеру. У меня тоже возникал такой вопрос и в конце прошлой статьи описал почему передавать прошивку удобнее hex файлом, чем бинарником, кому интересно могут почитать тут.

Значит так, нам надо рассмотреть какие бывают типы записей в hex файле и дополнить код из прошлой статьи. Все описанное ниже справедливо для KEIL и по сути является вольным переводом этой статьи.

Keil генерирует прошивку в формате Intel HEX, в нём хранится шестнадцатеричное представление двоичного файла закодировано с помощью цифробуквенных символов ASCII. В файле с расширением hex может быть любой количество записей, каждая из которых имеет следующий формат:

  • : начало записи
  • ll количество данных dd в записи
  • aaaa адрес начала записи
  • tt тип записи:
  • dd — данные которые пишутся в память МК
  • сc — чек сумма

Запись с данными.

- 10 количество байт в записи
- 2462 адрес, начала записи
- 00 тип записи
- 464C. 464C данные
- 33 чек сумма записи
Напомню, что данные в hex файле хранятся в шестнадцатеричном представлении и количество байт в записи равняется 16, а не 10 как можно было бы подумать 0x10 = 16. Это относится ко всем остальным полям.

Последняя запись в файле.

- 00 количество байт в записи
- 0000 в данной записи это поле игнорируется.
- 01 тип записи
- FC чек сумма записи рассчитывается как
01h + NOT(00h + 00h + 00h + 01h).
Файл формата Intel HEX должен заканчиваться записью такого типа.

Дополнительный адрес.(HEX386)

- 02 количество байт в записи
- 0000 адресное поле, для данного типа записи всегда равно 0000
- 04 тип записи
- FFFF старшие 16 бит адреса
- FC чек сумма записи рассчитывается как
01h + NOT(02h + 00h + 00h + 04h + FFh + FFh).

Дело в том, что в записи с данными указывается только 16 бит адреса, например 0x2462, а адресное пространство у нас 32-битное. Получается для записи полного адреса не хватает ещё 16 бит, которые как раз и содержатся в этой записи. Для вычисления полного адреса, по которому будут писаться данные, надо адрес из этой записи сдвинуть на 16 бит влево и прибавить к нему адрес указанный в записи с данными.

Оставшиеся два типа записей нам не понадобятся. Запись типа 02 вообще не встретил в своем хексе, она используется в формате HEX86, а у нас, судя по всему, HEX386(чем они отличаются не разбирался). А запись типа 05(адрес начала приложения, а именно функции main) включает в себя 32-битный адрес и может находиться где угодно, а главное, она не несет полезной информации для записи флэш памяти, то есть её можно игнорировать, так написано в документации.

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

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

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

Давайте сначала проанализируем операцию «Метод один» подробно:

1. Мы устанавливаем компилятор компилятора (как показано на рисунке), этот параметр означает загрузку программы в начало вспышки 0x0800 0000, а затем компилируйте программу



2. После составления предшествующего предыдущего найдите файл .hex после составления после вывода папки каталога проекта;

Откройте программу с Notepad ++ или UltraeDit. Hex-файл

Формат Hex файла:

(1) Возьмите толстую кишку с линией поведения, все из которых 16 Введите код (в ASCII Дисплей кода)

(2) В файле Hex каждая строка представляет запись. Основной формат записи:

двоеточие Длина банка данных Адрес запуска данных банка Тип данных данные Проверьте код
1 byte 2 bytes 1 byte n byte 1 byte

Первый байт Представляет длину банка;

Во-вторых, три байта представляют собой начальный адрес банка данных;

Четвертое представление байта Тип данных Тип данных: 0x00 、 0x01 、 0x02 、 0x03 、 0x04 、 0x05 。

'00' Data Rrecord : Используется для записи данных, HEX Большинство записей файлов являются записями данных

'01' End of File Record: Используется для определения файлов, окончательного, идентификации файлов HEX Конец неудачи

'02' Extended Segment Address Record: Записи, используемые для определения адреса расширения

'03' Start Segment Address Record: Запустите сегмент адрес записи

'04' Extended Linear Address Record: Записи, используемые для определения расширенных линейных адресов

'05' Start Linear Address Record: Начать линейную запись адреса

Тогда есть данные, последний байт Для контрольной суммы.

Алгоритм контрольной суммы: расчет Проверьте и проверить Все доступно 16 Ухождение кода накопление и ( Включать в себя ) , Осмотр и = 0x100 - Накапливаться

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



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

    Справочники и руководства которые нужны для работы 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:



Жмем 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 и дальше ни в какую не идет.

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


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

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

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

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

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

Всем привет, подскажите, как настроить STM32CubeIDE для генерации hex файла?

Привет, в настройках проекта:

Project -> Properties -> C/C++ Build -> Settings -> Tools Settings -> MCU Post build outputs -> Convert to Intel Hex file (-O ihex)

Доберусь до компьютера, добавлю скриншот.

hex

В данный момент смотрят эту тему 1 гость.

Иконки тем : Не отвечен Отвеченный Активный Актуально Закреплено Неодобренно Решено Приватный Закрыто

Vkontakte

Twitter

SignIn

SignUp

Язык сайта

Рубрики

Свежие записи

Свежие комментарии

  • Эндрю к записи Микроконтроллер AVR и GPIO. Порты ввода-вывода.
  • Сергей к записи Последовательное и параллельное соединение резисторов.
  • Aveal к записи Фильтр Калмана. Алгоритм фильтрации данных.
  • Владимир к записи Фильтр Калмана. Алгоритм фильтрации данных.
  • Aveal к записи Raspberry Pi и Qt. Кросс-компиляция Qt и установка Qt Creator.

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

Strictly Necessary Cookie should be enabled at all times so that we can save your preferences for cookie settings.

Читайте также: