Elektroda.pl
Elektroda.pl
X
Deimic One - Szkolenia
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Linux + Code::Blocks + STM32 - Tutorial STM32 + Code::Blocks w Linuxie

przemof-s 20 Maj 2016 23:32 3738 38
  • #1 20 Maj 2016 23:32
    przemof-s
    Poziom 9  

    Przedstawiony tutorial dotyczy głównie konfiguracji Code::Blocks, umożliwiającej pisanie i debugowanie kodu w języku C/C++, m.in. dla mikrokontrolerów z rodziny STM32. Opis zrealizowany został na przykładzie płytki STM32F4DISCOVERY. Jednak przedstawioną metodę można wykorzystać do konfiguracji innych układów z tej rodziny. Prezentowany opis zawiera informacje dotyczące konfiguracji: Code::Blocks + GCC ARM Embedded Toolchain + OpenOCD + STM32CubeMX + STM32F4Discovery + Linux.

    Dla układów STM32 jest już dostępne gotowe, zintegrowane środowisko programistyczne: System Workbench for STM32 (SW4STM32), który bazuje na środowisku Eclipse. Jaki jest więc sens samodzielnego składania środowiska? Autor nie lubi środowiska Eclipse, nie odpowiada mu jego rozmieszczenie okien, obsługa, po prostu źle mu się w tym środowisku pracuje. Jest to wystarczający powód.

    Ze względu na dużą objętość tutoriala, został umieszczony w załączniku, w postaci pliku pdf. Dodatkowo umieszczono dwa pliki *.zip. Jeden zawierający przykładowy projekt utworzony na podstawie tutoriala. Drugi zawierający strony www,, do których odnosi się tutorial (na wypadek ich "zniknięcia" z sieci internet).

    4 29
  • Deimic One - Szkolenia
  • #2 21 Maj 2016 00:32
    grko
    Poziom 33  

    Bardzo fajna alternatywa dla Eclipse. Jeszcze nie przeczytałem całego ale chciałbym zadać pytania. Czy jest możliwa konfiguracja projektu typu makefile? Chodzi mi o podobną funkcjonalność co w Eclipse. Chciałbym mieć zakładkę z targetami z makefile. Czy dobrze działa indekser? Czy jest jakaś możliwość podglądania rejestrów periferiali?

    0
  • Deimic One - Szkolenia
  • #3 21 Maj 2016 15:50
    przemof-s
    Poziom 9  

    ad. 1: Jest możliwa współpracy z plikami makefile, jednak sam Code::Blocks ich nie generuje.
    ad. 2: Z tego co mi wiadomo indeksery są składnią języka C#, którego nigdy nie używałem, więc nie znam odpowiedzi na to pytanie.
    ad. 3: Bez dodatkowych plugin-ów możliwe jest odczytywanie zawartości rejestrów w najprostrzej postaci, czyli jako odczyt zawartości poszczególnych komórek pamięci.

    0
  • #5 13 Sty 2017 14:23
    Wiking18
    Poziom 14  

    Witam
    Próbuję ustawić i skompilować w Code::Blocks najprostszy program.
    Ale w najprostszej postaci. (przy użyciu tylko codeblocks toolchaina i bibliotek z CMSIS)
    Code blocks 16.1 gcc-arm-none-eabi-6_2-2016q4
    obecne chce tylko skompilować program bez debugowania itp na razie interesuje mnie poprawne kompilowanie.
    No i podstawowe biblioteki wyciągnięte z CMSIS
    Co dziwne code blocks nie pamięta mi ustawienia własnego kompilatora (po ponownym uruchomianiu muszę ustawiać go od nowa)
    Ale jak już go ustawię i próbuję skompilować to mam error.

    Code:
    arm-none-eabi-gcc -Wall  -c /home/damian/Szablony/Codestm/main.c -o obj/Debug/Szablony/Codestm/main.o
    
    arm-none-eabi-g++  -o bin/Debug/Codestm obj/Debug/Szablony/Codestm/main.o   
    /home/damian/Eclipse/gcc-arm-none-eabi-6_2-2016q4/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/libc.a(lib_a-exit.o): In function `exit':
    exit.c:(.text.exit+0x2c): undefined reference to `_exit'
    collect2: error: ld returned 1 exit status
    Process terminated with status 1 (0 minute(s), 0 second(s))
    2 error(s), 0 warning(s) (0 minute(s), 0 second(s))
     


    Kod programu to
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Jakieś sugestie czy problem jest w toolchainie czy gdzie indziej.

    0
  • #6 13 Sty 2017 14:27
    tadzik85
    Poziom 38  

    80% flag kompilacji brak...

    0
  • #7 13 Sty 2017 14:39
    Wiking18
    Poziom 14  

    Witam nie bardzo rozumiem.

    Cytat:
    80% flag kompilacji brak...

    To co podałem to wszystko co wypluł codeblocks w Build Log
    plus linia nagłówkowa
    Code:

    -------------- Build: Debug in Codestm (compiler: STM32)---------------

    arm-none-eabi-gcc -Wall  -c /home/damian/Szablony/Codestm/main.c -o obj/Debug/Szablony/Codestm/main.o
    arm-none-eabi-g++  -o bin/Debug/Codestm obj/Debug/Szablony/Codestm/main.o   
    /home/damian/Eclipse/gcc-arm-none-eabi-6_2-2016q4/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/libc.a(lib_a-exit.o): In function `exit':
    exit.c:(.text.exit+0x2c): undefined reference to `_exit'
    collect2: error: ld returned 1 exit status
    Process terminated with status 1 (0 minute(s), 0 second(s))
    2 error(s), 0 warning(s) (0 minute(s), 0 second(s))
     

    Nie ma nawet lini więcej więc nie wiem czy o to chodzi.

    0
  • #8 13 Sty 2017 14:56
    tadzik85
    Poziom 38  

    O to, że ich brak a nie ze czegoś nie wypluło na konsolę.
    Czyli brak jakichkolwiek ustawień kompilacji.

    1
  • #9 14 Sty 2017 19:11
    przemof-s
    Poziom 9  

    To, że Code::Blocks nie pamięta ustawień konfiguracji jest prawdopodobnie spowodowane brakiem uprawnień do modyfikacji plików konfiguracyjnych. Spróbuj uruchomić Code::Blocks z konsoli, poleceniem sudo codeblocks i wtedy go skonfigurować. Choć możliwe, że właśnie takie uruchomienie Code::Blocks powoduje późniejsze problemy. Sprawdź też jakie masz prawa do katalogu (oraz kto jest jego właścicielem) /home/USER/.config/codeblocks oraz plików w nim zawartych i w razie potrzeby zmień je za pomocą poleceń chown oraz chmod.

    Możliwe, że błąd kompilacji wynika z niepoprawnej konfiguracji flag dla kompilatora lub linkera. Napisz jakie masz ustawienia dla kompilatora i linkera oraz jaki mikrokontroler chcesz zaprogramować.

    1
  • #10 16 Sty 2017 09:12
    Wiking18
    Poziom 14  

    Witam dziękuję za odpowiedź.

    A więc tak po następnym uruchomieniu code blocksa już pamiętał ustawienia, więc nie wiem czym mogło być to spowodowane. (między czasie mógł być restart więc może to pomogło)

    Co do Ustawienia kompilatora i flag to kolega wcześniej miał rację nie mam ustawionych ani flag ani linkiera.
    Chcę programować procesor STM32F767ZI korzystając tylko z podstawowych bibliotek nazw rejestrów. stm32f767xx.h
    (tam jeszcze jest kilka zainkludowanych)
    Ale głownie chodzi mi o te podstawowe.
    I tu mam problem jak ustawić flagi kompilatora i linkiera nie korzystając z dodatkowych narzędzi jak STM32CubeMX .
    Nie interesują mnie biblioteki "wysokiego poziomu" dopóki nie ogarnę rejestrów .
    Czy jest gdzieś jakiś opis rozpiska flag co one oznaczają i jak powinno się je ustawiać.?
    znalazłem coś takiego Flagi ale nie wiem czy flagi są uniwersalne dla wszystkich kompilatorów czy toolchainów.
    proszę o odesłanie mnie do podstaw abym mógł ogarnąć to zagadnienie.

    Kolegów obeznanych w temacie proszę o pomoc. Gdyż naprawdę mało jest źródeł programowania STM32 pod linuxem ( w porównaniu do win) a po Polsku nie opartych na Eclipse to już w ogóle ze świeczką szukać.

    Jeżeli gdzieś brakuje mi wiedzy czy zrozumienia tego co piszę to proszę o wskazanie moich braków błędów i odesłanie mnie do konkretnej literatury.
    lub po prostu ich wytłumaczenia.
    Post tadzik85 oraz przemof-s okazały się pomocne.
    Za co dziękuję.

    Pozdrawiam

    0
  • #11 16 Sty 2017 09:22
    2675900
    Użytkownik usunął konto  
  • #12 16 Sty 2017 20:46
    przemof-s
    Poziom 9  

    Nie wiem czy dla rodziny STM32F7 są dostępne biblioteki w wersji SPL. Zarówno w programie System Workbench for STM32 podczas tworzenia nowego projektu, jak i na stronie ST: http://www.st.com/en/embedded-software/stm32-...d-software.html?querycriteria=productId=SC961 po wybraniu z tabeli opcji: STM32 Standard Peripheral Libraries, nie ma możliwości wybrania bibliotek SPL dla rodziny F7. Wygląda to tak jakby STM chciało "zmusić" użytkowników do przejścia na biblioteki HAL.

    Co do samego gcc i plików makefile, w książce Kurt Wall - Linux programowanie w przykładach dwa pierwsze rozdziały dotyczą właśnie gcc i makefile. Jednak sama książka jest z 2000 roku i aktualnie jest trudno dostępna oraz ze względu na swój wiek, częściowo nieaktualna. Ponadto nie traktuje o mikrokontrolerach.

    Co do samego STM32, to na pewno książka Krzysztof Paprocki - Mikrokontrolery STM32 w praktyce traktuje o STM32 i bibliotekach SPL. Warto spojrzeć też na stronę www Elektroniki Praktycznej oraz Elektroniki dla Wszysktich. Pierwszy tytuł udostępnia archiwum wszystkich numerów (oprócz ostatnich 12 wydań) i tam można znaleźć dużo przykładów na temat programowania STM32. W drugim tytule szczególnie w maju 2011 roku rozpoczął się kurs STM32 na bibliotekach SPL. Jednak co do samego ustawiania flag, w w.w. czasopismach, raczej szczegółowych informacji na ten temat nie znajdziesz. Jakiś kurs na SPL był również przeprowadzony tutaj: http://forbot.pl/blog/artykuly/programowanie/stm32-praktyce-1-platforma-srodowisko-id2733

    Jeżeli chcesz zapoznać się z biblioteką SPL od podstaw, rozwiązaniem może być przesiadka na np. STM32F4. Wtedy będziesz mógł skorzystać z gotowej konfiguracji flag, wygenerowanej w System Workbench for STM32 i wykorzystać ją, np. w Code::Blocks.

    0
  • #13 16 Sty 2017 21:53
    2675900
    Użytkownik usunął konto  
  • #14 16 Sty 2017 23:33
    przemof-s
    Poziom 9  

    Wiking18 napisał:
    Nie interesują mnie biblioteki "wysokiego poziomu" dopóki nie ogarnę rejestrów .

    Po co? Kolega pyta o SPL-a, więc odpowiadam. Nie narzucam.

    Wiking18 napisał:
    Gdyż naprawdę mało jest źródeł programowania STM32 pod linuxem ( w porównaniu do win) a po Polsku nie opartych na Eclipse to już w ogóle ze świeczką szukać.

    Jeżeli na początek nie jest w stanie sam wskazać odpowiednich flag, a nie ma ochoty pracować w Eclipse, to niech się wspomoże. Niech każdy wybierze sobie takie narzędzia, jakie najbardziej mu odpowiadają. Jeżeli ktoś pyta o rozwiązania nie oparte na Eclipse, to widocznie ma ku temu jakieś powody, które niekoniecznie musimy rozumieć, a tym bardziej nie powinniśmy negować.

    0
  • #15 16 Sty 2017 23:48
    2675900
    Użytkownik usunął konto  
  • #16 16 Sty 2017 23:53
    grko
    Poziom 33  

    Piotrus_999 napisał:
    To moze kolega sam napiszę dlaczego nie chce sprawdzonego środowiska, a wybiera coś powiedzmy niszowego. Rozumiem, stary wyjadac, nawyki itp ale w tym przypadku jakoś sobie trudno wyobrazic


    Przeczytaj nazwę tematu i po prostu sie nie wypowiadaj o rzeczach o których nie masz zielonego pojęcia. Świat nie kończy się na eclipse czy na IDE od ST. Ktoś kto tutaj pisze, chce korzystać z Code::Blocks i nie musi co chwile słuchać o eclipse.

    1
  • #17 17 Sty 2017 08:04
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Wiking18 napisał:
    I tu mam problem jak ustawić flagi kompilatora i linkiera nie korzystając z dodatkowych narzędzi jak STM32CubeMX .

    Ściągnij sobie z mojej strony przykład o nazwie stm32f4_blink_led (jest w dziale Download). Skompiluj go z wiersza poleceń (make all) i będziesz widział jakie flagi są potrzebne. Dla układu STM32F7 jedyne co musisz zmienić to "-mcpu=cortex-m4" na "-mcpu=cortex-m7".

    0
  • #18 17 Sty 2017 09:13
    Wiking18
    Poziom 14  

    Witam

    Freddie Chopin napisał:
    Dla układu STM32F7 jedyne co musisz zmienić to "-mcpu=cortex-m4" na "-mcpu=cortex-m7".


    Tutaj się domyśliłem ale resztę nie wiedziałem.
    Spróbuję tak jak mówisz. Poćwiczę na gotowym organizmie.

    Jeżeli chodzi o Eclipce to traktuje to jako ostateczność mimo że dużo tam jest to jakoś ciężko tam "Mi" się cokolwiek robi nie wiem może mam takie wrażenie ale środowisko jakoś mi nie odpowiada. (jako żę robię to dla przyjemności i w ogóle nie wiem czemu chyba z pasji to poco tą radość zabijać lub przyćmiewać z czegoś co mi nie odpowiada).
    Nie wiem może do Eclipse muszę dojrzeć.
    Jako że znajomość z uc odświeżam i przy okazji przesiadam się na STM32 a stare wspomnienia są z keila, środowiska AVR to Code Blocks przypadł mi do gustu jakoś podprogowo.
    Dlatego chcę przy nim zostać.
    Wiem że dla kogoś może to głupie ale człowiek (czytaj Ja) ma jakiś sentyment.

    Co do bibliotek to chętnie zostanę na razie przy samych rejestrach.
    Chodzi mi tutaj o sam plik nagłówkowy danego procesora.
    Jak je ogarnę na poziomie dobrze to będę zaglądał do bardziej skomplikowanych bibliotek.
    Do tego długa droga.
    Pozdrawiam i Dziękuję wszystkim za odpowiedzi.
    Jak nie uda mi się tego ustawić to pozwolę sobie jeszcze tutaj poprosić o pomoc.

    0
  • #19 17 Sty 2017 10:21
    2675900
    Użytkownik usunął konto  
  • #20 17 Sty 2017 10:26
    Wiking18
    Poziom 14  

    Wiking18 napisał:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Witam ponownie
    Nie z nagłówkami mam problem pliki mam wyłuskane :) Wspominam o nich tylko dlatego żeby ktoś wiedział o co mi mniej więcej chodzi.
    Co do przykładu Freddie-go To kompilator wypluł mi że nie ma plików.
    Code:
    rm-none-eabi-gcc main.c
    
    In file included from inc/stm32f4xx.h:240:0,
                     from main.c:42:
    inc/core_cm4.h:144:97: fatal error: core_cmInstr.h: No such file or directory
    ale zmieniał adresy bibliotek bo były w <> na "" i zobaczymy co wyjdzie Ale dziękuję za szybkie odpowiedzi i konkretne info.
    Pozdrawiam

    Po zmianie adresów mam coś takiego w konsoli
    Code:
    damian@damian-Lenovo-G40-30:~/Projekty/led/stm32f4_blink_led-1.2.2-120323$ arm-none-eabi-gcc main.c
    
    /usr/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib/libc.a(lib_a-exit.o): In function `exit':
    exit.c:(.text.exit+0x2c): undefined reference to `_exit'
    /tmp/cc5Dl7VS.o: In function `main':
    main.c:(.text+0x34): undefined reference to `gpio_pin_cfg'
    /tmp/cc5Dl7VS.o: In function `system_init':
    main.c:(.text+0x3ac): undefined reference to `gpio_init'
    collect2: error: ld returned 1 exit status

    aa tak w code blocks
    Code:

    -------------- Build: Debug in tescik (compiler: STM32)---------------

    arm-none-eabi-gcc -Wall -g  -c /home/damian/Projekty/led/stm32f4_blink_led-1.2.2-120323/main.c -o obj/Debug/Projekty/led/stm32f4_blink_led-1.2.2-120323/main.o
    arm-none-eabi-g++ -Wall -g  -c /home/damian/Projekty/led/stm32f4_blink_led-1.2.2-120323/startup.S -o obj/Debug/Projekty/led/stm32f4_blink_led-1.2.2-120323/startup.o
    /home/damian/Projekty/led/stm32f4_blink_led-1.2.2-120323/startup.S: Assembler messages:
    /home/damian/Projekty/led/stm32f4_blink_led-1.2.2-120323/startup.S:44: Error: selected processor does not support requested special purpose register -- `msr PSP,r0'
    /home/damian/Projekty/led/stm32f4_blink_led-1.2.2-120323/startup.S:53: Error: selected processor does not support requested special purpose register -- `msr CONTROL,r0'
    /home/damian/Projekty/led/stm32f4_blink_led-1.2.2-120323/startup.S:77: IT blocks containing 32-bit Thumb instructions are deprecated in ARMv8
    /home/damian/Projekty/led/stm32f4_blink_led-1.2.2-120323/startup.S:93: IT blocks containing 32-bit Thumb instructions are deprecated in ARMv8
    Process terminated with status 1 (0 minute(s), 0 second(s))
    4 error(s), 0 warning(s) (0 minute(s), 0 second(s))
     

    i się zwiesiłem;/

    0
  • #21 17 Sty 2017 10:31
    2675900
    Użytkownik usunął konto  
  • #22 17 Sty 2017 11:02
    Wiking18
    Poziom 14  

    Piotrus_999 napisał:

    Naprawdę proponuje na początek coś bardziej przyjaznego początkującym (bo po pytaniach sądząc do nich się zaliczasz). Oczywiście zaraz grko stwierdzi że dla początkujących nie ma nic lepszego niż pisanie makefile-ów i skryptów linkera "z palca", ale jednak lepiej mieć przyjemność z programowania, niż nieprzyjemność z konfigurowania czegoś czego się na początku zupełnie nie czuje i nie rozumie.


    Czy możesz polecić coś co nie wrzuci mi tony zbędnych (dla mnie biliotek) i obsłuży wspomniany uc f767.
    W Eclipse mogę wybrać maks 756 a kod który nic nie robi po skompilowaniu waży 12,8k (hex)
    Być może na STM tak to wygląda ale w tej pamięci na AVR i Xmega można było zmieścić spory program.
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Przepraszam autora tematu za odbieganie od niego.

    0
  • #23 17 Sty 2017 12:17
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Wiking18 napisał:
    Co do przykładu Freddie-go To kompilator wypluł mi że nie ma plików.

    Skoro ich nie ma, to musisz je dodać. Nie ma innego wyjścia - sam plik stm32f7cokolwiek.h nie jest wystarczający.

    Wiking18 napisał:
    Po zmianie adresów mam coś takiego w konsoli

    Jakich adresów?

    Wiking18 napisał:
    kod który nic nie robi po skompilowaniu waży 12,8k (hex)

    I nie mieści się w układzie?

    0
  • #24 17 Sty 2017 13:11
    2675900
    Użytkownik usunął konto  
  • #25 17 Sty 2017 13:34
    Freddie Chopin
    Specjalista - Mikrokontrolery

    rar - ulubiony format pakowania danych na linuxa... Żeby choć był lepszy, ale 7z / tar.xz zajmuje 2x mniej...

    0
  • #26 17 Sty 2017 13:41
    Wiking18
    Poziom 14  

    Freddie Chopin napisał:
    Wiking18 napisał:
    Co do przykładu Freddie-go To kompilator wypluł mi że nie ma plików.

    Skoro ich nie ma, to musisz je dodać. Nie ma innego wyjścia - sam plik stm32f7cokolwiek.h nie jest wystarczający.

    No tak ale prubowałem skompilować twoj przklad bez ingerencji w przykładzie są wszystkie potrzebne pliki. Nie poszło. Pozmianie includowania zaczeło iść i efekty pokazałem wcześniej
    ja zmieniłem includowanie. na
    #include <stdint.h>
    #include "core_cmInstr.h"
    #include "core_cmFunc.h"
    #include "core_cm4_simd.h"

    bo inaczej kompilator nie znajdował plików.


    Freddie Chopin napisał:
    Wiking18 napisał:
    kod który nic nie robi po skompilowaniu waży 12,8k (hex)

    I nie mieści się w układzie?

    No pewnie się zmieści ale trochę mnie to przeraziło zważywszy na to że kod nic nie robi.
    Czy to po prostu tyle zajmuje konfiguracja rejestrów plus to że są 32 bitowe i taki rozmiar to normalka.

    0
  • #27 17 Sty 2017 13:48
    2675900
    Użytkownik usunął konto  
  • #28 17 Sty 2017 14:05
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Wiking18 napisał:
    No pewnie się zmieści ale trochę mnie to przeraziło zważywszy na to że kod nic nie robi.
    Czy to po prostu tyle zajmuje konfiguracja rejestrów plus to że są 32 bitowe i taki rozmiar to normalka.

    Ale wiesz że rozmiar pliku .hex nie jest równy rozmiarowi skompilowanego programu? Czy na tym etapie (zupełne początki) naprawdę musisz sobie dokładać problemów z tym czy program zajmuje 1, 10 czy 100kB? Jeśli się mieści to doskonale. Jak zadziała to będziesz kombinował jak zmniejszyć. Jak będziesz chciał kombinować z setką rzeczy na raz, to nie dojdziesz do niczego.

    Wiking18 napisał:
    No tak ale prubowałem skompilować twoj przklad bez ingerencji w przykładzie są wszystkie potrzebne pliki. Nie poszło.

    Na prawdę nie wiem co i jak zrobiłeś oraz nie wiem jaki masz toolchain/kompilator, jednak tutaj (na Linuxie) wszystko działa jak trzeba:

    Kod: bash
    Zaloguj się, aby zobaczyć kod


    Jak widzisz - i tym razem liczby są wiarygodne - program który już coś robi (ustawia PLL i GPIO, miga diodką), zajmuje 1.4kB.

    0
  • #29 17 Sty 2017 14:12
    2675900
    Użytkownik usunął konto  
  • #30 17 Sty 2017 14:20
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Piotrus_999 napisał:
    Chyba nie ten procek trochę.

    Ale czytaj całe posty i ogólnie to do czego się odnoszą, OK?

    0