Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[STM32] Czy używać bibliotek ST?

pikoc 13 Oct 2013 12:46 32374 152
Altium Designer Computer Controls
  • #61
    BlueDraco
    MCUs specialist
    No to z limitem do 48 MHz, bez dzielenia:

    FLASH->ACR = frequency >= 24000000;
  • Altium Designer Computer Controls
  • #62
    Freddie Chopin
    MCUs specialist
    Wciąż więc debatujemy nad funkcją dla jednego tylko układu, czyli dla STM32F0, w którym to faktycznie opóźnienie może mieć tylko dwie wartości. Co z układem w którym opóźnienie to może mieć więcej możliwych ustawień (STM32F4)? Tylko dla optymalizacji kilku linii i kilku cykli mam zrezygnować z faktu, że dla większości układów ST funkcja wygląda praktycznie identycznie? Poza optymalizacją w oprogramowaniu są też inne warte uwagi rzeczy, jedną z nich jest przenośność kodu. No i przypominam, że optymalizujemy ciężko kod, który:
    - wykonywany jest tylko i wyłącznie RAZ, po starcie układu,
    - kompilator zapewne sam wpadł na te optymalizacje,
    - optymalizacje te są i tak bezsensowne, gdyż funkcja do ustawiania opóźnienia flasha wywoływana jest w czasie oczekiwania na uruchomienie kwarcu, co za tym idzie każdy zaoszczędzony tutaj cykl zegara i tak zostanie później (z dużym prawdopodobieństwem) zmarnowany w pustej pętli.

    Nie mówiąc już o tym co ta dyskusja ma wspólnego z tematem wątku...

    4\/3!!
  • #63
    BlueDraco
    MCUs specialist
    Freddie, nie o optymalizację czasu chodzi, a o zwykłą czytelność kodu. Im mniej go jest do czytania, tym łatwiej go ogarnąć weteranowi... ;) Ja napisałem jedną linię, w przykładzie powyżej jest tych linii z 10. Ekstrapolując - ja mam jeden ekran kodu zamiast 10 ekranów wymagających przewijania w celu obejrzenia. A jak się przy tym rolka myszy zużywa...

    Zresztą, całość to jedna wielka bzdura. Najpierw dzielny programista programuje PLL tak, żeby uzyskać zadaną, z góry określoną częstotliwość zegara, a potem woła funkcję, która na podstawie zawartości rejestrów wyliczy mu częstotliwość, którą sam podał, po czym, gdy już programista pozna tę częstotliwość, to pisze kod, który na podstawie jej wartości dobierze odpowiedni czas dostępu do pamięci - jak gdyby nie znał go a priori...
  • #64
    tadzik85
    Level 38  
    Za pomocą dzielenia zapisywać coś co jawnie w DS jest opisane warunkowo? Nikła ta czytelność.

    To jak zapisywać dzielenie przez 4 przesunięciem w prawo o 2.
  • #65
    Freddie Chopin
    MCUs specialist
    BlueDraco wrote:
    Zresztą, całość to jedna wielka bzdura. Najpierw dzielny programista programuje PLL tak, żeby uzyskać zadaną, z góry określoną częstotliwość zegara, a potem woła funkcję, która na podstawie zawartości rejestrów wyliczy mu częstotliwość, którą sam podał, po czym, gdy już programista pozna tę częstotliwość, to pisze kod, który na podstawie jej wartości dobierze odpowiedni czas dostępu do pamięci - jak gdyby nie znał go a priori...

    Nie wiem o czym piszesz, ale na pewno nie o moich przykładowych projektach.

    BlueDraco wrote:
    Im mniej go jest do czytania, tym łatwiej go ogarnąć weteranowi...

    To już Twoje zdanie, większość programów można by skrócić co najmniej 4-ro krotnie zapisując wiele rzeczy w jednej linii, usuwając puste wiersze, klamry dając w wierszu z instrukcją itd. Jeśli dla Ciebi coś takiego jest bardziej czytelne, to proszę bardzo, jednak nie rób z tego uniwersalnej prawdy...

    4\/3!!
  • #66
    Misioy
    Level 1  
    Witam
    To mój pierwszy post na forum. Z stm32 próbuję walczyć już jakiś czas co marnie mi idzie. Czy mógłby ktoś napisać w tym wątku po kolei czego potrzebuję aby pisać programy tylko na rejestrach w środowisku Atollc? Używam płytki stm32f0discovery z F051, cortex M0. Głównie chodzi mi o include'y, jakie pliki mam zaimportować do projektu itp.
  • #67
    tadzik85
    Level 38  
    Odsyłam do przykładów kolegi Freddiego. I może odstąp od wykorzystywania płatnego środowiska?
  • Altium Designer Computer Controls
  • #68
    BlueDraco
    MCUs specialist
    W EP od lipca do września br. masz tutorial do tej płytki ze środowiskiem Keil. To dobry punkt startowy.
  • #69
    Freddie Chopin
    MCUs specialist
    Rok 2013. Grudzień. Świat jest już technologicznie zaawansowany.

    Proszę o informację, czemu w tej "świetnej" bibliotece w funkcjach typu

    Code: C
    Log in, to see the code


    oraz w strukturach typu:

    Code: C
    Log in, to see the code


    brakuje specyfikatora "const". Osoby które nie rozumieją po co i w którym miejscu miałby się on tam znaleźć proszone są o powstrzymanie się od odpowiedzi.

    P.S. Biblioteka w najnowszej wersji
    Code: C
    Log in, to see the code


    To nie jest kod, to jest typowy beł-kod.

    P.P.S. Uprzedzając obrońców honoru SPLa - obiekty NIE są modyfikowane wewnątrz funkcji.

    4\/3!!
  • #70
    BlueDraco
    MCUs specialist
    Ja zadałbym inne pytanie: dlaczego w przykładach użycia SPL mamy zawsze deklarację struktury inicjującej jako zmiennej,a następnie długaśną serię podstawień nadających poszczególnym jej polom stałe wartości, jak gdyby nie można było zadeklarować tej nieszczęsnej struktury jako stałej z odpowiednio zainicjowanymi polami, korzystając z konstrukcji jawnego inicjowania pól z ich nazwami dla ew. podniesienia czytelności.
  • #72
    tadzik85
    Level 38  
    Aja jedynie zwrócę jeszcze uwagę na rehabilitacje ST w jednej kwestii.
    Przykład do aplication note "STM32F10xxx I2C optimized examples" AN2824

    Dopiero od rev4 można uznać go za "optimized", zajrzyjcie do historii zmian.
  • #74
    Pituś Bajtuś
    Level 28  
    Zamienił stryjek siekierkę na kijek. Nie rozumiem w czym jakieś dziwolągi programistyczne mają mieć przewagę nad prostym ustawieniem kilku bitów w kilku rejestrach.
  • #75
    SeerKaza
    Level 20  
    Ogólnie sprawa wygląda tak że biblioteki do prostych peryferii nie mają sensu. (PWM, ADC, SPI. UART, DMA etc) Jakiekolwiek biblioteki nabierają sensu przy peryferiach typu USB czy ETHERNET. obsługa TCD UDP. No i biblioteki graficzne. A w innym przypadku wystarczy kilka własnych funkcji operujących na rejestrach. Szczególnie że CMISIS od ARM jest naprawdę przyjemny i przejrzysty.
  • #77
    Jado_one
    Level 22  
    Bo nie zaglądają na forum Elektrody - nie wiedzą że można inaczej ;-)

    A we wszystkich przykładach i książkach maja jedynie słuszną SPL :-)
    Swoją drogą, wydaje się, że ten trend może się pogłebiać - programiści zaczynający od procesorów 8-bitowych, gdzie pisało się w assemblerze byli przyzwyczajeni do "pisania po rejestrach" bezpośrednio. Łatwo im więc zaakceptować to samo w STM'ie32 (jak już dowiedzieli się, że "SPL is be").
    Młodsi, dopiero co zaczynający zabawę z mikrokontrolerami od razu biorą na warsztat STM32 i język C - nie mieli styczności z pisaniem po rejestrach, itd....
    Oni "z marszu" wybiorą SPL - nawet nie mają wiedzy, żeby ocenić czy ta biblioteka jest dobra czy zła.
    Ten trend będzie się pogłebiał....

    A potem zatrudnisz się do jakiejś firmy, a tam tylko SPL - i co? ;-)
  • #78
    tomzor
    Level 14  
    SPL - jak "ciemna strona mocy" szybsza, łatwiejsza itd..... hehehe.
    Nic to nie zmienia, że jedni będą używać, a inni nie. Jedni lubią Bascoma, a inni Keila.
    A w firmie to "szef ma zawsze rację".
    Podobnie można polemizować o wyższości Eagle nad Altrium/Protel.
  • #79
    KoltunS
    Level 2  
    Ja dorzucę swoje 3-grosze. ST wydało sporo układów pod nazwą discovery w których aby ustawić cały port trzeba korzystać z tych bibliotek bo zwyczajne ręczne wpisywanie do rejestrów nie chce działać. A dlaczego? bo na płytce są tak zagmatwane połączenia pomiędzy układami że np zamiast +3.3V na pine jest 0.4V albo wgl 0. A gdy się zastosuje biblioteki ST to nagle wszystko działa jak należy. Niemniej nie jest to sprawa programu bo jest on dobrze napisany (kod działa np dla innych portów czy pinów). Wydaje mi się że biblioteki od ST coś ustawiają/zmieniają na płytce i cudownie to funkcjonuje. Ręczne ustawianie portów wydaje mi się lepsze choć bardziej pracochłonne(trzeba czytać datasheet) ale biblioteki od ST w przypadku ich development boardów nie są takie bezsensowne..
  • #80
    BlueDraco
    MCUs specialist
    Bzdury piszesz, Kolego. W płytkach DISCOVERY nie ma żadnej magii, popełniłem sporo programów, ani razu nie użyłem SPL i jakoś wszystko działa jak należy. żeby użyć SPL też trzeba czytać dokumentację z opisem każdego pola każdej struktury, a program bez SPL jest kilkakrotnie krótszy w zapisie w C, a więc i łatwiejszy do czytania i pisania, niż program korzystający z SPL.
  • #81
    KoltunS
    Level 2  
    Możliwe, ale ja jakoś nie potrafię wytłumaczyć sobie dlaczego nie moge ustawić wszystkich pinów np portu B w stan wysoki (np kilka pinów portu jest w stanie wysokim a kilka nie a jest na nich 0.4V) kiedy robię to ręcznie, a kiedy ustawie za pomocą bibliotek ST to wszystko jest ok. Może się nie znam ale ktoś mógłby podać powód takiego stanu? Ktoś powie że to błąd programu ale stosuje identyczny kod względem innych portów i jest ok. Wiem że nie wszystkie piny można wykorzystać bo są już do czegoś dołączone, np do rezonatora ale nawet te które są "wolne" nie działają..
  • #82
    dziechu
    Level 27  
    Niektóre piny są domyślnie ustawione np. dla JTAGa i trzeba przemapować żeby je uwolnić. Nie używam SPL i wszystkie programy uruchamiam na płytach discovery lub innych podobnych. Zawsze działa bez problemu. Ale na początku też miałem problemy, szukałem zwarć itp. Ja posłuchałem rady żeby nie używać SPL i dobrze zrobiłem. Rzeczywiście kod z SPL może wyglądać bardziej czytelnie, bo ustawienia są praktycznie wypisane na ekranie. Zawsze to czytelniejsze niż wpis do rejestru bitu nawet bardzo zmyślnie nazwanego. Ale podczas szukania błędów to widzę co do jakiego rejestru wpisuję i mogę to szybko sprawdzić w dokumentacji. Za to dojść do tego jakie rejestry i jak są ustawiane przez SPL to czasem spory problem. Ale ja jestem z tych dawnych ośmiobitowców piszących w asm do rejestrów:)

    Dodano po 4 [minuty]:

    Napisz konkretnie z jaką płytą discovery masz problem i z którymi pinami.

    Dodano po 5 [minuty]:

    Może PB3 i PB4?
  • #83
    BlueDraco
    MCUs specialist
    KoltunS:
    Ja też Ci nie nie wytłumaczę nie widząc programu, który napisałeś.
  • #84
    Diesel-
    Level 9  
    Mamy 2016, wciąż popularne SPL i coraz bardziej HAL, mamy też następne wcielenie arduino, mbed. Dla kogoś takiego jak ja, czyli weekendowego elektronika który wciągnął się i wyrósł na arduino i 8bitach, mbed wydawałoby się strzałem w 10. Jednak po co? skoro wszystkie niezbędne projekty jestem w stanie zrealizować na 8 bitowcach i pseudokodzie arduino. Pomyślałem że jak ugryźć 32bitowce to próbując nauczyć się programowania 'na serio' i po przydługim wstępie chyba dość proste pytanie dla mikrokontrolerowych wyjadaczy, jaką ścieżkę rozwoju zaproponowalibyście hobbyście który ma ambicje nauczyć się i zrozumieć? :D
  • #85
    BlueDraco
    MCUs specialist
    C na PC, a potem C na mikrokontrolery bez używania bibliotek do trywialnych zadań. Jakaś zgrabna płytka z 32-bitowym uC i interfejsem debugowania, np. coś z serii STM32Discovery.

    Z tym Arduino bym nie przesadzał. Arduino to takie klocki Lego - pobawić się można, ale domu, samochodu ani mebla z nich nie zbudujesz, bo to po prostu zabawka pod każdym względem - parametrów, wydajności (wynikającej i z cieniutkiego procesora i z baaardzowysokopoziomowego oprogramowania, które działa 50 x wolniej od czystego niskopoziomowego), promowanego przez środowisko stylu programowania itd.

    Po zamiganiu diodą i zapiszczeniu piszczkiem na Arduino następny krok to post na forum "wziąłem bibliotekę X i bibliotekę Y, podłączyłem czujnik A i wyświetlacz B i nie działa - pomóżcie!!!"

    A jak tu pomóc delikwentowi, który nie ma i nie chce mieć pojęcia o tym, jak działa czujnik A i wyświetlacz B oraz jakie błędy popełnili twórcy bibliotek X i Y? To jest właśnie filozofia Arduino - weź, poskładaj i ciesz się, jeśli działa, a jeśli nie działa... no to przepraszamy.
  • #86
    dziechu
    Level 27  
    Można C na PC, można i od razu na uC. Ja do dzisiaj nie kumam C na PC. To znaczy C jest w obu przypadkach takie samo, problem dotyczy znajomości jakie biblioteki dołączać i jakie oraz jak wykorzystywać ich funkcje. Dla hobbysty którego celem nie jest samo programowanie, a raczej chce konstruować swoje urządzenia, wystarczy samo C na uC. Ja raczej na początek zaproponowałbym C na prosty, 8bit uC. W takich prostych uC w zasadzie nie trzeba ustawiać rejestrów zegara itp. Przeważnie, jeżeli mają jakieś ustawienia, np. fuse bits w AVR, domyślnie są one ustawione tak, że uC pracuje zaraz po włączeniu. Dzięki temu już najprostsze programy typu migaj ledem działają (chyba tylko przed miganiem trzeba ustawić port jako wyjściowy). W uC 32 bit najczęściej przed zamiganiem ledem trzeba całkiem sporo innych rzeczy poustawiać.
  • #87
    szczywronek
    Level 27  
    dziechu wrote:
    domyślnie są one ustawione tak, że uC pracuje zaraz po włączeniu
    W STMach też nie ma przymusu konfigurowania systemu zegarowego. Domyślnie mikrokontroler działa na wewnętrznym oscylatorze. W moim poradniku 3/4 peryferiów jest omówione bez ruszania konfiguracji zegarów. Trzeba pamiętać tylko o włączeniu sygnału zegarowego dla peryferiala.

    dziechu wrote:
    W uC 32 bit najczęściej przed zamiganiem ledem trzeba całkiem sporo innych rzeczy poustawiać.
    Włączyć zegar dla portu i skonfigurować port jako wyjście. I nic więcej :)
  • #88
    BlueDraco
    MCUs specialist
    dziechu: nie sugerujesz chyba, że 32-bitowy uC "nie pracuje zaraz po włączeniu"?

    Fakt, w ATmega wystarczy zapisać DDR, a potem już można zmieniać PORT i dioda miga - prościzna, tylko dwa rejestry.

    Dla porównania: w STM32 żeby zamigać diodą trzeba zapisać coś do AHBENR, potem do MODER, a potem modyfikować ODR - po prostu koszmar - aż trzy rejestry!

    W ATmega do bebechów procesora nie zajrzysz, więc jak program nie działa - to siedzisz i zgadujesz, co jest źle. W każdym 32-bitowcu masz interfejs debugowania, więc na ekranie PC podglądasz dowolnie rejestry i zmienne oraz zatrzymujesz program w dowolnym miejscu i wykonujesz krokowo instrukcja po instrukcji. (Ok, niektóre nowsze 8-bitowce, te droższe 3x od 32-bitowych Cortexów, też to potrafią).
  • #89
    Piotr Piechota
    Level 21  
    BlueDraco wrote:

    W ATmega do bebechów procesora nie zajrzysz, więc jak program nie działa - to siedzisz i zgadujesz, co jest źle. W każdym 32-bitowcu masz interfejs debugowania, więc na ekranie PC podglądasz dowolnie rejestry i zmienne oraz zatrzymujesz(...)

    Używam do AVR'ów Dragona - można zajrzeć co się dzieje w środku :D
    Działa m.in z ATiny13 za 3PLN

    Pozdrawiam
  • #90
    BlueDraco
    MCUs specialist
    O ile pamiętam, ATtiny13 nie ma możliwości debugowania. Za to STM32F030 i Kinetis MKL03/04 po 2 zł taką możliwość mają. ;)