Przeszukaj forum
Pokazywanie wyników dla tagów 'FSMC'.
Znaleziono 2 wyniki
-
Ten wpis wynika z tego, że chciałem zrozumieć skąd się biorą ustawienia FSMC dla wyświetlaczy LCD. Doświadczenia przeprowadzałem na zestawie STM32F407VET6 nazywanym także "Black board" Schemat zestawu: Oryginalny kod konfigurujący FSMC dla LCD z dostarczonych przykładów wyglądał tak: readWriteTiming.FSMC_AddressSetupTime = 0XF; //地址建立时间(ADDSET)为16个HCLK 1/168M=6ns*16=96ns readWriteTiming.FSMC_AddressHoldTime = 0x00; //地址保持时间(ADDHLD)模式A未用到 readWriteTiming.FSMC_DataSetupTime = 60; //数据保存时间为60个HCLK =6*60=360ns readWriteTiming.FSMC_BusTurnAroundDuration = 0x00; readWriteTiming.FSMC_CLKDivision = 0x00; readWriteTiming.FSMC_DataLatency = 0x00; readWriteTiming.FSMC_AccessMode = FSMC_AccessMode_A; //模式A writeTiming.FSMC_AddressSetupTime =9; //地址建立时间(ADDSET)为9个HCLK =54ns writeTiming.FSMC_AddressHoldTime = 0x00; //地址保持时间(A writeTiming.FSMC_DataSetupTime = 8; //数据保存时间为6ns*9个HCLK=54ns writeTiming.FSMC_BusTurnAroundDuration = 0x00; writeTiming.FSMC_CLKDivision = 0x00; writeTiming.FSMC_DataLatency = 0x00; writeTiming.FSMC_AccessMode = FSMC_AccessMode_A; //模式A Przy okazji szacun za skuteczne boje wykorzystując do konfiguracji bibliotekę stdPeriph, podejrzewam że dzisiaj 90% projektów bez wizualnego projektowania w CubeMX nigdy by się nie uruchomiła... Uprzedzając tok poznania od razu wyjawię że powyższy kod jest konfiguracją osobną dla ODCZYTU: readWriteTiming.FSMC_AddressSetupTime = 0XF; //地址建立时间(ADDSET)为16个HCLK 1/168M=6ns*16=96ns readWriteTiming.FSMC_AddressHoldTime = 0x00; //地址保持时间(ADDHLD)模式A未用到 readWriteTiming.FSMC_DataSetupTime = 60; //数据保存时间为60个HCLK =6*60=360ns readWriteTiming.FSMC_BusTurnAroundDuration = 0x00; readWriteTiming.FSMC_CLKDivision = 0x00; readWriteTiming.FSMC_DataLatency = 0x00; readWriteTiming.FSMC_AccessMode = FSMC_AccessMode_A; //模式A oraz osobną dla ZAPISU do LCD: writeTiming.FSMC_AddressSetupTime =9; //地址建立时间(ADDSET)为9个HCLK =54ns writeTiming.FSMC_AddressHoldTime = 0x00; //地址保持时间(A writeTiming.FSMC_DataSetupTime = 8; //数据保存时间为6ns*9个HCLK=54ns writeTiming.FSMC_BusTurnAroundDuration = 0x00; writeTiming.FSMC_CLKDivision = 0x00; writeTiming.FSMC_DataLatency = 0x00; writeTiming.FSMC_AccessMode = FSMC_AccessMode_A; //模式A Wynika to z tego iż sterowniki LCD mają różne czasy dostępu dla odczytu i zapisu. Teraz przechodząc bardziej do szczegółów należy wiedzieć że: 1. Omawiany zestaw ma LCD 320x240 px ze sterownikiem ILI9341 2. Magistrala FSMC jest równoległa, emulując sprzętowo interfejs 16bit i8080 3. Procesor zapuszczamy na 168 [MHz] 4. Magistrala FSMC jest na szynie AHB3, co w tym przypadku napędza ją bezpośrednio zegarem porcesora bez podziału. 5. Należałoby policzyć że w przypadku taktowania 168 [MHz] 1 cykl magistrali zajmuje 5,9523 nanosekund [ns] co w przybliżeniu daje 6 [ns] Wiedząc już że należy posłużyć się datasheetem od ILI9341 oszczędzę jego wertowania i od razu pokażę dwie kluczowe strony, które będą podstawą do oszacowania timingu FSMC. Pierwszy to graf dla timingu interfejsu i8080, drugi to tabela z timingami dla tego interfejsu. Dobrze, teraz jak działa ten interfejs FSMC dla LCD w trybie i8080: Otóż interfejs ten steruje około 20 liniami sygnałowymi w zależności od wyboru operacji i adresu. Także sama konfiguracja FSMC poprzez wybór banku pamięci determinuje pod jakim adresem będzie dostępny interfejs FSMC i8080. Linie sterujące to: CS/ nazywana na schemacie FSMC_NE1 - aktywna w stanie niskim, oznacza wybór układu. Innymi słowy sterownik LCD po wybraniu CS/ dostosowuje się do ustawień pozostałych linii sterujących przygotowując się do przyjęcia danej z szyny danych, lub wystawienia danej na szynę. RS w nomenklaturze FSMC określana w tym wypadku jako FSMC_A18. Stan tej linii jest zależny od wybranego adresu i odpowiada za wybór zapisu/odczytu do/z rejestru sterownika, lub odczytu/zapisu danej z/na szyny/szynie danych. 0 oznacza wybór rejestru, 1 jest wyborem danych. RD FSMC_NOE output enable stan niski oznacza żądanie odczytu, wysoki oznacza stan nieaktywny. WR FSMC_NWE write enable stan niski oznacza żądanie zapisu, wysoki oznacza stan nieaktywny. Powyższe dwie linie wykluczają się pod względem jednoczesnego żądania zapisu i odczytu. Najprawdopodobniej ich użycie wynika z zaszłości historycznych, kiedy to linię WR przepuszczano przez inwerter tworząc parę RD/WR DB - magistrala danych FSMC_D1 do D15 W datasheet ILI9341 linie są określone jako: D/CX = RS (FSMC_Ax) CSX = CS/ (FSMC_NEx) WRX = WR (FSMC_NWE) RDX = RD (FSMC_NOE) Dla zapisu stan linii CS/ oraz WR musi być wystawiony zgodnie z danymi w tabelce. Interesują nas tutaj 3 podane timingi dla zapisu nazwane : Twc - Write cycle time | 66 [ns] minimum Twrh - Write control pulse H duration 15 [ns] minimum Twrl - Write control pulse L duration 15 [ns] minimum Te 3 parametry widać przy zaznaczeniu. W tabelce jest także uproszczenie dla tast "Address setup time" = 0 i taht "Address hold time" = 0 i w sumie dobrze, bo wszystko to da się osiągnąć odpowiednio konfigurując FSMC. tast, taht jak i wszystkie pozostałe parametry można odnaleźć na diagramie. Jest także parametr tcsf 10 ns minimum, który został "wkomponowany" w timing CS/ - o tym za chwilę. Jeszcze kolejne 3 parametry dla odczytu a są to: trcfm - Read Cycle (FM) 450 [ns] minimum trdlfm - Read Control pulse H duration (FM) 355 [ns] minimum trdlfm - Read Control pulse L duration (FM) 90 [ns] minimum Teraz można przyjrzeć się parametrom FSMC dla odczytu: readWriteTiming.FSMC_AddressSetupTime = 15; //地址建立时间(ADDSET)为16个HCLK 1/168M=6ns*16=96ns readWriteTiming.FSMC_AddressHoldTime = 0x00; //地址保持时间(ADDHLD)模式A未用到 readWriteTiming.FSMC_DataSetupTime = 60; //数据保存时间为60个HCLK Wartość parametru jest liczona od zera i określa ilość cykli magistrali. W przypadku FSMC_DataSetupTime = 60; daje to 61 cykli magistrali, czyli około 366 [ns]. Dla parametru FSMC_AddressSetupTime = 15; daje to 96 [ns] Są watości bardzo zbliżone do parametrów: trdlfm - Read Control pulse H duration (FM) 355 [ns] minimum trdlfm - Read Control pulse L duration (FM) 90 [ns] minimum Jeżeli założyć że to o nie chodzi, to czasy są prawidłowe, jedna nieścisłość jest tu, która wynika z diagramu timingu odczytu dla. Skoro to działa, to linia NOE powinna wyglądać jak NADV, przyjmuję że ten diagram jest niedokładnie oddający stan linii NOE. W każdym razie mamy takie ustawienia magistrali i to działa. Idąc dalej przechodzimy do zapisu, który wygląda tak: writeTiming.FSMC_AddressSetupTime =9; //地址建立时间(ADDSET)为9个HCLK =54ns writeTiming.FSMC_AddressHoldTime = 0x00; //地址保持时间(A writeTiming.FSMC_DataSetupTime = 8; //数据保存时间为6ns*9个HCLK=54ns Czasy te dają w sumie 120 [ns] 60 [ns] na Twrl i 60 [ns] na Twrh co daje dla Twc 120 [ns]. Warunek jest spełniony (Twc min 66 [ns]), niemniej czasy można podkręcić dla lepszej wydajności interfejsu. Za chwilę do tego powrócę. Na grafie dla zapisu linia NWE wygląda jak bliska rzeczywistości. Teraz jeszcze należy omówić parametry zapisu z datasheeta ILI9341. Otóż: Twrl i Twrh mają czas MINIMALNY 15 [ns], ale całkowity minimalny czas cyklu zapisu wynosi 66 [ns]. To oznacza, że owszem, można ustawić Twrl na tylko 15 [ns], ale wówczas Twrh MUSI trwać co najmniej 51 [ns], aby spełnić warunek: Twc = 66 [ns] MINIMUM Ustawiając nowe czasy dla zapisu: Twrl = 30 [ns] Twrh = 36 [ns] sprawdziłem, że w ciągu 1 sekundy wypełniałem ekran pojedynczym kolorem 192 razy, co dało przepustowość 29.5 MB/s i prędkość działania magistrali na poziomie 15.099 MHz, co jest realne i odbiega od wyliczonego 15.1515 MHz tylko z powodu używania magistrali programowo, a nie sprzętowo. Nowe ustawienia dla FSMC wykonane w CubeMX Przyznam że czytałem notę AN2970 nt. podłączania LCD do FSMC, natomiast kompletnie dla mnie niezrozumiały był zastosowany wzór do sprawdzenia poprawności timingów, w szczególności wydumane parametry dla tego wzoru jak Tsu, Tv. Program korzystający z nowych ustawień zapisu dla FSMC na poziomie Twc = 66 [ns] działa stabilnie, bez żadnych glitchy.
-
Tytułowy zestaw: Jest dość ciekawym zestawem, wyposażonym w multum dodatkowych peryferii... Jeden drobny błąd jak dla mnie to że zapomniano pociągnąć 2 ścieżek do ST-Linka żeby był dostępny CDC przez SPI... w końcu sam je sobie dolutowałem ale to było trudne jak na moje umiejętności i możliwości. Udało się tylko dlatego, że w ST-Linku były to dwa narożne piny, co dało sporo miejsca... Pomimo wielu dodatkowych rzeczy na płycie zestaw ciut rozczarowuje, ponieważ nie można bezpośrednio działać z wyświetlaczem, a zastosowany procek posiada interfejs FSMC mogący emulować magistralę równoległą 8/16 bit i8080. Tę przypadłość ulepszano stosując dodatkowe daughterboard'y jak np. STM32F4DIS-BB(/LCD) nie mniej obecnie zestaw ten jest już obsolete i niedostępny. Istnieje także zestaw Open407 team'u Waveshare dedykowany specjalnie dla STM32F407DISC-1: do czego można dokupić wyświetlacz przynajmniej 3.2 '' HY32 obecnie ze sterownikiem ILI9341 dawniej ILI9325: Istnieje jeszcze jeden sposób, który jest tematem tego artykułu, mianowicie samoróbka adaptera na FSMC dla F407-DISC1. Otóż istnieją znakomite zestawy dostępne na przykład na Aliexpress, które są bardzo kompaktowe i posiadają zintegrowane złącza FSMC i wyświetlacze 3.2'' na ILI9341 320x240 16 bit color. Jedne (F407VE/F407ZG) z tych zestawów był onegdaj sprzedawane przez sklep OMDAZZ, natomiast wszechobecne i popularne stały się zestawy DEVEBOX produkowane przez wiele firm, tak naprawdę nie wiem kto tu kogo rebranduje czy ACELEX TZT, czy TZT DEVEBOX'a itd. Nie jest zbyt istotne dociekanie kto był pierwszy, istotne jest, że te zestawy mają prawie identycznego procka jak F407VG-DISC1, bo F407VET6 różni się tym, że ma mniej wewnętrznej pamięci flash - zamiast 1MB posiada 512KB. Za to elektrycznie i programowo praktycznie jest to samo. Oto zestaw zwany F407-BLACK: z dołączonym LCD: oraz LCD widok od spodu: Jak widać wyświetlacz jest dołączony 16 bitową magistralą (i8080) równoległą. Nie zagłębiając się niepotrzebnie w cały schemat zestawu przedstawię tylko kluczowy fragment podłączenia magistrali FSMC do wyświetlacza LCD: Przy okazji jeszcze pokażę że ten zestaw nadal żyje i jest ulepszany. Widać kolejne złącza i przyciski w bardziej poręcznym miejscu. Dodatkowy 232 konwerter... Sam wyświetlacz posiada dodatkowe złącze i możliwość przełączenia do trybu SPI. Także jest dodatkowe 8MB flasha z nagranymi zestawami czcionek! Mój sposób myślenia przebiegał następująco: Jeżeli procesory (F407VG-DISC1 i F407-BLACK) są elektrycznie identyczne, to aby skutecznie podpiąć się do wyświetlacza od F407-BLACK wystarczy zmałpować (odtworzyć) połączenia dla pokazanej magistrali FSMC (gwoli ścisłości przy okazji także SPI dla dotyku) na własnym daughterboardzie i praktycznie będzie to 1/1 co powinno pozwolić odpalać i prawidłowo działać z wyświetlaczem programom, które działają na F407-BLACK. Jeszcze z rozpędu czy przy okazji dorobiłem drugie złącze dla wyświetlaczy od zestawów OMDAZZ - nieważne. Na bazie tej odtwórczości powstał taki oto schemat czyli posiłkując się wyprowadzeniem pinów na DISCOVERY: stworzyłem takie dzieło: Kiedy to komponowałem, byłem tak cwany że zamiast zroutować ścieżki samemu użyłem autoroutera. Nie myślałem nawet o czymś takim jak "signal integrity", ścieżki nie są równej długości no ale... skoro działa to znaczy się jest dobrze Nie wygląda to zbyt imponująco a i pewnie mój przyjaciel @H1M4W4R1 po obejrzeniu tego PCB mógłby złapać się za głowę, niemniej powstało coś takiego: Mimo wszystko zestaw działa i to zgodnie z założeniami - programy z F407-BLACK działają na F407VG-DISC1 oto dowód: Więc gdyby ktoś chciał podłączyć LCD do swojego DISCOVERY F407VG to może w ten sposób.
