Название: [РЕШЕНО]Qt Creator + stm32 Отправлено: Larry от Февраля 16, 2017, 09:52 Добрый день, форумчане.
Возникли вопросы по скрещиванию Qt Creator и stm32. Взял пример с хабра: https://habrahabr.ru/post/222877/ (https://habrahabr.ru/post/222877/) Проект собрался, но файл .elf вышел ~475kb ??? Кроме того постоянно выдает warning "Property 'linkerScripts' is not declared"...Куда он делся из модуля cpp? Помогите пожалуйста разобраться. Хотелось бы заменить IDE на Qt Creator для работы с микроконтроллерами, т.к. после креатора остальные IDE не камильфо. Спасибо. Название: Re: Qt Creator + stm32 Отправлено: kuzulis от Февраля 16, 2017, 12:02 Цитировать но файл .elf вышел ~475kb И что? Вы думаете что к этому причастен Qt Creator? Я вот думаю, что это не так, смотрите опции линковки и компиляции. Цитировать Куда он делся из модуля cpp? Вроде никуда не девался. Название: Re: Qt Creator + stm32 Отправлено: Larry от Февраля 16, 2017, 12:11 Цитировать Куда он делся из модуля cpp? Цитировать Вроде никуда не девался. Тогда почему появляется предупреждение, что не найдено это свойство?опции вот: Код: cpp.commonCompilerFlags: [ "-mcpu=cortex-m4", "-mthumb", "-mfpu=fpv4-sp-d16", "-mfloat-abi=softfp" ] cpp.linkerFlags: [ "-mcpu=cortex-m4", "-mthumb", "-mfpu=fpv4-sp-d16", "-mfloat-abi=softfp", ] Название: Re: Qt Creator + stm32 Отправлено: Larry от Февраля 16, 2017, 16:07 Проверил .elf в CooCox и Embitz, то действительно файл выходит больших размеров - значит это норма.
Собрал свой проект с qbs - зажигаю сегмент семисегментника, но в линковке выкидывает ошибки: Код: In function `zero_loop': <artificial>:(.text+0x4e0): undefined reference to `_sidata' <artificial>:(.text+0x4e4): undefined reference to `_sdata' <artificial>:(.text+0x4e8): undefined reference to `_edata' Код: In function `Default_Handler': <artificial>:(.text+0x4f4): undefined reference to `_sbss' <artificial>:(.text+0x4f8): undefined reference to `_ebss' Проверил в стартап объявлены...Что может быть? Вот qbs: Код: import qbs Project { name: "qbs" Product { type: "application" Depends { name: "cpp" } cpp.executableSuffix: ".elf" cpp.defines: "STM32F10X_LD_VL" cpp.positionIndependentCode: false cpp.debugInformation: true cpp.commonCompilerFlags: [ "-mthumb", "-mcpu=cortex-m3", "-msoft-float", "-mfpu=vfp", "-O0", "-fdata-sections", "-ffunction-sections", "-fno-inline", // "-std=c++11", "-flto" ] cpp.linkerFlags: [ "-flto", "-mthumb", "-mcpu=cortex-m3", "-msoft-float", "-mfpu=vfp", "-specs=nano.specs", "-Wl,--start-group", "-T" + path + "/src/linker/stm32f100c4_flash.ld", "-lnosys", "-lc", "-lstdc++", "-lm" ] cpp.includePaths: [ "src", "src/cmsis", "src/inc", "src/linker", "src/startup" ] files: [ "*.cpp", "src/cmsis/*.c", "src/cmsis/*.h", "src/inc/*.c", "src/inc/*.h", "src/startup/*.c" ] Properties { condition: qbs.buildVariant === "debug" cpp.defines: outer.concat(["DEBUG=1"]) } Group { qbs.install: true fileTagsFilter: "application" } } } Название: Re: Qt Creator + stm32 Отправлено: kuzulis от Февраля 16, 2017, 18:19 Цитировать Тогда почему появляется предупреждение, что не найдено это свойство? Ах, не, кажется, теперь просто можно указывать ld скрипты как обычные файлы в списке (как исходники, заголовочные и прочее). UPD: Или все-таки указывать теги скриптов явно Код: Group { name: "linker scripts" files: ["linkerscript1", "linkerscript2"] fileTags: ["linkerscript"] } см. сорцы QBS: qbs\tests\auto\blackbox\testdata\linkerscripts\ Название: Re: Qt Creator + stm32 Отправлено: Larry от Февраля 16, 2017, 18:33 Спасибо большое.
.elf теперь собирается. Перегнал его в .hex, но пока не заработала прошивка :)...буду дальше разбираться. Название: Re: Qt Creator + stm32 Отправлено: Larry от Февраля 17, 2017, 15:06 Так и не получил рабочую прошивку...
Собрал в EmBitz, то все работает (загорается сегмент семисегментника). Размер прошивки ~4kb. Собрал в Qt Creator, то размер прошивки 9kb, но после заливки не хочет работать. GDB пока не прикрутил, поэтому посмотреть, где затык не могу. Вложил проект...может есть ли у кого возможность проверить у себя :) Спасибо. P.S.: грешу все на тот же файл линковки.. Название: Re: Qt Creator + stm32 Отправлено: Larry от Февраля 18, 2017, 09:02 Скачал проект для микроконтроллеров Миландра, то все собралось без проблем...не было ошибок и предупреждений...
По тому же скрипту (там как раз cortex-m3) собираю для stm32 и получаю кучу ошибок (вчера самостоятельно писал по мануалам qbs без использования модуля срр и получал те же ошибки) ???. Уже не знаю куда копать...перечитал уже все статьи по этой теме (у всех получается) и использую их скрипты переделанные под свою структуру проекта и постоянно, то прошивка не работает в камне, либо ошибки... Вот qbs-скрипт (без использования модуля срр): Код: import qbs Project { name: "simple" Product { name: "micro" type: "hex" Group { name: "sources" files: ["*.c", "*.h", "*.S"] fileTags: ['c'] } Rule { inputs: ["c"] Artifact { fileTags: ['obj'] filePath: input.fileName + '.o' } prepare: { var args = []; args.push("-mcpu=cortex-m3") args.push("-mthumb") args.push("-g") args.push("-ffunction-sections") args.push("-O0") args.push("-Wall") args.push("-Wunused") args.push("-DM3") args.push('-c'); args.push(input.filePath); args.push('-o'); args.push(output.filePath); var compilerPath = "c:/development/gcc-arm/bin/arm-none-eabi-gcc.exe" var cmd = new Command(compilerPath, args); cmd.description = 'compiling ' + input.fileName; cmd.highlight = 'compiler'; cmd.silent = false; return cmd; } } Rule{ multiplex: true inputs: ['obj'] Artifact{ fileTags:['elf'] filePath: project.name + '.elf' } prepare:{ var args = [] args.push("-mcpu=cortex-m3") args.push("-mthumb") args.push("-g") args.push("-nostartfiles") args.push("-O0") args.push("-Wl,--gc-sections") for(i in inputs['obj']) args.push(inputs["obj"][i].filePath); args.push("-Td:/work/workspace/uc/qbs_c/stm32f10x_flash.ld") args.push('-o'); args.push(output.filePath); var compilerPath = "c:/development/gcc-arm/bin/arm-none-eabi-gcc.exe" var cmd = new Command(compilerPath,args); cmd.description = "linking"+project.name return cmd; } } Rule{ inputs: ['elf'] Artifact{ fileTags:['hex'] filePath: project.name + '.hex' } prepare:{ var args = [] args.push("-O") args.push("ihex") args.push(input.filePath) args.push(output.filePath) var hexcreator = "c:/development/gcc-arm/bin/arm-none-eabi-objcopy.exe" var cmd = new Command(hexcreator,args); cmd.description = 'create_hex'+project.name return cmd; } } } } Ошибки которые вылазят: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'void' __attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_irq(void) error: expected '=', ',', ';', 'asm' or '__attribute__' before 'void' __attribute__( ( always_inline ) ) __STATIC_INLINE void __disable_irq(void) error: unknown type name '__STATIC_INLINE' __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_CONTROL(void) и в том же роде Название: Re: Qt Creator + stm32 Отправлено: GraninDm от Февраля 18, 2017, 10:24 А вот тут не смотрели
https://habrahabr.ru/post/258467/ (https://habrahabr.ru/post/258467/) Я по этой статье пытался на днях сделать компиляцию для ардуино. Пока тоже не получилось. Валятся ошибки... И еще, как вариант Вот для того Код: inputs: ['elf'] Наверное лучше использовать Transformer, а не RuleArtifact{ fileTags:['hex'] filePath: project.name + '.hex' } Цитата Transformer предназначен для срабатывания только на один фаил, с заранее определенным именем. Например, прошивальщик или какой-нибудь хитрый скрипт. Название: Re: Qt Creator + stm32 Отправлено: Larry от Февраля 18, 2017, 10:37 Да по этому тоже смотрел и делал :)
Можно попробовать и через Trasformer, но думаю не в этом дело, но как вариант. Если использовать модуль срр, то все собирается, но в камне не работает. Название: Re: Qt Creator + stm32 Отправлено: Larry от Февраля 18, 2017, 11:32 подключил отладчик, но при запуске зависает на строке
.long TIM1_UP_TIM16_IRQHandler // TIM1 Update and TIM16 в стартапе, и просто висит Название: Re: Qt Creator + stm32 Отправлено: kuzulis от Февраля 18, 2017, 17:32 У меня вообще не получилось сейчас запустить отладку, используя QtCreator с OpenOCD в режимах Startup Mode или "PIPE" или "TCP/IP".
Работает только отладка если ручками запустить OpenOCD сервер, а Startup Mode установить в "None". Что-то опять поломали :-[.. Никто это не тестит, т.к. никому не нужно Bare Metal, поэтому и возникают такие плюхи. PS: Я пробовал проект https://github.com/alekseysidorov/te-stm32f407-qbs-template Название: Re: Qt Creator + stm32 Отправлено: Larry от Февраля 18, 2017, 19:54 Видать поломали, т.к. где-то читал, что всплывали такие же ошибки как у меня в новых версиях. Хотя собирал один из примеров, но для микроконтроллера Миландр, то собрался вообще без проблем. Я сейчас читаю доки по qbs, может че-нить вычитаю ;D
Есть еще предположение: я использую С++. Может в этом проблема?! Буду пробовать, т.к. Qt Creator мне очень удобен. Название: Re: Qt Creator + stm32 Отправлено: 987654 от Февраля 19, 2017, 15:28 Приветствую.
У меня платка l1, однако возможно вам помочь получится. как вариант 1) сдувайте прокат libopencm3 + libopencm3 examples компилятором прогоняйте и то и другое. Затем в папке с нужным вам тестовым бинарником делайте Код: arm-none-eabi-objcopy -Obinary name.elf name.bin Как вариант можно сразу запустить построение бинарников с "make bin" для примеров2) Есть такой проект "stm32l152-discovery-qbs-cubemx-master" В qbs нужно будет заменить строку Код: // cpp.linkerScripts: [ а итоговый выходной файл так же прогнать через arm-none-eabi-objcopy// //"../TrueSTUDIO/F1032/libs.ld", // ] #на строку Group { name: "linker scripts" files: ["../STM32L152RB_FLASH.ld",] fileTags: ["linkerscript"] } Может быть второй вариант потребует небольшие переделки от вас. 3) Тот которым работал изначально - это использовать 1 вариант + редактирование проекта в папке с примерами ( то есть в libopencm3 examples ) + ручные параметры сборки ( shell скрипт ) Название: Re: Qt Creator + stm32 Отправлено: Larry от Февраля 19, 2017, 16:31 Спасибо большое. Гляну, может что и получится.
Название: Re: Qt Creator + stm32 Отправлено: kuzulis от Февраля 19, 2017, 16:48 Я представил патч для криэйтора, исправляющий запуск OpenOCD в Windows в режиме TCP/IP: https://bugreports.qt.io/browse/QTCREATORBUG-17765
У меня вроде работает, но посмотрим что скажут. UPD: О, и режим PIPE заработал, см. QTCREATORBUG-17765 Название: Re: Qt Creator + stm32 Отправлено: Larry от Февраля 19, 2017, 16:53 Спасибо большое за информацию.
Название: Re: Qt Creator + stm32 Отправлено: GraninDm от Февраля 21, 2017, 09:52 Подскажите, почему у меня такое происходит
Взял за основу проект выше Код: import qbs Project { name: "simple" Product { name: "micro" type: "obj" Group { name: "sources" files: ["*.c", "*.h", "*.S"] fileTags: ['c'] } Rule { inputs: ["c"] Artifact { fileTags: ['obj'] filePath: input.fileName + '.o' } prepare: { var args = []; args.push("-g") args.push("-Os") args.push("-w") args.push("-fno-exceptions") args.push("-ffunction-sections") args.push("-fdata-sections") args.push("-MMD") args.push("-mmcu=atmega328p") args.push("-DF_CPU=16000000L") args.push("-DARDUINO=152") args.push("-IC:/Programs/arduino/hardware/arduino/avr/cores/arduino") args.push("-IC:/Programs/arduino/hardware/arduino/avr/variants/standard") args.push("-c") args.push(input.fileName) args.push("-o") args.push(input.fileName + ".o") var compilerPath = "C:/Programs/arduino/hardware/tools/avr/bin/avr-g++.exe" var cmd = new Command(compilerPath, args); cmd.description = 'compiling ' + input.fileName; cmd.highlight = 'compiler'; cmd.silent = false; return cmd; } } } } Получаю Код: compiling main.c Почему входных файлов нет?C:/Programs/arduino/hardware/tools/avr/bin/avr-g++.exe -g -Os -w -fno-exceptions -ffunction-sections -fdata-sections -MMD "-mmcu=atmega328p" "-DF_CPU=16000000L" "-DARDUINO=152" -IC:/Programs/arduino/hardware/arduino/avr/cores/arduino -IC:/Programs/arduino/hardware/arduino/avr/variants/standard -c main.c -o main.c.o avr-g++.exe: main.c: No such file or directory avr-g++.exe: no input files Файл main.c в командную строку подставляется, в проекте присутствует, в директории проекта есть. Что не так? Название: Re: Qt Creator + stm32 Отправлено: Larry от Февраля 21, 2017, 21:01 А где у Вас путь к исходникам?
Добавьте в группу prefix Код: Group { name: "sources" prefix: "src/**/" // или где там у Вас расположены исходники files: ["*.c", "*.h", "*.S"] fileTags: ['c'] } Название: Re: Qt Creator + stm32 Отправлено: GraninDm от Февраля 22, 2017, 09:35 Сегодня почему-то заработало.
Хотя ничего не менял. Видимо, пока экспериментировал вчера у Creator текущий путь сбился. Название: Re: Qt Creator + stm32 Отправлено: Larry от Февраля 22, 2017, 13:47 Только объектные файлы скомпилились? Или Вы добавляли правила и на создание .elf?
Вопрос: я использую компилятор arm-none-eabi-g++ для всех файлов, все компилирутся...может это не правильно и ядро core_cm3 и system_<device> надо компилить gcc? Название: Re: Qt Creator + stm32 Отправлено: GraninDm от Февраля 22, 2017, 14:59 Только один obj
Я посмотрел как avr собирается... Что-то грустно стало. Правда сейчас можно стало arduino.exe c параметрами запускать. Экзешник сам все сделает и зальет в плату если нужно. Единственное - у меня не получилось, чтобы он консоль процесс сборки выводил. Вроде есть парамерт --verbose-build, но он ничего в консоль не выводит. Название: Re: Qt Creator + stm32 Отправлено: Larry от Февраля 22, 2017, 20:24 а у меня до сих пор никак не получается сладить с линкером...кучу ошибок выдает...
Название: Re: Qt Creator + stm32 Отправлено: Larry от Февраля 23, 2017, 23:11 Переписал все заново без использования cpp-модуля, и сделал раздельную компиляцию для исходников си, c++ и asm. Все компилится, но собрать с помощью линкера arm-none-eabi-ld, делал через arm-none-eabi-gcc...при заливке в камень, снова молчит...уже не знаю куда копать...пните пожалуйста в нужном направлении...
Код: import qbs Project { name: "stm32" Product { type: ["hex", "bin"] property string c_compilerPath: "c:/development/gcc-arm/bin/arm-none-eabi-gcc.exe" property string cpp_compilerPath: "c:/development/gcc-arm/bin/arm-none-eabi-g++.exe" property string asm_compilerPath: "c:/development/gcc-arm/bin/arm-none-eabi-as.exe" property string linkerPath: "c:/development/gcc-arm/bin/arm-none-eabi-ld.exe" property string objcpyPath: "c:/development/gcc-arm/bin/arm-none-eabi-objcopy.exe" Group { name: "source_cpp" prefix: "./" files: ["*.cpp"] fileTags: ["cpp"] } Group { name: "source_c" prefix: "./" files: ["*.c"] fileTags: ["c"] } Group { name: "source_asm" prefix: "./" files: ["*.s"] fileTags: ["asm"] } Rule { inputs: ["cpp"] Artifact { filePath: project.path + "/.obj/" + input.fileName + ".o" fileTags: ["obj"] } prepare: { var args = []; args.push("-mcpu=cortex-m3"); args.push("-mthumb"); args.push("-O0"); args.push("--specs=nosys.specs"); args.push("-finline-functions"); args.push("-ffunction-sections"); args.push("-fdata-sections"); args.push("-fno-exceptions"); args.push("-fno-unwind-tables"); args.push("-fno-asynchronous-unwind-tables"); args.push("-c"); args.push("-DSTM32F10X_LD_VL"); args.push(project.path + "/" + input.fileName); args.push("-o"); args.push(project.path + "/.obj/" + output.fileName); var cmd = new Command(product.cpp_compilerPath, args); cmd.description = "compiling: " + input.fileName; cmd.highlight = "compiler"; cmd.silent = false; return cmd; } } Rule { inputs: ["c"] Artifact { filePath: project.path + "/.obj/" + input.fileName + ".o" fileTags: ["obj"] } prepare: { var args = []; args.push("-mcpu=cortex-m3"); args.push("-mthumb"); args.push("-O0"); args.push("--specs=nosys.specs"); args.push("-finline-functions"); args.push("-ffunction-sections"); args.push("-fdata-sections"); args.push("-fno-exceptions"); args.push("-fno-unwind-tables"); args.push("-fno-asynchronous-unwind-tables"); args.push("-c"); args.push("-DSTM32F10X_LD_VL"); args.push(project.path + "/" + input.fileName); args.push("-o"); args.push(project.path + "/.obj/" + output.fileName); var cmd = new Command(product.c_compilerPath, args); cmd.description = "compiling: " + input.fileName; cmd.highlight = "compiler"; cmd.silent = false; return cmd; } } Rule { inputs: ["asm"] Artifact { filePath: project.path + "/.obj/" + input.fileName + ".o" fileTags: ["obj"] } prepare: { var args = []; args.push("-mcpu=cortex-m3"); args.push("-mthumb"); args.push("-c"); args.push(project.path + "/" + input.fileName); args.push("-o"); args.push(project.path + "/.obj/" + output.fileName); var cmd = new Command(product.asm_compilerPath, args); cmd.description = "compiling: " + input.fileName; cmd.highlight = "compiler"; cmd.silent = false; return cmd; } } Rule { multiplex: true inputs: ["obj"] Artifact { filePath: project.path + "/bin/" + project.name + ".elf"; fileTags: ["elf"] } prepare: { var args = []; args.push("-mcpu=cortex-m3"); args.push("-mthumb"); args.push("--specs=nosys.specs"); args.push("-finline-functions"); args.push("-ffunction-sections"); args.push("-fdata-sections"); args.push("-nostartfiles"); args.push("-fno-exceptions"); args.push("-fno-unwind-tables"); args.push("-fno-asynchronous-unwind-tables"); args.push("-T" + project.path + "/" + "stm32f10x_flash.ld"); for(i in inputs["obj"]) args.push(inputs["obj"][i].filePath); args.push("-o"); args.push(output.filePath); var cmd = new Command(product.c_compilerPath, args); cmd.description = "linking project: " + project.name; cmd.highlight = "linker"; cmd.silent = false; return cmd; } } Rule { inputs: ["elf"] Artifact { filePath: project.path + "/bin/" + project.name + ".hex"; fileTags: ["hex"] } prepare: { var args = []; args.push("-O"); args.push("ihex"); args.push(input.filePath); args.push(output.filePath); var cmd = new Command(product.objcpyPath, args); cmd.description = "convert to hex"; cmd.highlight = "codegen"; cmd.silent = false; return cmd; } } Rule { inputs: ["elf"] Artifact { filePath: project.path + "/bin/" + project.name + ".bin"; fileTags: ["bin"] } prepare: { var args = []; args.push("-O"); args.push("binary"); args.push(input.filePath); args.push(output.filePath); var cmd = new Command(product.objcpyPath, args); cmd.description = "convert to bin"; cmd.highlight = "codegen"; cmd.silent = false; return cmd; } } } } Название: Re: Qt Creator + stm32 Отправлено: 987654 от Февраля 26, 2017, 01:16 Приветствую!
Молчание камня достаточно часто происходило. Думается мне что проблема в ликере и в том что он цепляет. У меня сейчас есть исправленный qbs ( за основу взяты проекты местных умельцев ). выходной бинарник полностью работоспособный Вам нужно поправить мои флаги архитектуры на свои, вот на эти Код: FP_FLAGS ?= -mfloat-abi=hard -mfpu=fpv4-sp-d16 и заменить путь к скрипту, на путь к stm32f4-discovery.ld.ARCH_FLAGS = -mthumb -mcpu=cortex-m4 $(FP_FLAGS) я так думаю что после этого должно взлететь. Ниже то что у меня работает с stm32l152. Комменты откуда взят флаг приложил Код: import qbs import qbs.Environment Project { CppApplication { Depends { name: "cpp" } // Взято с форума type: "bin" name: "firmware" property string workDirectory: Environment.getEnv("FIRMWARES_WORKDIR") property string hexExtractor: cpp.toolchainInstallPath + "/" + cpp.toolchainPrefix + "objcopy"; cpp.cxxFlags: [ "-std=c++11", "-msoft-float", // берется из рутовой папки примеров из ( Makefile.include ) libopencm3/examples/stm32/l1/ "-mthumb", // берется из рутовой папки примеров из ( Makefile.include ) libopencm3/examples/stm32/l1/ "-mcpu=cortex-m3", // берется из рутовой папки примеров из ( Makefile.include ) libopencm3/examples/stm32/l1/ "-mfix-cortex-m3-ldrd", // берется из рутовой папки примеров из ( Makefile.include ) libopencm3/examples/stm32/l1/ "-extra", // главный Makefile в корне libopencm3 "-shadow", // главный Makefile в корне libopencm3 "-implicit-function-declaration", // главный Makefile в корне libopencm3 "-redundant-decls", // главный Makefile в корне libopencm3 "-missing-prototypes", // главный Makefile в корне libopencm3 "-strict-prototypes", // главный Makefile в корне libopencm3 "-fno-common", // главный Makefile в корне libopencm3 "-ffunction-sections", // главный Makefile в корне libopencm3 "-fdata-sections",] // главный Makefile в корне libopencm3 cpp.cFlags: [ "-std=gnu99", "-msoft-float", // берется из рутовой папки примеров из ( Makefile.include ) libopencm3/examples/stm32/l1/ "-mthumb", // берется из рутовой папки примеров из ( Makefile.include ) libopencm3/examples/stm32/l1/ "-mcpu=cortex-m3", // берется из рутовой папки примеров из ( Makefile.include ) libopencm3/examples/stm32/l1/ "-mfix-cortex-m3-ldrd", // берется из рутовой папки примеров из ( Makefile.include ) libopencm3/examples/stm32/l1/ "-extra", // главный Makefile в корне libopencm3 "-effc++", // главный Makefile в корне libopencm3 "-fno-common", // главный Makefile в корне libopencm3 "-ffunction-sections", // главный Makefile в корне libopencm3 "-fdata-sections" ] // главный Makefile в корне libopencm3 cpp.warningLevel: "all" cpp.linkerFlags: [ "-msoft-float", // берется из рутовой папки примеров из ( Makefile.include ) libopencm3/examples/stm32/l1/ "-mthumb", // берется из рутовой папки примеров из ( Makefile.include ) libopencm3/examples/stm32/l1/ "-mcpu=cortex-m3", // берется из рутовой папки примеров из ( Makefile.include ) libopencm3/examples/stm32/l1/ "-mfix-cortex-m3-ldrd", // берется из рутовой папки примеров из ( Makefile.include ) libopencm3/examples/stm32/l1/ "-lc", // главный Makefile в корне libopencm3 "-lgcc", // главный Makefile в корне libopencm3 "-lnosys", // главный Makefile в корне libopencm3 "-static", // главный Makefile в корне libopencm3 "-nostartfiles" // главный Makefile в корне libopencm3 ] cpp.includePaths: [ "../libopencm3/libopencm3/include/", ] cpp.libraryPaths: [ "../libopencm3/libopencm3/lib/", ] cpp.staticLibraries: [ "opencm3_stm32l1", "c", "gcc", "nosys" ] Group { name: "linker scripts" files: ["../libopencm3/libopencm3/lib/stm32/l1/stm32l15xxb.ld" ] // Берется из make файла в любом живом примере из libopencm3/examples/stm32/l1/stm32l-discovery/lcd-display/ fileTags: ["linkerscript"] } cpp.defines: [ "STM32L1" ] Group { name: "src" files: [ "src/*.c", "src/*.cpp", "src/*.h" ] } Group { qbs.install: true fileTagsFilter: ["application", "bin"] } Rule { id: hex inputs: ["application"] Artifact { fileTags: ['bin'] filePath: product.name + '.bin' } prepare: { var args = []; args.push("-j") args.push(".text") args.push("-j") args.push(".data") args.push("-O") args.push("binary") args.push(input.filePath); args.push(output.filePath); var extractorPath = product.hexExtractor; var cmd = new Command(extractorPath, args); return cmd; } } } } Название: Re: Qt Creator + stm32 Отправлено: alex312 от Февраля 26, 2017, 11:54 Приветствую! Советую обратить внимание на следующие свойства модуля cpp для уменьшения дублирования:Молчание камня достаточно часто происходило. Думается мне что проблема в ликере и в том что он цепляет. У меня сейчас есть исправленный qbs ( за основу взяты проекты местных умельцев ). выходной бинарник полностью работоспособный driverFlags commonCompilerFlags Пример: Код: ... cpp.commonCompilerFlags: ["-fdata-sections","-ffunction-sections", "-flto"] cpp.driverFlags:["-mthumb", "-mcpu=cortex-m4","-mfloat-abi=hard","-mfpu=fpv4-sp-d16"] Р.S. И в опциях линкера у вас не хватает --gc-sections Название: Re: Qt Creator + stm32 Отправлено: Larry от Февраля 26, 2017, 14:33 Да, спасибо, учту. Уже все работает, затык был в линкер-скрипте...брал из разных источников :), но добрые люди подсказали, теперь компилится и работает в железе нормально. Как причешу скрипт, то здесь помещу, чтобы самому не забыть :).
Название: Re: Qt Creator + stm32 Отправлено: Larry от Февраля 26, 2017, 15:05 А подскажите, кто знает, как в Qt creator сделать так, чтобы не было большого количества каталогов...типа такого:
\Debug\qtc_stm32f1x_02ef0d3e-debug\stm32.qtc-stm32f1x-02ef0d3e.956871f1\ Неудобно очень. Спасибо. Название: Re: Qt Creator + stm32 Отправлено: 987654 от Февраля 26, 2017, 20:34 Название: Re: Qt Creator + stm32 Отправлено: Larry от Февраля 27, 2017, 22:24 Как и собирался, выкладываю qbs-скрипт. Bin не генерил, только hex...и сразу заливает прошивку...Это так, чтобы самому не забыть :)
Единственное, что не нравится, то после прошивки выскакивает ошибка target state: halted, так и не понял почему... Код: import qbs Product { type: ["application", "flash"] Depends { name: "cpp" } cpp.defines: ["STM32F10X_LD_VL"] cpp.positionIndependentCode: false cpp.enableExceptions: false cpp.executableSuffix: ".elf" cpp.driverFlags: [ "-mthumb", "-mcpu=cortex-m3", "-mfloat-abi=soft", "-fno-strict-aliasing", "-g3", "-Wall", "-mfpu=vfp", "-O0", "-flto", ] cpp.commonCompilerFlags: [ "-fdata-sections", "-ffunction-sections", "-fno-inline", "-std=c++11", "-flto" ] cpp.linkerFlags: [ "--specs=nano.specs", "-Wl,--start-group", "-Wl,--gc-sections", "-T" + path + "/src/system/linker/stm32f10x_flash.ld", "-lnosys", "-lgcc", "-lc", "-lstdc++", "-lm" ] cpp.includePaths: [ "src/system/cmsis", "src/system/cmsis_boot", "src/system/cmsis_boot/statup" ] files: [ "src/system/cmsis/*.h", "src/system/cmsis/*.h", "src/system/cmsis_boot/*.h", "src/system/cmsis_boot/*.c", "src/system/cmsis_boot/startup/*.c", "src/main.cpp" ] Properties { condition: qbs.buildVariant === "debug" cpp.defines: outer.concat(["DEBUG=1"]) cpp.debugInformation: true cpp.optimization: "none" } Properties { condition: qbs.buildVariant === "release" cpp.debugInformation: false cpp.optimization: "small" } Rule { inputs: ["application"] Artifact { filePath: project.path + "/debug/bin/" + input.baseName + ".hex" fileTags: "flash" } prepare: { var sizePath = "c:/development/gcc-arm/bin/arm-none-eabi-size.exe"; var objcopyPath = "c:/development/gcc-arm/bin/arm-none-eabi-objcopy.exe"; var configStlinkPath = "c:/development/openocd_0_10_0/scripts/interface/stlink-v2.cfg"; var configStm32Path = "c:/development/openocd_0_10_0/scripts/target/stm32f1x.cfg"; var flashPath = "c:/development/openocd_0_10_0/bin/openocd.exe"; var argsSize = [input.filePath]; var argsObjcopy = ["-O", "ihex", input.filePath, output.filePath]; var argsFlashing = [ "-f", configStlinkPath, "-f", configStm32Path, "-c", "init", "-c", "halt", "-c", "flash write_image erase " + input.filePath, "-c", "reset", "-c", "shutdown" ]; var cmdSize = new Command(sizePath, argsSize); var cmdObjcopy = new Command(objcopyPath, argsObjcopy); var cmdFlash = new Command(flashPath, argsFlashing); cmdSize.description = "Size of sections:"; cmdSize.highlight = "linker"; cmdObjcopy.description = "convert to bin..."; cmdObjcopy.highlight = "linker"; cmdFlash.description = "download firmware to uC..."; cmdFlash.highlight = "linker"; return [cmdSize, cmdObjcopy, cmdFlash]; } } } Название: Re: Qt Creator + stm32 Отправлено: lit-uriy от Февраля 28, 2017, 14:47 вообще QBS+BareMetal - это ересь какая-то, лучшеб обеспечили работу qmake, создав какой-нибудь подходящий конфиг (mkspec).
Я до появления креатора, с помощью qmake генерил makefile для AVR GCC, что-то поплясать тогда пришлось с mkspec и конфигами qmake-а, но потом сильно жизнь облегчало. Название: Re: Qt Creator + stm32 Отправлено: Larry от Февраля 28, 2017, 15:13 По мне так qbs попонятней будет (по синтаксису) :)
Но после всех IDE при работе с микроконтроллерами, то Qt Creator превосходит их на голову :) (в плане удобств, но это мое субъективное мнение). Теперь все проекты в одной IDE... Название: Re: Qt Creator + stm32 Отправлено: lit-uriy от Марта 01, 2017, 06:21 >>По мне так qbs попонятней будет (по синтаксису)
не увидел преимуществ в ни понятности ни в краткости qbs-а перед qmake-ом qmake: Код
qbs: Код
Название: Re: Qt Creator + stm32 Отправлено: kuzulis от Марта 01, 2017, 09:27 Ну, как бы, понятность наступает когда появляется необходимость слинковаться с чем-то.
qmake: Код: DEPENDPATH += /path/to/lib1/ LIBS += -L/path/to/lib1 -lmylib1 // статика LIBS += -L/path/to/lib2 -lmylib2 LIBS += -L/path/to/lib3 -lmylib3 win32:PRE_TARGETDEPS += /path/to/lib1/mylib1.lib else:unix:PRE_TARGETDEPS += /path/to/lib1/mylib1.a qbs: Код: Depends { name: MyLib1} Depends { name: MyLib2} Depends { name: MyLib3} Название: Re: [РЕШЕНО]Qt Creator + stm32 Отправлено: lit-uriy от Марта 03, 2017, 06:18 MyLibX, как я понимаю, описана в отдельном QBS-е. Для qmake я использую include, т.е.
include(path/to/mylib1.pri) и т.д., а чаще include($$(LIBS)/mylib1.pri) где LIBS - переменная окружения |