logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[STM32F4] - Jak skonfigurować DMA do przesyłania danych z DCMI do SRAM?

rezontor 28 Gru 2014 01:34 7167 60
Najlepsze odpowiedzi

Jak poprawnie skonfigurować DMA, aby odbierać dane z DCMI do SRAM w STM32F4?

DMA masz źle ustawione przede wszystkim pod względem liczby transferów i szerokości danych — dla bufora typu `uint32_t` wartość `DMA_BufferSize` musi oznaczać liczbę słów, więc zamiast 38400 powinno być 9600, a dla rozdzielczości 176×144×2 wychodzi 12672; dodatkowo `DMA_MemoryDataSize` ustaw na `Word`, nie `Byte` [#14266241][#14278649] Jeśli chcesz wykonać kolejne zdjęcia bez ponownej konfiguracji DMA, ustaw tryb `circular`, bo w `normal` transfer zakończy się po jednej ramce [#14266241] Na start warto też wyłączyć przerwania i sprawdzić sam odbiór DCMI→DMA bez czekania w ISR, żeby wykluczyć problem z obsługą przerwań [#14275418] Gdy DMA zacznie działać, koniecznie sprawdź też zegar XCLK i konfigurację PLL kamery, bo zbyt szybki lub błędny zegar powoduje niepoprawne dane albo brak poprawnej konfiguracji sensora [#14277487][#14277657]
Wygenerowane przez model językowy.
REKLAMA
  • #1 14262601
    rezontor
    Poziom 15  
    Posty: 210
    Pomógł: 1
    Ocena: 13
    Witam.

    Piszę właśnie program, którego zadaniem jest pobranie 1 klatki (zrobienie zdjęcia) z kamery MT9D111 (nota katalogowa: http://www.dragonwake.com/download/camera/MT9D111/mt9d111_rev5.pdf ) Klatki z kamery będzie pobierał mikrokontroler STM32F429, taktowany częstotliwością 180MHz.

    Wzoruję się na informacjach zawartych na stronie: http://www.stm32.eu/node/307

    Napisałem podstawowe funkcje, konfigurujące:

    - PORTY GPIO, wykorzystane do komunikacji z kamerą:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    - RCC (dołączenie sygnałów taktujących do peryferii)

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    - układ interfejsu kamery DCMI oraz DMA:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod



    - układ przerwań NVIC

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    - oraz układ I2C do wysyłania ustawień do kamery:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Później, w programie głównym, wywołuje powyższe funkcje konfigurujące:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod



    Następnie, sprawdzam, czy kamera jest podłączona i inicjalizuję kamerę:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Jeżeli chodzi o funkcję inicjalizującą kamerę i inne funkcje związane z kamerą - są one w osobnym pliku i przedstawiają się tak:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod




    Teraz, gdybym chciał wykonać zdjęcie, wywołuję w pętli głównej funkcję wykonaj_foto():

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod



    Czyli w tym momencie, po wywołaniu funkcji wykonaj_foto(), układ DMA powinien wysłać dane do RAMU - do tablicy, zdefiniowanej wcześniej w programie:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    do której DMA powinien wysyłać dane z DCMI, jak zostało skonfigurowane w 3 funkcji w poście (czyli DCMI_Config() ):

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Tablica ma rozmiar 9600, ponieważ będą przesyłane obrazy o rozdzielczości (tak ustaliłem) 160 x 120 pikseli, w formacie 565RGB (czyli po 2B na piksel). Wynika z tego, że potrzebuję 160*120*2 = 38 400 bajtów w tablicy. Każda komórka tablicy ma 4B, więc potrzebuję 38 400 / 4 - 9600 komórek typu uint32.

    Teraz chciałbym zapytać, co robię źle... Program, po wgraniu do mikrokontrolera nie działa. Efektem wywołania funkcji robiącej zdjęcie powinna być zapełniona tablica bufor_RAM_danych_obrazka, jednak tak nie jest. Czym to może być spowodowane?

    Czy jest może źle układ DMA skonfigurowany? - mam wątpliwości w miejscach:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • Pomocny post
    #2 14266241
    A.T.
    Poziom 20  
    Posty: 538
    Pomógł: 5
    Ocena: 70
    Sam napisałeś 38400 / 4 to czemu zapisujesz do DMA 38400, a nie 9600?
    No i to:
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
    też bym ustawił na DMA_MemoryDataSize_Word.

    Pozdrawiam

    Dodano po 3 [minuty]:

    No i tak jak masz teraz ustawione DMA w trybie Normal to ta funkcja wykonaj_foto zadziała tylko raz, później będziesz musiał na nowo konfigurować DMA. Lepiej przestaw je w opcję circular.
  • REKLAMA
  • #3 14275128
    rezontor
    Poziom 15  
    Posty: 210
    Pomógł: 1
    Ocena: 13
    A.T. napisał:
    Sam napisałeś 38400 / 4 to czemu zapisujesz do DMA 38400, a nie 9600?

    Poprawiłem.
    A.T. napisał:
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
    też bym ustawił na DMA_MemoryDataSize_Word.

    Chciałbym, aby dane w RAMIE były zapisane jako struktury 8 bitowe - łatwiej później będzie to przetwarzać.

    Dodano po 3 [sekundy]:

    A czy taka konfiguracja przerwań od układu DCMI jest poprawna?

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #4 14275418
    A.T.
    Poziom 20  
    Posty: 538
    Pomógł: 5
    Ocena: 70
    To nie jest konfiguracja tylko funkcja obsługi przerwania. Ta pętla while czekająca na koniec odbioru wygląda nie najlepiej w funkcji przerwania. Na początek spróbuj bez przerwań czy w ogóle działa.
  • REKLAMA
  • #5 14277269
    rezontor
    Poziom 15  
    Posty: 210
    Pomógł: 1
    Ocena: 13
    Niestety, ale nie działa. Program zatrzymuje się na:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    w funkcji
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Dodano po 19 [minuty]:

    2 rzecz. Przykład ze strony http://www.stm32.eu/node/307/page/0/3 zakłada, że częstotliwość taktowania mikrokontrolera jest równa 168MHz. Wtedy sygnał taktujący kamerę, po podzieleniu przez 3, wynosi XCLK = 56MHz. W moim przypadku częstotliwość taktowania wynosi 180MHz i dzieląc ją przez 3, otrzymuję 60MHz. Czy ta zmiana zegara wiąże się ze zmianami wartości wpisywanych do rejestrów kamery? Na stronie http://www.stm32.eu/node/310 jest napisane, że "Oprócz tego do podłączenia pozostał jeszcze jeden sygnał: sygnał zegara taktującego który trzeba podać do modułu.. Zazwyczaj częstotliwość zegara w przypadku różnego typu modułów zawiera się w granicach 6...80 MHz." Więc mieści się w tym przedziale...

    Chodzi mi o fragment:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #6 14277487
    TvWidget
    Poziom 38  
    Posty: 4391
    Pomógł: 471
    Ocena: 691
    Kamery zwykle mają wewnętrzny PLL. Częstotliwość sygnału XCLK i wartości wpisywane do rejestrów kamery muszą być odpowiednio dobrane.
  • Pomocny post
    #7 14277657
    A.T.
    Poziom 20  
    Posty: 538
    Pomógł: 5
    Ocena: 70
    A rejestry Ci się konfigurują? Bo jak nie ma sygnału zegarowego XCLK albo jest niepoprawny to nawet rejestrów przez I2C nie da się skonfigurować.
    Zgadza się w kamerze jest PLL, w datasheet masz wzór gdzie dobierasz 3 wartości i wpisujesz to tych dwóch rejestrów:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #8 14277839
    rezontor
    Poziom 15  
    Posty: 210
    Pomógł: 1
    Ocena: 13
    Dzisiaj wszystko jeszcze raz uruchomiłem i o dziwo zaczęły przychodzić dane z kamery, a program się nie zawiesza.

    Dodałem w programie takie polecenia:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Najpierw jest zerowana tablica, do której trafią dane z kamery. Następnie kamera jest uruchamiana i jest robione zdjęcie. W efekcie w tablicy bufor_RAM_danych_obrazka otrzymuję wartości, które przy pomocy funkcji USART_puts() wysyłam przez terminal.

    Otrzymuję następujące dane, które - jako log z terminala - zamieszczam w załączniku.


    Załącznik:
    Załączniki:
    • log_kamera.txt (209.32 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • #9 14278149
    A.T.
    Poziom 20  
    Posty: 538
    Pomógł: 5
    Ocena: 70
    Ten bufor zadeklarowałeś wcześniej o rozmiarze 9600, to skąd bierzesz tam jakieś 19200? Rozumiem, że nie masz wyświetlacza żeby zobaczyć co zwraca kamera. To spróbuj dodać nagłówek bmp do twoich danych i zobacz czy to co dostajesz to jest jakiś obraz.
  • #10 14278235
    rezontor
    Poziom 15  
    Posty: 210
    Pomógł: 1
    Ocena: 13
    A.T. napisał:
    Ten bufor zadeklarowałeś wcześniej o rozmiarze 9600, to skąd bierzesz tam jakieś 19200? R


    Zmieniłem rozdzielczość obrazu na większą.
    A.T. napisał:
    To spróbuj dodać nagłówek bmp do twoich danych i zobacz czy to co dostajesz to jest jakiś obraz.




    W Internecie znalazłem program enkodera.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod



    Nie wiem tylko za bardzo, w jaki sposób mogę przekazać moje dane do tej funkcji przetwarzającej do postaci BMP...
  • #11 14278352
    A.T.
    Poziom 20  
    Posty: 538
    Pomógł: 5
    Ocena: 70
    Hmm nie rozumiem problemu, wystarczy, że wywołasz tę funkcję z odpowiednimi argumentami:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Jako pierwszy argument podajesz wskaźnik do Twojego bufora z surowymi danymi czyli bufor_RAM_danych_obrazka, a jako przed ostatni wskaźnik do Twojego nowego bufora gdzie zostanie przepisany Twój obrazek i dodatkowo jeszcze dodany nagłówek bmp. Musisz jednak uważać, żeby zmieścić się w RAMie procka.
  • #12 14278599
    rezontor
    Poziom 15  
    Posty: 210
    Pomógł: 1
    Ocena: 13
    Rozumiem. Dziękuję za pomoc.

    Poczyniłem kilka zmian w programie. Utworzyłem drugą tablice - pierwsza to ta, która przyjmuje dane z kamery (bufor_RAM_danych_obrazka), a druga jest tablicą wyjściową z przekonwertowanym plikiem (p_bufor_RAM_pliku).

    W wcześniejszych definicjach tablic i określaniu danych do przesłania popełniłem błąd - nie wziąłem pod uwagę tego, że każdy piksel to 2B. Więc przy rozdzielczości 320 * 240, liczba danych wynosi: 76800 * 2B = 153600B = 150kB. Wynika z tego, że 2 tablice (dane z kamery i dane przekonwertowane) w wbudowanej pamięci RAM się nie zmieszczą (STMF429 ma 256kB RAMU).

    Muszę zatem zmniejszyć rozdzielczość do np. QCIF = 176 x 144 (szerokość = 176, wysokość = 144). Dane o obrazie będą wtedy zajmowały 50688 bajtów i dwie tablice się zmieszczą.

    Pomyślałem też nad zmianą typów tablic z:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    na
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod



    Czyli po podstawieniu za szerokość i wysokość konkretnych liczb mamy:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Zmiany wymusiły modyfikacje w konfiguracji DMA:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod



    W pętli głównej planuję umieścić takie wywołanie funkcji:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Po wywołaniu funkcji dostanę tablicę bajtów p_bufor_RAM_pliku , w której jest zdjęcie z kamery wraz z nagłówkiem BMP. Teraz wystarczy wysłać dane do komputera i ten ciąg liczb 8 bitowych zapisać w postaci pliku BMP.

    Chciałbym zapytać, czy powyższy tok pisania programu jest prawidłowy?
  • #13 14278649
    A.T.
    Poziom 20  
    Posty: 538
    Pomógł: 5
    Ocena: 70
    Dobrze kombinujesz, jednak źle zmieniłeś wartość danych jakie ma przesłać DMA. Tam podajesz ilość 4bajtowych paczek. Czyli dla Twojego nowego formatu będzie to: 176*144*2/4=12672, i tą wartość wpisujesz do DMA. Reszta wydaje mi si poprawna. Jedyne co, to przyglądnij się dokładnie ustawieniom formatu wyjściowego obrazu kamery. Nie może być ustawiona opcja "Swap even and odd bytes". Jeśli jest to uzyskasz obraz z zamienionymi kolorami bodajże R z B.
  • #14 14280367
    rezontor
    Poziom 15  
    Posty: 210
    Pomógł: 1
    Ocena: 13
    Aby otrzymać rozdzielczość 176 x 144, ustawiam rejestry w taki sposób:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod



    Po wywołaniu funkcji robiącej zdjęcie oraz konwertującej do postaci BMP, otrzymuję następujący ciąg bajtów (załącznik) - każdy bajt jest przedstawiony przy pomocy tekstu (0-255), a poszczególne bajty są oddzielone od siebie przecinkami.

    Zastanawiam się, w jaki sposób mógłbym zapisać teraz plik BMP. Czy wszystkie bajty zamienić na postać zero-jedynkową (bin) i zapisać pod rozszerzeniem *bmp?
    Załączniki:
    • obrazek.txt (190.16 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #15 14284889
    rezontor
    Poziom 15  
    Posty: 210
    Pomógł: 1
    Ocena: 13
    Zamieniłem otrzymane dane z kamery na postać binarną. Niestety, ale przeglądarka grafiki Windows informuje o uszkodzeniu pliku... Czym to może być spowodowane?
    Załączniki:
    • o.zip (17.67 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #16 14285413
    Dydelmax
    Poziom 39  
    Posty: 3834
    Pomógł: 654
    Ocena: 963
    rezontor napisał:
    Czym to może być spowodowane?

    Brakiem nagłówka dla BMP?
  • #17 14285713
    rezontor
    Poziom 15  
    Posty: 210
    Pomógł: 1
    Ocena: 13
    Dydelmax napisał:
    rezontor napisał:
    Czym to może być spowodowane?

    Brakiem nagłówka dla BMP?


    Naglówek jest automatycznie dodawany w funkcji Kodowanie_z_bufor_RAM_danych_na_BMP_do_RAM_pliku, którą wywołuję.
  • Pomocny post
    #18 14285751
    Dydelmax
    Poziom 39  
    Posty: 3834
    Pomógł: 654
    Ocena: 963
    Jakoś nie widzę tego nagłówka... (może po prostu nie mogę go znaleźć - sugeruję się tym: http://pl.wikipedia.org/wiki/Windows_Bitmap):
    [STM32F4] - Jak skonfigurować DMA do przesyłania danych z DCMI do SRAM?
    Dla porównania nagłówek pliku BMP (176x144) wypełnionego białymi pikselami:
    [STM32F4] - Jak skonfigurować DMA do przesyłania danych z DCMI do SRAM?
  • Pomocny post
    #19 14285978
    Konto nie istnieje
    Poziom 1  
  • #20 14286156
    rezontor
    Poziom 15  
    Posty: 210
    Pomógł: 1
    Ocena: 13
    Popełniłem błąd przy wywoływaniu funkcji konwertującej.

    Teraz otrzymuję taki plik, który nadal wydaje się być uszkodzony:
    Załączniki:
    • obraz.zip (10.27 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • Pomocny post
    #21 14286267
    Dydelmax
    Poziom 39  
    Posty: 3834
    Pomógł: 654
    Ocena: 963
    Przeszczepiłem (na chybił trafił) kilka bajtów z innego pliku BMP. Wynikiem przeszczepu jest to "coś" poniżej, co udało mi się otworzyć programem PhotoFiltre i zapisać jako PNG.
    [STM32F4] - Jak skonfigurować DMA do przesyłania danych z DCMI do SRAM?
    Tak wygląda nagłówek zmodyfikowanego pliku:
    [STM32F4] - Jak skonfigurować DMA do przesyłania danych z DCMI do SRAM?
    Nie znam się na strukturze plików BMP, więc nie wiem czemu plik wygląda tak a nie inaczej. Może paleta kolorów w pliku jest źle skonstruowana?
    EDIT: Bez modyfikacji nagłówka PhotoFiltre również odczytuje ten plik, pokazując to samo co wrzuciłem powyżej.
    EDIT2: Dane w pliku wyglądają na losowe śmieci. Wkleiłem fragment innego obrazka do tego pliku w hexedytorze i PhotoFiltre wyświetlił ten fragment poprawnie.
    [STM32F4] - Jak skonfigurować DMA do przesyłania danych z DCMI do SRAM?
  • #22 14286326
    rezontor
    Poziom 15  
    Posty: 210
    Pomógł: 1
    Ocena: 13
    Podobny obraz otrzymuję dla poprzedniego pliku, który został poprawiony: [STM32F4] - Jak skonfigurować DMA do przesyłania danych z DCMI do SRAM? Wygląda to na całkowicie losowe wartości.
  • Pomocny post
    #23 14286377
    Dydelmax
    Poziom 39  
    Posty: 3834
    Pomógł: 654
    Ocena: 963
    rezontor napisał:
    Wygląda to na całkowicie losowe wartości.

    Całkowicie losowe one jednak nie są. Pionowe linie w pliku powyżej przebiegają tak: linia z tylko zielonym kolorem (lub jego brakiem), linia z czerwonym i/lub niebieskim kolorem (lub ich brakiem). Wygląda to tak: G, R+B, G, R+B, G, R+B itd.
    EDIT: Końcówka pliku wygląda na uciętą. Po doklejeniu szumu do końca pliku poprzez dopisanie kolejnych bajtów (skutkujące zwiększeniem rozmiaru pliku), czarny pas na górze pliku zmienia się w doklejoną treść, w tym przypadku szum:
    [STM32F4] - Jak skonfigurować DMA do przesyłania danych z DCMI do SRAM?
    Dodatkowo, po uzupełnieniu końcówki plik można bezproblemowo otworzyć w innych programach (dodaję go w załączniku).
    Załączniki:
    • obraz_naprawiony.zip (9.54 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • Pomocny post
    #24 14286424
    Konto nie istnieje
    Poziom 1  
  • #25 14287243
    rezontor
    Poziom 15  
    Posty: 210
    Pomógł: 1
    Ocena: 13
    Aktualnie najważniejsze pliki programu wyglądają następująco:

    main.c:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod



    stm32f4xx_it.c:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    konfigPeryf.c:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    kamera.c:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    BMP_enkoder.c

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    usart.c:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #26 14288193
    kemot55
    Poziom 31  
    Posty: 1304
    Pomógł: 183
    Ocena: 146
    Rozumiem, że z kamery oczekujesz obrazu w formacie 565. Jeżeli będzie to BMP 2-bajtowa, to dobrze by było jednak nagłówek skopiować z tego co wytwarza zastosowana procedura tworzenia struktury BMP. Z przykładów i sztucznego dodawania "końcówki" wynika, że dekoder oczekuje formatu 24bit.
  • #27 14289004
    rezontor
    Poziom 15  
    Posty: 210
    Pomógł: 1
    Ocena: 13
    Sprawdziłem, jaką wartość zwracała funkcja
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    zgodnie z opisem konwertera (http://www.stm32.eu/node/346), funkcja powinna zwracać wartość inną niż zero - w moim przypadku zwracała zero, a to oznacza, że bufor wyjściowy jest za mały.

    Zwiększyłem więc bufor wyjściowy do wartości [76032+100]:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Po tym zwiększeniu, funkcja zaczęła zwracać wartość 76086. Oznacza to, że tyle bajtów jest w buforze wyjściowym, po konwersji. Wykorzystałem ten fakt w pętli wysyłającej dane do komputera:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod



    Pliki są wysyłane do komputera w postaci:

    66;77;54;99;0;0;0;0;0;0;54; ... itd

    Napisałem program w JAVIE, który odczytuje te dane dzieląc je wg separatora ";" i zapisując w tablicy int (po przekształceniu z tekstu na liczbę):
    Kod: Java
    Zaloguj się, aby zobaczyć kod


    Następnie jest wywoływana funkcja zapisująca plik:
    Kod: Java
    Zaloguj się, aby zobaczyć kod


    któa wygląda tak:

    Kod: Java
    Zaloguj się, aby zobaczyć kod


    Efektem działania funkcji jest plik bmp. Okazało się, że po tych modyfikacjach, pliki bmp są PRAWIDŁOWO zapisywane. Można je otworzyć przy pomocy systemowego programu do otwierania zdjęć. Problem jest z tym, że to, co jest na tych zdjęciach, jest całkowicie nieczytelne. Wykonałem 2 klatki przy różnych ustawieniach kamery - obrazek pierwszy powstał w zaciemnionym miejscu, a w przypadku obrazka drugiego - kamera patrzyła w kierunku światła. Mimo tych różnic w oświetleniu i położeniu obiektywu, zdjęcia są niemal identyczne (załącznik). Czym to może być spowodowane?
    Załączniki:
    • zdjecia.zip (29.22 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #28 14289110
    rezontor
    Poziom 15  
    Posty: 210
    Pomógł: 1
    Ocena: 13
    Tutaj jeszcze zamieszczam rozkład pinów, połączonych z kamerą:

    PA9 - DCMI_D0
    PC7 - DCMI_D1
    PC8 - DCMI_D2
    PC9 - DCMI_D3
    PC11 - DCMI_D4
    PD3  - SCMI_D5
    PE5 - DCMI_D6
    PE6 - DCMI_D7
    PB7 - DCMI_VSYNC
    PA4 - DCMI_HSYNC (HREF)
    PF0/PF1 - SDA/SCL'
    PA6 - DCMI_PIXCLK
    PA8 - XCLK
    

    PB8 - USART2_TX
    PB9 - USART2_RX

    ---
    Dodam, że gdy zmieniłem częstotliwość XCLK (na wyższą - podział 180MHz przez 2 a nie przez 3), otrzymałem zupełnie inne obrazy (załącznik; zdjęcia z 2 perspektyw).
    Załączniki:
    • obraz3_4.zip (21.44 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • Pomocny post
    #29 14289431
    kemot55
    Poziom 31  
    Posty: 1304
    Pomógł: 183
    Ocena: 146
    Jeżeli kamera zwraca obraz w formacie 565 to on nie może być zapisany do postaci 24bitowej ot tak sobie. Procedura p. Szymaniaka nie konwertuje obrazu z 565 (16bit) do 888 (24bit). Co prawda pojawia się parametr liczby bajtów na piksel, ale tylko po to żeby go przepisać do nagłówka bitmapy :-)
  • #30 14289483
    A.T.
    Poziom 20  
    Posty: 538
    Pomógł: 5
    Ocena: 70
    Jeśli potrafisz to zmierz zegar xclk. Jeśli nie, to zamień go na jakiś zdecydowanie niższy do 20MHz, a PLL w kamerze ustaw tak, aby zegar pclk nie przekraczał 30MHz. Najlepiej, żeby był z zewnętrznego generatora.

    Dodano po 1 [minuty]:

    A i którą wersję ustawienia bloku PLL masz odkomentowaną?

Podsumowanie tematu

✨ W dyskusji poruszono temat konfiguracji DMA w mikrokontrolerze STM32F429 do przesyłania danych z kamery MT9D111 do pamięci SRAM. Użytkownik opisał problemy z odbiorem danych, które objawiały się błędnymi obrazami oraz zbyt dużą ilością zer w przesyłanych danych. W odpowiedziach zasugerowano m.in. sprawdzenie ustawień zegara XCLK, poprawność konfiguracji rejestrów kamery oraz format danych. Użytkownik eksperymentował z różnymi ustawieniami, w tym z rozdzielczością obrazu, a także z konwersją danych do formatu BMP. Wskazano na konieczność dostosowania parametrów PLL kamery oraz na znaczenie poprawnej polaryzacji sygnałów HSYNC i VSYNC. Ostatecznie, po wprowadzeniu poprawek, użytkownik uzyskał lepsze wyniki, jednak nadal występowały problemy z jasnością i kolorem obrazów.
Wygenerowane przez model językowy.
REKLAMA