Gieneq Napisano Wrzesień 12, 2023 Udostępnij Napisano Wrzesień 12, 2023 Cześć, W projekcie mam do użycia zewnętrzny FLASH. Pamieć działa, testowałem zapis i odczyt. Przetestowałem cache w TouchGFX i działa pobranie grafik z zewnętrznego FLASHa do bufora cache w ramie. Teraz chcę użyć go do przechownia grafik dla potrzeb TouchGFX od ST. Na stronie TouchGFX jest napisane jak można podejść do tematu i kluczowy moment to: Cytat The linker selects an address for the bitmaps. This selection is based on the section the bitmaps are placed in. All bitmaps in TouchGFX is by default put into the ExtFlashSection. The standard linker scripts (here for GCC) puts this section into flash together with other read-only data. In this example we will put the image data in the ExtFlashSection at address 0x24000000. You can select any address that is otherwise unused (not part of the code or data address space). Czyli dla wgrania kodu wybieram jakiś obszar, nic się tam i tak nie zapisze, a później musze interpretować adresy w funkcji obsługi cache z frameworku touchGFX: // This function is called whenever a bitmap is cached. Must copy a number of bytes from the (non-memory-mapped) source // to the cache. bool TouchGFXHAL::blockCopy(void* RESTRICT dest, const void* RESTRICT src, uint32_t numBytes) { // If requested data is located within the memory block we have assigned for ExtFlashSection, // provide an implementation for data copying. if (src >= 0x24000000 && src < 0x24100000) { void* dataOffset = src - 0x24000000; // In this example we assume graphics is placed in SD card, and that we have an appropriate function // for copying data from there. sdcard_read(dest, dataOffset, numBytes); return true; } else { // For all other addresses, just use the default implementation. // This is important, as blockCopy is also used for other things in the core framework. return HAL::blockCopy(dest, src, numBytes); } } Wybrałem adres RAM D3 jako nieużywany obszar i dodałem do linkera: .intr_data(NOLOAD) : { . = ALIGN(1); . = ABSOLUTE(0x30000000); *(.internal_cache) } >RAM_D2 ExtFlashSection : { *(ExtFlashSection ExtFlashSection.*) } >EXT_FLASH_DUMMY działa, ale jakoś mi się nie podoba. Macie pomysł jak wybrać nieużywany obszar dla 16MB? Tu obszary z RAMu: Dla niektórych obszarów wgranie jest przerywane przez błęd. 2 Cytuj Link do komentarza Share on other sites More sharing options...
Gieneq Wrzesień 18, 2023 Autor tematu Udostępnij Wrzesień 18, 2023 ExtFlashSection(UNLOAD) : { *(ExtFlashSection ExtFlashSection.*) } >EXT_FLASH_DUMMY Wygląda na to, że sprawa jest bardzo prosta. Dodanie atrybuty UNLOAD powoduje, że dane są w wynikowym pliku binarnym, czyli zostaną przypisane adresy zmiennych, ale dane te nie zostaną umieszczone w targecie. Cytuj Link do komentarza Share on other sites More sharing options...
Gieneq Wrzesień 20, 2023 Autor tematu Udostępnij Wrzesień 20, 2023 Ostatecznie udało się skończyć ten temat. Jest jeszcze sporo do poprawy ale działa. Atrybut UNLOAD faktycznie pomógł, ale tylko do przygotowania binarki dla STMki. Żeby przygotować plik do wgrania trzeba to usunąć, wtedy w pliku elf znajdzie się sektor. Jeżeli tego się nie zrobi, to podczas ekstrakcji sektorów wystąpi błąd. Do ekstrakcji prygotowałem plik bat z poleceniem: @echo off echo Extracting images from EnbioWiFi.elf... echo If no ExtFlashSection, temporary remove (NOLOAD) :: Replace the path and file name as needed arm-none-eabi-objcopy --dump-section ExtFlashSection=images.bin ../Debug/EnbioWiFi.elf echo Extraction complete. pause objcopy generuje plik bin którego początek można przełożyć na początek tej udawanej przestrzeni adresów. Te z kolei tłumaczę na adresy pamięci NOR FLASH. Dodałem też obsługę pendriva w trybie Mass Storage (MSC) i po enumeracji następuje proces kopiowania buforem 1k około 1.5M grafik do zewnętrznego FLASHa. Przy kolejnym restarcie zawartość FLASHa jest cachowana w zewnętrznym RAMie, który jest już memory mapped 😄 Także na koniec pytanie: Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
Dołącz do dyskusji, napisz odpowiedź!
Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!