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

[STM32][USART][DMA] - Nadawanie przez USART z wykorzystaniem DMA STM32DISCOVERY

wojlej 17 Lut 2013 22:32 24900 125
  • #31
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Najlepiej zrobić ping-ponga - dwa bufory, do jednego pakujesz dane, z drugiego wysyłasz po UART, po zakończeniu serii pomiarów zmieniasz bufory miejscami. Równie dobrze możesz ADC taktować timerem i po skończeniu serii DMA wygeneruje Ci przerwanie, w którym dokonujesz tej zamiany i odpalasz kolejną serię. Trzeba tylko zadbać o to, żeby w tym momencie "zamiany" nie było "nieregularności" w próbkowaniu, ale to raczej nie będzie problemem...

    4\/3!!
  • #32
    Użytkownik usunął konto
    Użytkownik usunął konto  
  • #33
    wojlej
    Poziom 17  
    Chciałem znać tylko opinie. To wszystko, nie uparłem się, słucham mądrzejszych. Wiem, że wyzwalając pomiar Timerem będę miał w zanadrzu ważny parametr jakim jest częstotliwość próbkowania więc na pewno tą metodę wybiorę.

    Dane z przetwornika są 12 bitowe, ale przecież zapisywane na 16 bitach. Więc mogę jeszcze zastosować maskowanie na pierwszych czterech bitach najbardziej znaczących co do numeru kanału itp. Musze się jeszcze zastanowić jak to wszystko połączyć, bo wysłanie przez USART musi nastąpić po zapełnieniu całej tablicy i musi zdążyć zostać wysłane przed zapełnieniem po raz drugi. Na początek spróbuje próbkować co 25us, czyli co 100us każdy kanał. Muszę jeszcze przeliczyć ile zajmie wysłanie tablicy przez USART. Trzeba uniknąć sytuacji że kolejne dane zostaną przeniesione do bufora przed całkowitym wysłaniem poprzedniego.
  • #34
    BlueDraco
    Specjalista - Mikrokontrolery
    Dlatego właśnie każdy z nas pisze Ci tu o dwóch buforach na dwa komplety próbek, albo o jednym o podwójnej pojemności - czytaj!!!
    Timer inicjuje przetwarzanie, a potem kolejne przerwanie timera lub przerwanie od zakończenia transmisji DMA z ADC inicjuje transmisję świeżych pomiarów przez UART. W tym czasie ADC już robi następne pomiary do drugiego bufora.

    Podejrzewam, że przy transmisji przez UART / VCOM na PC największy problem będziesz miał z obsługą tego strumienia danych na PC. VCOM nie jest zbyt szybki - 64 KB/s raczej bez problemu, ale powyżej - różnie może być.
  • #35
    Freddie Chopin
    Specjalista - Mikrokontrolery
    wojlej napisał:
    Muszę jeszcze przeliczyć ile zajmie wysłanie tablicy przez USART. Trzeba uniknąć sytuacji że kolejne dane zostaną przeniesione do bufora przed całkowitym wysłaniem poprzedniego.

    Nie uda Ci się to raczej i nie wiem po co kombinować... Muszą być DWA bufory (uwaga techniczna - przerwanie DMA w połowie transferu sprawia, że masz "prawie" dwa bufory i też stanowi rozwiązanie tego problemu).

    4\/3!!
  • #36
    wojlej
    Poziom 17  
    Cytat:
    Dlatego właśnie każdy z nas pisze Ci tu o dwóch buforach na dwa komplety próbek, albo o jednym o podwójnej pojemności - czytaj!!!


    Czytam czytam.

    Na razie rozumiem to w ten sposób:

    Generuje przerwanie od Timera co 25µs:
    1 przerwanie - próbkowanie 1 kanału i transmisja DMA do tablicy 1
    2 przerwanie - próbkowanie 2 kanału i transmisja DMA do tablicy 1
    3 przerwanie - próbkowanie 3 kanału i transmisja DMA do tablicy 1
    4 przerwanie - próbkowanie 4 kanału i transmisja DMA do tablicy 1
    5 przerwanie - próbkowanie 1 kanału i transmisja DMA do tablicy 1
    .
    .
    .
    x przerwanie - próbkowanie n kanału i transmisja przez DMA do tablicy 1, -> zamiana tablicy 1 z 2 i rozpoczęcie transmisji przez USART.
    i ponowne zapełnianie tablicy numer 1

    Czy tak?
  • #37
    BlueDraco
    Specjalista - Mikrokontrolery
    Nie.

    Start: programujesz ADC na jednorazową konwersję wszystkich kanałów z wyzwalaniem przez timer, timer do wyzwalania ADC i DMA do odbioru danych z ADC do bufora 1.

    1. Timer inicjuje sprzętowo pracę ADC, DMA wcześniej zaprogramowane na zrzucanie wyników ADC do bufora 1 transmituje wyniki ADC do tego bufora.

    2. Przerwanie zakończenia DMA z ADC programuje DMA do odbioru z ADC do bufora 2, przygotowuje dane do wysłania przez UART i programuje DMA do transmisji z bufora 1 do UART.

    3. Kolejne zawinięcie timera sprzętowo wyzwala ADC - tym razem dane będą zrzucane do bufora 2, bo tak wcześniej zaprogramowano DMA dla ADC.

    4. Przerwanie zakończenia DMA z ADC programuje DMA do odbioru z ADC do bufora 1, przygotowuje dane do wysłania przez UART i programuje DMA do transmisji z bufora 2 do UART.

    I tak w kółko - zawracamy do fazy 1. Przy takiej realizacji potrzeba tylko jednego przerwania - od zakończenia DMA z ADC.

    Do zaprogramowania tego przyda Ci się taka instrukcja:

    akt_bufor ^= bufor1 ^ bufor2;

    W ten sposób obsługa przerwania nie musi zawierać rozejścia na przypadek z buforem 1 i buforem 2 - zawsze wykonuje tę samą liniową sekwencję instrukcji.
  • #38
    wojlej
    Poziom 17  
    Ok, dzięki, mniej więcej już wiem jak to ma wyglądać.

    Cytat:
    2. Przerwanie zakończenia DMA z ADC programuje DMA do odbioru z ADC do bufora 2, przygotowuje dane do wysłania przez UART i programuje DMA do transmisji z bufora 1 do UART.

    Czyli W punkcie 2 już następuje transmisja?

    Cytat:
    Przy takiej realizacji potrzeba tylko jednego przerwania - od zakończenia DMA z ADC.


    A nie dwóch? Jedno Timer co 25µs i drugie zakończenie DMA z ADC?
  • #39
    Freddie Chopin
    Specjalista - Mikrokontrolery
    No ale co Ty chcesz korzystać z przerwania od timera żeby włączyć RĘCZNIE ADC i RĘCZNIE wysłać JEDNĄ próbkę przez DMA?

    4\/3!!
  • #41
    wojlej
    Poziom 17  
    Proszę o sprawdzenie kodu konfiguracyjnego, Na razie dla STM32VLDiscovery. Skonfigurowałem Timer, ADC i DMA. Nie mam jeszcze skonfigurowane przerwania od zakończenia DMA.

    Funkcja Board();
    Kod: cpp
    Zaloguj się, aby zobaczyć kod
  • #42
    BlueDraco
    Specjalista - Mikrokontrolery
    Kod z użyciem bibliotek koszmarnie się czyta, a poza tym jest straszliwie długi. Skąd wziąłeś takie inicjiowanie ADC, bo na pewno nie z Manuala. Ten kod jest zdecydowanie błędny - kalibracja nie tu gdzie trzeba.

    Zajrzyj najpierw do dokumentacji - naprawdę wiele rzeczy jest tam opisanych.

    Cała magia związana z NVIC całkowicie zbędna, a nawet szkodliwa - wystarczy NVIC_EnableIRQ(nazwa_przerwania); i powinno się to robić na końcu, po zainicjowaniu peryferiali.

    Timer, który ma wyzwalać ADC, uruchamiasz przed zaprogramowaniem ADC i DMA - kolejna ciekawostka.
  • #43
    wojlej
    Poziom 17  
    Generalnie korzystam z dwóch książek:
    "STM32 Aplikacje i ćwiczenia w języku C" M. Galewski
    "Mikrokontrolery STM32 w praktyce" K. Paprocki

    Tam wszystko jest opisane za pomocą tych właśnie bibliotek, rozumiem, że korzystania z tych bibliotek jest "nieoptymalne". Zużywamy więcej pamięci i realizacja procedur jest dłuższa bo są tu funkcje które odwołują się do innych i przenoszą pomiędzy nimi jakieś parametry, ale poruszanie się po rejestrach tego procesora to mnie jeszcze przerasta (przynajmniej tak mi się wydaje).

    Wprowadziłem poprawki, zmieniłem kolejność inicjalizacji:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    Kontroler przerwań na końcu i timer przed nim. Konfiguracja ADC też po DMA. W kodzie DMA był też błąd co do inicjalizacji kanału, konfigurowałem kanał 4 podczas gdy ADC jest pod kanałem 1 - poprawione

    Co do konfiguracji ADC:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    Funkcje konfiguracyjne zaczerpnięte z powyższych książek
    Przetwornik skonfigurowany do pracy niezależnej, z włączonym skanowaniem kanałów i pomiarem w trybie jednokrotnym. Wyzwalanie pomiaru przez Timer1, kanał 1, wyrównywanie danych do prawej i liczba kanałów 4. Potem inicjalizacja i przypisanie kanału 1...4 do grupy podstawowej z czasem próbkowania 1,5 taktu.

    Następnie włączane DMA dla ADC, włączenie ADC i kalibracja.

    Cytat:
    kalibracja nie tu gdzie trzeba.


    W manualu, str. 215 jest napisane:
    Code:
    It is recommended to perform a calibration after each power-up.

    Więc wykonuje ją po włączeniu zasilania.

    Wydaje mi się, że tak miał być skonfigurowany przetwornik.

    Spróbuje jeszcze przejrzeć manual, może coś wychwycę
  • #44
    SeerKaza
    Poziom 20  
    Podłącze się do tego tematu ale jak będę bardzo przeszkadzać zrobię sobie nowy :P

    Wiec tak próbuje uruchomić USARTA i robić własne biblioteki nie chce korzystać z gotowych. I mam kilka pytanek. We wzorze na Baudrate Fpclk oznacza taktowanie szyny na której jest USART czyli jak używam USART3 to mam zegar z APB1 czyli w przypadku stm32f4discovery gdy rdzeń taktowany jest 168 MHz to na szynie mam 84MHz i to powinienem użyć do obliczeń tak ?? (rozbudowuje przykład Freddiego)
    I kolejne pytanko przed procedurą która jest opisana w manualu by uruchomić USART powinienem także włączyć mu zegar w RCC->APB1ENR ?
  • #45
    BlueDraco
    Specjalista - Mikrokontrolery
    wojlej:
    ADC trzeba skalibrować przed włączeniem go do pomiarów. Zobacz, które bity NIE mogą być ustawione podczas kalibracji - jest o tym w manualu. Podpowiem - ADEN, czyli enable.
    Co do Twoich obaw dot. rejestrów - jeśli potrafisz "ogarnąć" pola struktur, to potrafisz i rejestry. Dla mnie pierwszy argument za nieużywaniem bibliotek - to ilość kodu, którą musi napisać programista - programy bez bibliotek są 3..6 razy krótsze w zapisie. Drugi - to tracenie czasu na studiowanie zasad pracy z bibliotekami zamiast poznawania mikrokontrolera, co i tak kiedyś nieuchronnie będzie musiało nastąpić.

    Ser_cośtam:
    Kiedy chcesz użyć dowolnego peryferiala w dowolnym mikrokontrolerze z Cortex, to musisz mu najpierw włączyć zegar (no powiedzmy, że dotyczy to 95% przypadków). W wielu Cortexach jest jeszcze rejestr resetowania peryferiali, a w niektórych domyślnie peryferiale są w stanie reset, więc trzeba je jeszcze wstępnie "odresetować". A, i nie używaj wzoru na podzielnik BR z biblioteki ST - jest błędny i strasznie skomplikowany, wystarczy zwykłe (fclk + baudrate/2)/baudrate.

    (Freddie - widzisz, napisałem dzielenie przez 2!) :)
  • #46
    Freddie Chopin
    Specjalista - Mikrokontrolery
    BlueDraco napisał:
    A, i nie używaj wzoru na podzielnik BR z biblioteki ST - jest błędny i strasznie skomplikowany, wystarczy zwykłe (fclk + baudrate/2)/baudrate.

    No właśnie - ja do tej pory nie rozumiem o co im chodzi z tym wzorem, przecież ten wzór po uproszczeniu jest wręcz TĘPY i daje takie same wyniki, więc po co ta całą gadanina o mantysach, ułamkach i tym podobnych bzdurach? Nie wiem jeszcze jak ten uproszczony wzór się sprawdzi w przypadku oversamplingu przez 8 (domyślnie 16), ale coś czuję, że wystarczy go wtedy pomnożyć/podzielić przez 2 i już.

    BlueDraco napisał:
    (Freddie - widzisz, napisałem dzielenie przez 2!)

    Jesteś na dobrej drodze - jeszcze kilka miesięcy i na wspomnienie o typie flo.. nie będziesz dostawał gęsiej skórki (;

    4\/3!!
  • #47
    wojlej
    Poziom 17  
    Cytat:
    ADC trzeba skalibrować przed włączeniem go do pomiarów. Zobacz, które bity NIE mogą być ustawione podczas kalibracji - jest o tym w manualu. Podpowiem - ADEN, czyli enable.


    A więc tak, w manualu nie ma nic o ADEN, jako Enable jest ADON. I jest faktycznie napisane:

    Cytat:
    Before starting a calibration the ADC must have been in power-off state (ADON bit = ‘0’) for at least two ADC clock cycles.


    Więc moja funkcja ADC wygląda tak:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    Włączyłem ADON bez użycia bibliotek. Czy o to chodzi? Tylko, że kod mi się nie kompiluje, nie wiem co dodać, bo kompilator nie wie co to CR2_ADON_Set.

    Dodałem adc.h
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    Ale to nic nie dało.

    Dodatkowo mam odczekać dwa cykle zegara, ale nie wiem za bardzo jak.
  • #48
    m.ki
    Poziom 15  
    wojlej napisał:
    Włączyłem ADON bez użycia bibliotek. Czy o to chodzi? Tylko, że kod mi się nie kompiluje, nie wiem co dodać, bo kompilator nie wie co to CR2_ADON_Set.


    Aby wyłączyć:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    Aby włączyć:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    wojlej napisał:
    Dodatkowo mam odczekać dwa cykle zegara, ale nie wiem za bardzo jak.


    Najprościej - wykonać jakąkolwiek instrukcję pomiędzy. Jakieś przypisanie czy cokolwiek, co może być w tym miejscu akurat.

    Pozdrowienia,
    m.ki
  • #49
    wojlej
    Poziom 17  
    Dzięki,

    Chyba mogę włączyć DMA dla ADC po kalibracji a nie przed?
    Mogę to zrobić instrukcją:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    W ten sposób mogę odczekać?

    Przepisanie tego kodu na kod bez bibliotek to wyzwanie, postaram się to zrobić :)

    Kolejne pytanie:
    Aktualnie pisze ten kod na F0, ale w przyszłości może będę chciał go przenieść na F4, Czy będzie dużo modyfikacji? Zegar na pewno ale czy definicje peryferiów?
  • #50
    SeerKaza
    Poziom 20  
    Znowu się na chwilkę wepchnę w temat czy podczas inicjalizacji takie równanie da prawidłowy wynik czy mogą wyjść jakieś krzaczory.

    UART->BRR = (uint16_t) ((fpclk + (baud>>1))/baud);

    UART to wskaźnik pobierany przez funkcje inicjalizującą
  • #51
    Freddie Chopin
    Specjalista - Mikrokontrolery
    A czemu miałoby nie dać prawidłowego? Możesz sobie darować to rzutowanie, bo jest zbędne, a przy okazji odezwij się za kilka miesięcy i daj znać czy pamiętasz że pisząc ">> 1" chodziło Ci o dzielenie przez 2 (kompilator sam by na to wpadł) (;

    4\/3!!
  • #52
    wojlej
    Poziom 17  
    Nie wiem czy dobrze operuje na tych rejestrach więc proszę o pomoc. Oto część kodu konfiguracji Rejestru CR1 ADC

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    I jeszcze pytanie, Czy nie można wpisać do rejestru konkretnej wartości w hex? Przecież byłoby jeszcze łatwiej np:

    [STM32][USART][DMA] - Nadawanie przez USART z wykorzystaniem DMA STM32DISCOVERY

    Poniżej konfiguracja bitów najpierw nazwa bitów, w nawiasie kwadratowym jego numer i opis jak go rozumiem, co do niektórych nie jestem pewny np: JAUTO, AWDSGL, AWDIE itp.

    [31...24] = 0 Zarezerwowane
    AWDEN [23] = 0 (Analogowy Watchdog off)
    JAWDEN [22] = 0 (Analogowy Watchdog dla wstrzykiwanych off)
    [21...20] = 0 Zarezerwowane
    DUALMOD [19...16] = 0000 (Tryb niezależny)
    DISCNUM [15...13] = 011 (4 kanały do skanowania)
    JDISCEN [12] = 0 (Pomiar ciągły dla kanałów wstrzykiwanych)
    DISCEN [11] = 1 (Pomiar jednokrotny dla kanałów regularnych)
    JAUTO [10] = 0 (Brak konwersji dla wstrzykiwanych)
    AWDSGL [9] = 0 (Włączenie Watchdoga dla wszyskich kanałów)
    SCAN [8] = 1 (Tryb skanowania kanałów włączony)
    JEOCIE [7] = 0 (Przerwanie z kanałow wsztrzykiwanych wyłączone)
    AWDIE [6] = 0 (Przerwanie z Watchdoga wyłączone)
    EOCIE [5] = 1 (Przerwanie z zakończenia konwersji włączone)
    AWDCH [4...0] = 00000 (Kanał 0 dla watchdoga)

    Wychodzi 00000000000000000110100100100000 [bin] czyli 0x6920

    Nie można wpisać do ADC_CR1 wartości 0x6920? Np ADC1->CR1 = 0x6920;

    Albo coś w tym stylu?
  • #53
    Freddie Chopin
    Specjalista - Mikrokontrolery
    wojlej napisał:
    Nie można wpisać do ADC_CR1 wartości 0x6920? Np ADC1->CR1 = 0x6920;

    Można. Wtedy prośba do Ciebie taka sama jak wyżej do SeerKaza - zgłoś się za kilka miesięcy i daj znać czy pamiętasz co to 0x6920 znaczy.

    Ze skrajności w skrajność po prostu... Najpierw prezentujesz wielkie operacje logiczne w 4 linijkach (dobrze że nie w 14tu...), alternatywą jest oczywiście tylko wpisanie wartości 0x6920... Nie można np wpisać w JEDNEJ linijce tylko tego co trzeba, ale w postaci zrozumiałej:

    ADC1->CR1 = ADC_CR1_SCAN | ADC_CR1_DISCEN | ADC_CR1_DISCNUM_0 | ADC_CR1_DISCNUM_1;

    Nieee... tak się na pewno nie da i nie zadziała...

    4\/3!!
  • #54
    wojlej
    Poziom 17  
    Cytat:
    Nieee... tak się na pewno nie da i nie zadziała...


    Zapewne zadziała :)
    I oczywiście jest bardziej zrozumiałe:

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    Siedzę z wydrukowanym manualem ale i tak nie mam pewności czy na pewno jest ok. Nie powinienem najpierw resetować rejestru wpisując 0x0?
    W rejestrze SMPR2 ustawienie SMP0, 1, 2, 3 w 0 da próbkowanie 1,5 cyklu. W takim razie mam go resetować? Czy po uruchomieniu uC Procesor sam zeruje wszystkie rejestry? Nie wiem jeszcze czy poprawnie wykonuje kalibracje, Manual mówi że mam zresetować kalibracje i odczekać aż się zakończy (zmieni się stan RSTCAL), potem wykonać kalibrację i odczekać aż zmieni się stan CAL. Proszę o sprawdzenie i dziękuje za wszelkie wskazówki.
  • #55
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Ja się chyba nigdy nie dowiem co niektórzy widzą w tych operacjach logicznych? Powiedz mi proszę PO CO te wszystkie "|="? Obchodzi Cię co tam było poprzednio? Naprawdę chcesz to zachować? A zaraz potem pytasz:
    wojlej napisał:
    Nie powinienem najpierw resetować rejestru wpisując 0x0?

    Zupełnie bezsensu... Po co zerować rejestr tylko po to, żeby potem wpisać do niego coś przez "|="? Nie można po prostu OD RAZU wpisać co trzeba? Przecież w większości tych linijek te operacje są pozbawione jakiegokolwiek uzasadnienia (no chyba że polujesz na potencjalne problemy które mogą z nich wyniknąć, ewentualnie starasz się na siłę napisać kod który jest nieoptymalny)...

    wojlej napisał:
    Czy po uruchomieniu uC Procesor sam zeruje wszystkie rejestry?

    Po pierwsze - czy zamiast się zastanawiać nad tym nie prościej operację "|=" zastąpić przez "="? Po drugie - czy przypadkiem w manualu nie są podane wartości domyślne?

    Naprawdę, skończ z tym ORem, bo to jest proszenie się o kłopoty...

    4\/3!!
  • #56
    wojlej
    Poziom 17  
    No tak, wystarczy nadpisać dane wartości...

    Cytat:
    Po drugie - czy przypadkiem w manualu nie są podane wartości domyślne?


    W "ADC register map" są wypisane same zera więc domyślam się że wszystkie rejestry są wyzerowane, i to by było całkiem logiczne.

    Cytat:
    Naprawdę, skończ z tym ORem, bo to jest proszenie się o kłopoty...


    Postaram się.

    Czy w takim razie kod teraz jest poprawny? Zgodny z założeniami?
    Kod: cpp
    Zaloguj się, aby zobaczyć kod
  • #57
    Freddie Chopin
    Specjalista - Mikrokontrolery
    wojlej napisał:
    Czy w takim razie kod teraz jest poprawny? Zgodny z założeniami?

    No teraz też nie [; Dwie pierwsze linijki są OK, używasz przypisania, ale potem już powinieneś używać OR, bo przy KOLEJNEJ operacji na tym samym rejestrze już chcesz zachować to co tam było (no, ewentualnie możesz powtarzać pełne przypisanie, ale to mało wygodne).

    Kod: C
    Zaloguj się, aby zobaczyć kod


    Poprzednio w sumie niezbyt jasno napisałem o co mi się rozchodzi, sorry (;

    4\/3!!
  • #58
    BlueDraco
    Specjalista - Mikrokontrolery
    Ja już nie wiem, jaki uC w końcu programujesz, bo na STM32F0 mi to nie wyglądało i nie wygląda nadal. Dla F0 kolejność czynności jest taka:
    - włączasz ADC w AHB1ENR
    - (możesz na samym początku, ale nie musisz) skonfigurować kanały, tryb i parametry próbkowania, nie startując konwersji ani nie włączając bitu ADEN
    - włączasz tryb kalibracji - ADCAL
    - kontyuujesz inicjowanie innych kawałków uC
    - po sprawdzeniu wyzerowania ADCAL włączasz ADEN
    - po sprawdzeniu ustawienia ADRDY włączasz konwersję

    Kod demostracyjny znajduje się w moim tutorialu do F0, który czeka na publikację *gdzieś*.
  • #59
    Freddie Chopin
    Specjalista - Mikrokontrolery
    BlueDraco napisał:
    Kod demostracyjny znajduje się w moim tutorialu do F0, który czeka na publikację *gdzieś*.

    Możesz go wrzucić na forum albo założyć stronkę na serwerach elektrody (; Lepiej to drugie, bo łatwiej znaleźć. Albo nawet ja Ci to mogę pohostować [;

    4\/3!!
  • #60
    wojlej
    Poziom 17  
    Cytat:
    Ja już nie wiem, jaki uC w końcu programujesz, bo na STM32F0 mi to nie wyglądało i nie wygląda nadal


    Panowie wybaczcie za mój skrajny głupi błąd. Niechcący korzystałem z manuala dla F3, a mam przecież STM32VLDiscovery na której siedzi F0. W wolnej chwili wprowadzę poprawki. I jeszcze pytanie? Czy do założeń tego co robie, czyli skanowanie 4 kanałów i wysyłanie po USART wystarczy F0? Czy może zaopatrzyć się w F3 bądź w F4? Chodzi tu głównie o częstotliwości próbkowania i wydajność. Jaki procesor Panowie by wybrali?