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

[lpc2148] Jak skonfigurować UART na LPC2148 w CrossStudio 1.6? Randomowe znaki w terminalu

iiyama800 11 Lip 2011 19:43 1230 2
REKLAMA
  • #1 9706519
    iiyama800
    Poziom 2  
    Posty: 2
    Posiadam płytkę LPC2148 Education Board i mam z nią trochę problemów. Ogólnie jestem w tym zielony, bardzo zielony, a muszę przez to przebrnąć. Jak bawić się diodami czy buzzerem ogarnąłem. Z przerwaniami też sobie poradziłem. Chciałbym teraz skorzystać z UARTa (przez RS232) i padam... (piszę w CrossStudio 1.6 Build 2). Przeglądałem już to forum, także w czasie tworzenia projektu Oscilator Frequency ustawiłęm na 12Mhz, a i w Processor Definitions wrzuciłem STARTUP_FROM_RESET.

    Podręcznik dla użytkownika dla tego sprzętu wrzuciłem tutaj:
    #mirror1
    #mirror2

    Najpierw, co przynajmniej dla mnie ciekawe jest, jeśli wrzucę programik z diodami, w którym w ogóle nie zajmuję się UARTem, to na hyperterminalu pojawiają się randomowe znaczki. Jeżeli wrzucę swój programik, również rezultat jest taki sam. Dodam, że nie pojawiają się od razu tylko po ok 30-40sek i pojawiają się raz. Jeśli odłączę zasilanie od płytki i ponownie podepnę, to znów pojawią się raz. Jak w programie jest while to powinny (jeśli jest źle dobrana prędkość) pojawiać się cyklicznie, tylko, że co najwyżej nie to co oczekuje?

    Co do inicjalizacji UARTa, to obliczam U0DLL i U0DLM ze wzoru:

    Required_baud_rate = (clock) / (16 * Divisior_valuer)

    Ponieważ nie do końca byłem pewien, jaki ten clock ma być, przeliczyłem to dla baud rate 9600 dla 12Mhz (78,13 dec czyli 0x4E) oraz na wszelki wypadek dla 60Mhz (390,63 zaokrąglając 0x187), bo taką wartość znalazłem też w instrukcji...


    Mam jakiś .hex, który ma być przykładowym testowym programem do tego sprzętu, jak się go wgra i odpali, to świecą diody, LCD, itd. itp., ale jak w tym momencie w hyperterminalu wywołam połączenie to się przerywa program, jak w hyperterminalu odłączę połączenie, to na płytce program startuje od początku.

    Jakie znaczenie ma ustawianie sterowanie przepływem (Xon/Xoff, sprzetowe, brak)?

    To chyba wszystkie informacje, jakie mogą okazać się pomocne, by mi pomóc ;-)

    Na koniec zamieszczam kod:

    #include <targets/lpc2148.h>  
    
    inline void UART_init(void)  
    {
      PINSEL0 = 0x5;      
      U0LCR = 0x83;              //8N1
      U0DLM = 0x00;
      U0DLL = 0x4E;             
      U0LCR = 0x03;    
    } 
    
    int main(void) 
    {  
     UART_init();
      while(1) 
      {
        putchar('a');     
      }             
    }
    
    int putchar (int ch)
    {
        while (!(U0LSR & 0x20));
        return (U0THR = ch);
    }



    Jakiś pomysł? Co może być nie tak? Bo mam wrażenie, że to w ogóle się nie przesyła...


    Dodam, jeszcze fragment w Startup.s stworzonym automatycznie przez CrossStudio odnośnie PLLCFG_VAL, może to też ma mieć znaczenie większe

    #ifndef PLLCFG_VAL
    
    #if OSCILLATOR_CLOCK_FREQUENCY==10000000
    
    /* Fosc = 10Mhz, P = 2, M = 6 : Fcco = 240Mhz, cclk = 60Mhz */
    #define PLLCFG_VAL 0x25
    
    #elif OSCILLATOR_CLOCK_FREQUENCY==12000000
    
    /* Fosc = 12Mhz, P = 2, M = 5 : Fcco = 240Mhz, cclk = 60Mhz */
    #define PLLCFG_VAL 0x24
    
    #elif OSCILLATOR_CLOCK_FREQUENCY==14745600
    
    /* Fosc = 14.7456Mhz, P = 2, M = 4 : Fcco = 235.9296Mhz, cclk = 58.9824Mhz */
    #define PLLCFG_VAL 0x23 
    
    #endif
    #endif
  • REKLAMA
  • #2 9707664
    janbernat
    Poziom 38  
    Posty: 3954
    Pomógł: 468
    Ocena: 51
    Paskudnie piszesz- za parę dni sam nie będziesz wiedział co w kodzie jest.
    Jedna linijka komentarza- a w kodzie same hexy bez nazw bitów.
    No i takie coś:
    iiyama800 napisał:

    int putchar (int ch)
    {
    while (!(U0LSR & 0x20));
    return (U0THR = ch);
    }

    jest to funkcja blokująca- a podobno opanowałeś przerwania.
    No i wykona się chyba tylko wtedy gdy rejestr U0LSR nie będzie miał wartości 0x20.
    Nie wiem co to za rejestr- nie znam ARM.
  • #3 9707906
    iiyama800
    Poziom 2  
    Posty: 2
    janbernat: dzięki za odpowiedź. Sprawdziłem jeszcze raz tego putchar, to wg książki powinno to wyglądać tak (oczywiście źle przepisałem)

     int putchar(int ch) {                
        do { } while (!(U0LSR & 0x20));       // czekanie na gotowość
        return (U0THR = ch);                        // wysłanie znaku
    }
    


    Jednak to nic nie zmienia... spróbowałem również w while zamiast putchar wrzucić od razu samo U0THR = 'a', ale też bez rezultatu. Dalej tylko jakieś randomy po ok 30 sek od podłączenia płytki do zasilania.

    To może jeszcze dorzucę opis poszczególnych zmiennych:

    
       PINSEL0 = 0x5;             // uaktywnia RxD0 and TxD0
       U1LCR = 0x83;              // 8 bitów, bez parzystości, 1 STOP bit, DLAB = 1
       U0DLM = 0x00;             // połowa bitów do ustawienia baund rate (Divisor Latch MSB)
       U0DLL = 0x62;              // połowa bitów do ustawienia baund rate (Divisor Latch LSB)
       U1LCR = 0x03               // DLAB = 0 po zmianach dla ochrony ustalonej wartości podzielnika
    
       U0LSR - Link Status Register - do sprawdzania statusu nadawanych znaków
       U0THR - Transmitt Holding Register - znaki są wysyłane przez pisanie do tego rejestru
    
    
REKLAMA