Russian Qt Forum

Qt => Qt Embedded => Тема начата: Larry от Февраль 16, 2017, 09:52



Название: [РЕШЕНО]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
Цитировать
Тогда почему появляется предупреждение, что не найдено это свойство?

Теперь оно называется по-другому (см. linkerscript (http://doc.qt.io/qbs/cpp-module.html))

Ах, не, кажется, теперь просто можно указывать 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']
            Artifact{
                fileTags:['hex']
                filePath: project.name + '.hex'
            }
Наверное лучше использовать Transformer, а не Rule

Цитата
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: [

//            //"../TrueSTUDIO/F1032/libs.ld",
//        ]

#на строку
        Group {
            name: "linker scripts"
            files: ["../STM32L152RB_FLASH.ld",]
            fileTags: ["linkerscript"]
        }
а итоговый выходной файл так же прогнать через arm-none-eabi-objcopy
Может быть второй вариант потребует небольшие переделки от вас.

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
ARCH_FLAGS = -mthumb -mcpu=cortex-m4 $(FP_FLAGS)
и заменить путь к скрипту, на путь к stm32f4-discovery.ld.
я так думаю что после этого должно взлететь.
Ниже то что у меня работает с 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
Приветствую!
Молчание камня достаточно часто происходило. Думается мне что проблема в ликере и в том что он цепляет.
У меня сейчас есть исправленный qbs ( за основу взяты проекты местных умельцев ). выходной бинарник полностью работоспособный
Советую обратить внимание на следующие свойства модуля cpp для уменьшения дублирования:
              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
...

Спасибо! qbs впервые вижу =)


Название: 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:
Код
Bash
TEMPLATE = app
 
INCLUDEPATH += "src"
INCLUDEPATH += "src/cmsis"
INCLUDEPATH += "src/inc"
INCLUDEPATH += "src/linker"
INCLUDEPATH += "src/startup"
 
SOURCE += "*.cpp"
SOURCE += "src/cmsis/*.c"
SOURCE += "src/inc/*.c"
SOURCE += "src/startup/*.c"
 
HEADERS+= "src/cmsis/*.h"
HEADERS += "src/inc/*.h"
 

qbs:
Код
Bash
Project
{
   name: "qbs"
 
   Product
   {
       type: "application"
       Depends { name: "cpp" }
...
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"
       ]
...
 


Название: 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 - переменная окружения