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

LPC1343 - sterowniki dla GPIO, UART i inych interfejsów

Gumis-92 22 Sty 2015 10:31 966 10
  • #1 22 Sty 2015 10:31
    Gumis-92
    Poziom 8  

    Poznaję mikrokontroler LPC1343 i jego interfejsy. Umiem machać pinem używając rejestrów wczoraj zająłem się uartem i poległem, troszkę za dużo rejestrów do konfiguracji. Przeglądając noty aplikacyjne i kod zawarty w nich.
    Dla przykładu AN11318 zawiera pliki: app_pmbus.c app_pmbus.h cr_startup_lpc13.c gpio.c gpio.h i2cslave.c i2cslave.h timer32.c timer32.h type.h
    no i w gpio.c jest funkcja do sterowania liniami portów:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    czyli to co ja robię na rejestrach można zrobić funkcją. Brakuje funkcji do interfejsu uart. W innej nocie aplikacyjnej jest plik uart.c a wnim funkcja do jego ustawiania:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    znowu w innej nocie w pliku uart.c ciało funkcji UARTInit wygląda inaczej.
    Czy są standardowe sterowniki dla peryferiów LPC1343 ?

    0 10
  • Pomocny post
    #3 22 Sty 2015 12:35
    michalko12
    Specjalista - Mikrokontrolery

    Masz wszystko co trzeba u siebie na dysku w katalogu instalacyjnym LPCXpresso. Poszukaj pliku lpcopen_2_05_lpcxpresso_nxp_lpcxpresso_1343.zip 1 zaimportuj go sobie do swojego projektu.
    Wszystkie drivery do tego uC znajdują się w podkatalogu lpc_chip_13xx

    0
  • #4 22 Sty 2015 21:07
    Badmaneq
    Poziom 23  

    Pamiętaj, że używanie bibliotek LPCOpen nie uchroni przed poznaniem User Manula i rejestrów uC. Zwykle będzie powodować generację dłuższego kodu wynikowe, załóżmy że program ma ustawić pin jako wyjście i w pętli ciągle ustawiać stan wysoki i niski na pinie.

    1. Użycie LPCOpen

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Spowoduje wygenerowanie następującego kodu asemblera
    Kod: asm
    Zaloguj się, aby zobaczyć kod

    wygenerowany został kod (main + startup) o rozmiarze 1332 bajtów
    Kod: bash
    Zaloguj się, aby zobaczyć kod

    2. Użycie tylko rejestrów zapisanych CMSIS
    Kod: c
    Zaloguj się, aby zobaczyć kod

    kompilator generuje taki kod asemblera
    Kod: asm
    Zaloguj się, aby zobaczyć kod

    wygenerowany został kod (main + startup) o rozmiarze 904 bajtów
    Kod: bash
    Zaloguj się, aby zobaczyć kod

    Czyli 428 bajtów mniej niż używając LPCOpen !
    Za łatwość pisania kodu płaci się rozmiarem kodu wynikowego, z drugiej strony pamięci flash jest dość sporo...

    0
  • #5 23 Sty 2015 10:04
    Gumis-92
    Poziom 8  

    Zaimportowałem są sterowniki do interfejsów, kilka linii kodu i komunikacja po uart hula.
    Oczywiście będę pisał także na rejestrach, w sumie teraz kiedy się uczę te 408 bajtów nie ma dla mnie znaczenia.

    @Badman: jak wygenerować kod asemblera i z jakich źródeł uczyłeś się asemblera ?

    0
  • #6 23 Sty 2015 13:40
    michalko12
    Specjalista - Mikrokontrolery

    Na tym etapie zapomnij o assemblerze. Nie jest Ci do niczego potrzebny, używanie assemblera w ARM nie jest takie proste jak np w AVR, C na tym etapie całkowicie Ci wystarczy. Jak jesteś bardziej ambitny to skup się na dogłębnym poznaniu rdzenia.

    W podkatalogu Debug lub Relase swojego projektu powinieneś mieć pliki z rozszerzeniem lst, tam możesz sobie podejrzeć wygenerowany kod assemblera.

    0
  • #7 23 Sty 2015 14:26
    Gumis-92
    Poziom 8  

    Specjalnie asemblera nie chcę się uczyć, zgrubsza chcę wiedzieć o co chodzi :)

    Mam tylko katalog Debug a w nim pliki:
    dioda.axf dioda_Debug.ld dioda_Debug_lib.ld dioda_Debug_mem.ld dioda.map makefile objects.mk sources.mk
    i katlog src a w nim:
    crp.d crp.o cr_startup_lpc13xx.d cr_startup_lpc13xx.o dioda.d dioda.o subdir.mk

    @michalko12: nie ma plików lst :(

    0
  • Pomocny post
    #8 23 Sty 2015 14:42
    michalko12
    Specjalista - Mikrokontrolery

    OK.
    Klikasz w swoim projekcie "Binaries" potem na pliku xxx.axf klikasz PPM i jest w menu opcja Binary Utilities i tam masz opcję Disassemble

    0
  • #9 23 Sty 2015 14:50
    Gumis-92
    Poziom 8  

    Dzięki wygenerował plik dioda.dis z kodem w asemblerze.

    0
  • #10 23 Sty 2015 15:06
    michalko12
    Specjalista - Mikrokontrolery

    Generowanie plików lst dla każdego pliku *.c z osobna.
    Projekt->Properties->C/C++ Build->Settings -> zakładka Tool Settings-> MCU C Compiller-> Miscellaneous -> pole Other flags dopisujesz na końcu

    Kod: bash
    Zaloguj się, aby zobaczyć kod


    LPC1343 - sterowniki dla GPIO, UART i inych interfejsów

    Jeśli chcesz tylko jeden plik lst z całego projektu to do Post-build steps dodaj
    Kod: bash
    Zaloguj się, aby zobaczyć kod

    0
  • #11 23 Sty 2015 18:15
    Badmaneq
    Poziom 23  

    Gumis-92 napisał:
    @Badman: jak wygenerować kod asemblera i z jakich źródeł uczyłeś się asemblera ?


    Tak ja pokazał michalko12.
    Ogólnie kod asemblera generuje się poleceniem objdump, a w tym przypadku arm-none-eabi-objdump, program znajduje się w katalogu sciezka_do_lpcxpresso/lpcxpresso/tools/bin dokumentacja tego programu i innych znajduje się w katalogu sciezka_do_lpcxpresso/lpcxpresso/tools/share/doc/gcc-arm-none-eabi/pdf w pliku binutils.pdf. W podanym katlogu znajduje się wiele innej wartościowej dokumentacji, tyle że na Twoim etapie uważam że jest dla Ciebie zbędna.
    Nie uczyłem się asemblera dla ARM'ów, znam natomiast asembler 8051 i przez analogię wiem co niektóre rozkazy znaczą. Jeżeli nie znam rozkazu posiłkuje się UM dla LPC176x/5x , jest tam rozdział "Appendix: Cortex-M3 user guide" gdzie m. in. jest opis rozkazów asemblera.
    Być może programować w asemblerze mógłbym Cortex-M0 (np. taki LPC1114) lecz już LPC1343 nie zawracałbym sobie głowy. Język C jest wystarczający, ewentualnie pokusiłbym się o napisanie obsługi przerwania w asemblerze oczywiście tylko wtedy kiedy kompilator wygenerowałby kod, który nie wyrobiłby się odpowiedni szybko do wystąpienia kolejnego przerwania. Jednak dzisiaj rozwiązuje się taki problem zupełnie inaczej poprostu zmienia się mikrokontroler na szybszy :)

    0