Procesory osadzone ETD 7211 ADC, DAC, UART, CLK W5 19.11.2018
Load and stroe
Programowanie Zapis w C: IOSET1=0x00008000; IOSET1 = (1 << 15) Pętla opóźniająca: for (i=0; i <1000000, i++); Pętla nieskończona: while(1) lub for (; ;); W asemblerze już tak kolorowo nie jest, ponieważ: operuje się na adresach pamięci a nie na nazwach symbolicznych, zapalenie diody wygląda tak: załaduj do rejestru ogólnego przeznaczenia R0 adres rejestru kierunku IODIR, załaduj do innego rejestru ogólnego np. R1 konfigurację bitów, umieść wartość z R1 pod adresem R0 IODIR = 0xE002 8008 IOSET = 0xE002 8004 IOCLR = 0xE002 800C IOPIN = 0xE002 8000 LDR R0, =0xE0028004 LDR R1, =(1<<15) STR R1, [R0]
Rozkazy przesłań z/lub do pamięci Do przesyłania danych pomiędzy rejestrami a pamięcią służą rozkazy: LDR Load Register: LDR Rd, adres STR Store Register: STR Rz, adres Adres zawiera: adres bazowy znajdujący się w jednym z rejestrów ogólnych R lub licznik rozkazów PC (mowa o adresowaniu względnym), przesunięcie względem adresu bazowego Wszystkie operacje wykonywane są na rejestrach a nie na pamięci!
przerwania
Rodzaje przerwań w układach ARM Przerwania ARM Programowe SWI SWI - Software Interrupt IRQ - Interrupt Request FIQ - Fast Interrupt Request Timer, ADC, External Interrupt, DMA. itp szybkie Sprzętowe IRQ, FIQ wektorowe niewektorowe
System przerwań w układach ARM - obsługa przerwań/wyjątków W momencie wystąpienia wyjątku: zawartość CPSR wędruje do SPSR_<mode> ustawione zostają odpowiednie bity zmianie ulega tryb pracy w razie potrzeby blokowane są przerwania adres powrotu w LR_<mode> Aby powrócić, obsługa wyjątku przywraca CPSR z SPSR_<mode> przywraca PC z LR_<mode> 0x1C 0x18 0x14 0x10 0x0C 0x08 0x04 0x00 FIQ IRQ (Reserved) Data Abort Prefetch Abort Software Interrupt Undefined Instruction Reset Tablica wektorów
VIC kontroler przerwań Magistrala Local Bus ARM 7TDMI nfiq nirq Kontroler przerwań VIC PLL F XTAL F CLK Magistrala AHB SRAM Flash Most AHB/VPB RAM USB, Ethernet Magistrala VPB (VLSI Peripheral Bus) Szybkie porty GPIO ADC, CA, PWM, SPI, I2C, RTC, USB, Timer porty GPIO
ADC
Peryferia przetwornik ADC - na przykładzie LPC2368 Parametry przetwornika ADC: 6 kanałów multipleksowany, konwersja od 3 do 10 bitów, zakres pomiarowy 0 3V, indywidualny rejestr wyniku dla każdego kanału, przetwarzanie na zasadzie sukcesywnej aproksymacji, czas przetwarzania ~ 2,44 µs ziarno: q=u/2 N = 3/1024 = 2,93 mv 10
Peryferia przetwornik ADC - na przykładzie LPC2368 Magistrala AHB, APB Piny wejściowe: P0.23, P0.24, P0.25, P0.26, P1.30, P1.31 ADC DANE rejestry sterujące 11 V REF GND V CC
wejścia analogowe Peryferia przetwornik ADC - na przykładzie LPC2368 - Budowa rejestrów przetwornika ADC P0.23 31 AD0STAT 0 AD Status Register P0.24 AD0INTEN AD Interrupt Enable Register P0.25 ADnDR5 ADnDR0 AD0DRn AD Data Register n-channel P0.26 AD0GDR AD Global Data Register P1.30 P1.31 AD0CR AD Control Register 12
Peryferia przetwornik ADC - na przykładzie LPC2368 procedura obsługi Procedura włączenia przetwornika wymaga kilku kroków: START REJ. PCONP bit PCAD Power Control Peripheral włączenie AD REJ. AD0CR bity: SEL, CLKDIV, BURST AD Control Register preskaler REJ. AD0CR bit PDN AD Control Register aktywowanie AD REJ. PINMODE, PINSEL - multiplekser wyjściowy, stan linii REJ. PCLK_SEL0 PCLK_ADC Peripheral Clock wybór źródła sygnału T Przerwanie N 13
14 PCLKSEL0 taktowanie układów peryferyjnych
15 PCLKSEL0 taktowanie układów peryferyjnych
Peryferia przetwornik ADC - na przykładzie LPC2368 procedura obsługi T Przerwanie N REJ. AD0INTEN AD Interrupt Enable Register źródłem przerwania konwersja na danym kanale, źródłem przerwania informacja o zakończonej konwersji (flaga DONE w AD0GDR) REJ. AD0CR AD Control Register Bity 26:24 START = 001 rozpoczęcie konwersji napięcia wejściowego na postać cyfrową T bit DONE =1 N VICVectCnt VICVectAddr VICIntEnable Pobierz wynik z AD0DRn lub AD0GDR 16
Peryferia przetwornik ADC - rejestr AD0CR - A/D Control Register Zawartość rejestru AD0CR SEL selektor kanału, wybór wejścia na którym dokonywany będzie pomiar, CLKDIV preskaler, przez zawartość tego rejestru podzielony zostanie sygnał taktujący, przetwornik AD, formalnie: (PCLK/CLKDIV)+1, BURST tryb pracy, bit =0, programowa kontrola działania przetwornika, 1-obsługa sprzętowa automatyczna multipleksacja kanałów z dokładnością określoną przez CLKS, CLKS liczba okresów zegara przypadająca na cykl przetwarzania przetwornika AD PDN ograniczenie zasilania układu przetwornika, 1 tryb normalny, 0 tryb ograniczony START pole bitów umożliwiające zatrzymać lub rozpocząć konwersję, użytkownik może ustawić źródło sygnału wyzwalające pomiar EDGE bit ma znaczenie jeżeli w polu START został wybrany sygnał wyzwalający, bit ten odpowiada ze zbocze wyzwalające, 1 opadające, 0 rosnące 17 Przetwornik ADC taktowany jest sygnałem PCLK (Peripherial Clock), częstotliwość przetwarzania musi być mniejsza od 4,5 MHz.
Peryferia przetwornik ADC - rejestr AD0CR - A/D Control Register Zawartość rejestru AD0CR 18
Peryferia przetwornik ADC - rejestr AD0GDR Global Data Register, AD0DRn Data Register AD0GDR CHN przedstawienie pochodzenia wyniku z danego kanału AD0DRn, gdzie n oznacza rejestr n-tego kanału WYNIK KONWERSJI 10 bitowy wynik przetwarzania sygnały z danego wejścia ADC, DONE po zakończeniu przetwarzania bit ten zostaje ustawiony w stan wysoki, OVERRUN nadpisanie zawartości rejestru wyniku (w trybie ciągłym) 19 Bit DONE stanowi idealne rozwiązanie na programową obsługę ADC! Wynik konwersji przechowywany jest w rejestrach AD0GDR i AD0DRn
Peryferia przetwornik ADC - rejestr AD0GDR Global Data Register, AD0DRn Data Register AD0STAT - A/D Status Register DONE 7:0 flagi zakończenia konwersji poszczególnych przetworników, OVERRUN 7:0 flagi nadpisania zawartości rejestru wyniku, ADINT flaga wystąpienia przerwania, bez identyfikacji kanału. AD0INTEN - A/D Interrupt Enable Register ADINTEN 7:0 odblokowanie przerwań od poszczególnych kanałów pomiarowych ADC, ADGINTEN 1 pojawienie się flagi DONE spowoduje wywołanie przerwania od ADC, 0 przerwania będą zgłaszane przez poszczególne kanały 20
Peryferia przetwornik ADC - przykładowy kod obsługi ADC LPC2368 int main (void) { IODIR1=0x0FFC0000; //linie P1.18 - P1.27 ustawione jako wyscia PCONP = (1<<12); // AD converter (ADC) power/clock control bit AD0CR = (1<<21); // PDN wlaczenie przetwornika AD PCLKSEL0 =(0<<25) (0<<24); PINSEL1 =(0<<15) (1<<14); // Wejście AD0 włączony AD0CR = ( 0x01 << 0 ) /* SEL=1,select channel 0~7 on ADC0 */ ( ( 12000000 / 1000000-1 ) << 8 ) /* CLKDIV = Fpclk / 1000000-1 */ ( 0 << 16 ) /* BURST = 0, no BURST, software controlled */ ( 0 << 17 ) /* CLKS = 0, 11 clocks/10 bits */ ( 1 << 21 ) /* PDN = 1, normal operation */ ( 0 << 24 ) /* START = 0 then A/D conversion stops */ ( 0 << 27 ); /* EDGE = 0 (CAP/MAT singal falling,trigger A/D conversion) */ while(1) { AD0CR = ( 1 << 24 ); /* Przetwornik wlaczony - Bity 26:24 = 001 - start konwersji */ do { val = AD0GDR; // Read A/D Data Register } while ((val & 0x80000000) == 0); // Petla zakonczy sie gdy warunek zwroci wartosc FALSE 21 } val = (val >> 6) & 0x03FF; val= (val<<18); IOPIN1= ~val; //stan niski - zapalnie diodek zgodnie z zawartoscia przetwornika ADC }
DAC
Peryferia przetwornik DAC - na przykładzie LPC2368 Przetwornik DAC N = 10 bitów, V REF = 3,3V, 23
Peryferia przetwornik DAC - na przykładzie LPC2368 Magistrala AHB, APB U WY = (słowo/1024) x V REF wyjście analogowe P0.26/AOUT DAC DANE rejestry sterujące 24 V CC GND V REF
Peryferia przetwornik DAC - na przykładzie LPC2368 DAC algorytm obsługi przetwornika DAC START REJ. PCLK_SEL0 Peripheral Clock wybór źródła sygnału REJ. PINMODE, PINSEL - multiplekser wyjściowy, stan linii DACR - Converter Register - zapis danej 10-bitowej 25 Funkcja generująca dowolny sygnał
Peryferia przetwornik DAC - na przykładzie LPC2368 DACR - D/A Converter Register WARTOŚĆ wartość binarna opisująca zadane napięcie wyjściowe, zgodnie z zaleznością WARTOŚĆ = 1024 x U WY /V REF BIAS wartość 0 czas konwersji 1 us, maksymalny prąd obciążenia 700 ua wartość 1 czas konwersji 2,5 us, maksymalny prąd obciążenia 350 ua Wysłanie danej do przetwornika: DACR = (WARTOSC & 0x3FF) << 6; 26
Peryferia przetwornik DAC - przykładowy kod obsługi ADC LPC2368 int main (void) { PCLKSEL0 = (0<<23) (0<<22); PINSEL1 = (1<<21) (0<<21); DACR = (1<<16); } while(1) { for (i=0; i<1024; i++){ DACR = (i & 0x3FF) << 6; delay(0x7000); } } 27
Peryferia przetwornik DAC - przykładowy kod obsługi ADC LPC2368 int main (void) { PCLKSEL0 = (0<<23) (0<<22); PINSEL1 = (1<<21) (0<<20); DACR = (1<<16); } while(1) { for (i=0; i<1024; i++){ DACR = (i & 0x3FF) << 6; delay(0x7000); } } 28
UART
Peryferia port szeregowy RS232 - na przykładzie LPC2368 Zgodny ze standardem 16550 Szybkość transmisji: 1200, 2400, 4800, 9600, 19200, 57600, 115 200 bitów/s 16-bit bufor dla nadawczo-odbiorczej kolejki FIFO UART1 tryb modemu 30
Peryferia port szeregowy RS232 - UART1 na przykładzie LPC2368 UART Universal Asynchronous Receiver Transmitter 3,3 V 0 1 2 3 4 5 6 7 P +8 V stan IDLE bit startu 0 5 8 bitów danych bit parzystości -8 V 31 LPC2368: UART0/2/3 UART1 możliwość budowy modemu bity stopu: 1, 2 lub 1.5
Peryferia port szeregowy RS232 - Transmisja synchroniczna Transmisja asynchroniczna Szybkość: 19200 b/s Szybkość: 19200 b/s 32
Konwersja poziomów Konwersja poziomów : od 3 do 25 to stan wysoki logiczne 1 powyżej +3 V to stan niski - logiczne 0 33
Pin Sygnał Nazwa Kierunek 1 DCD Data Carrier Detect In 2 RXD Receive Data In 3 TXD Transmit Data Out 4 DTR Data Terminal Ready Out 5 GND Ground - 6 DSR Data Set Ready In 7 RTS Request to Send Out 8 CTS Clear to Send In 9 RI Ring Indicator In 34 LPC2368: UART0/2/3 UART1 możliwość budowy modemu
Peryferia port szeregowy RS232 - szybkość transmisji Szybkość transmisji (Baud Rate) podawana zazwyczaj jako: np.9600 bodów czyli 9600 bitów na sekundę czas transmisji 1-bitu -> 1/9600 -> 104,16 µs 0 1 2 3 4 5 6 7 P STOP 12 x 104,16 µs = 1,25 ms Inne typowe szybkości transmisji danych: 110, 150, 300, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400, 460800, 921600. 35
PINSEL Peryferia port szeregowy RS232 - rejestry 31 U1RBR 0 Receiver Buffer Register U1THR TransmitHoldingRegister U1DLL Divisor Latch LSB U1DLM Divisor Latch MSB TxD U1IER Interrupt Enable Register RxD U1IIR U1FCR Interrupt ID Register FIFO Control Register U1LCR Line Control Register U1LSR Line Status Register U1SCR Scratch Pad Register 36 U1TRE Transmit Enable Register
Peryferia port szeregowy RS232 - generator prędkości transmisji Generator prędkości transmisji stanowi 16-bitowy dzielnik sygnału PCLK (zegar układu), który generuje sygnał dla układu UART PCLK DZIELNIK Baud x16 Rejestr U1DLM tylko 8 bitów DZIELNIK = PCLK/ (16 x Baud Rate) Rejestr U1DLL tylko 8 bitów Do poprawnego działania układu UART, zegar modułu powinien mieć częstotliwość 16 razy większą niż wynikającą z szybkości transmisji 37 Przy założeniu PCLK=12MHz, Baud Rate =9600, Dzielnik = 78,125 Do rejestru U1DLL zapiszemy jednak wartość 78, a U1DLM = 0
Peryferia port szeregowy RS232 - generator prędkości transmisji 38 DLAB w LCR musi być ustawiony w celu dostępu do DLL I DLM http://www.nxp.com/documents/user_manual/um10211.pdf s.418
Peryferia port szeregowy RS232 - generator prędkości transmisji DLL i DLM umożliwiaja uzyskanie standardowej prędkości: 9600, 19200, 115200 itp. Dla rezonatora kwarcowego o częstotliwości podzielnej bez reszty (np. 11,0592 MHz). Budowa rejestru U0FDR - Fractional Divider Register MULVALLL mianownik 39 DIVADDVAL licznika
Peryferia port szeregowy RS232 - generator prędkości transmisji
Peryferia port szeregowy RS232 - generator prędkości transmisji PCLK = 14.7456 MHz, BR = 9600 DL est = PCLK 16 x BR = 14.7456 MHz (16 x 9600) = 96 6,51 4 = 1,628 DIVADDVAL = 0, MULVAL = 1, DLM = 0, DLL = 96 PCLK = 12 MHz, BR = 115200 DL est = PCLK (16 x BR) = 12MHz (16 x 115200) = 6,51 41 Szukamy dzielnika wartości 6,51 4 6,51 4 = 1,628 DLL = 4
Peryferia port szeregowy RS232 - generator prędkości transmisji PCLK = 14.7456 MHz, BR = 9600 DL est = PCLK 16 x BR = 14.7456 MHz (16 x 9600) = 96 DIVADDVAL = 0, MULVAL = 1, DLM = 0, DLL = 96 PCLK = 12 MHz, BR = 115200 DL est = PCLK (16 x BR) = 12MHz (16 x 115200) = 6,51 42 Szukamy dzielnika wartości 6,51 4 6,51 4 = 1,628 DLL = 4 DIVADDVAL = 5, MULVAL = 8, DLM = 0, DLL = 4
Peryferia port szeregowy RS232 - rejestry LCR - Line Control Register Budowa rejestru U1LCR - Line Control Register DLAB - Divisor Latch Access Bit zezwolenie na dostęp do dzielnika Break Control wstrzymanie transmisji Parity Select rodzaj kontroli parzystości Parity Enable kontrola parzystości Stop Bit Select bity stopu Word Length Select szerokość słowa danych od 5 (00b) do 8 (11b) bitów Baud Rate 9600, 8 bitów danych, brak kontroli parzystości i 1 bitu stopu: 43 U1LCR = 0b10000011=0x83
Peryferia port szeregowy RS232 - rejestry LSR - Line Control Register Budowa rejestru U1LSR - Line Status Register Error in RX FIFO (RXFE) Transmitter Empty (TEMT) zarówno bufor nad. i odb. puste Transmitter Holding Register Empty bit =1, U1THR pusty Break Control wstrzymanie transmisji Framing Error błąd ramki, brak bitu stopu Parity Error błąd parzystości Overrun Error nadpisanie nieodebranych danych Receiver Data Ready 0 odbiornik gotowy do odebrania danych 44 while (!(UxLSR & 0x20)); return (UxTHR = ch); while (!(UxLSR & 0x00)); return (UxRBR);
Peryferia port szeregowy RS232 - UART1 na przykładzie LPC2368 Procedura obsługi portu UART START REJ. PCONP bit PCUART1 Power Control Peripheral włączenie UART REJ. U1DLL i U1DLM Divisor Latch LSB, MSB wartość dzielnika REJ. PCLK_SEL0 bit PCLK_UART1 Peripheral Clock wybór źródła sygnału REJ. PINMODE, PINSEL - multiplekser wyjściowy, stan linii REJ. U1LCR bit DLAB Line Control Register parametry transmisji REJ. U0FCR bit FIFO enable FIFO Control Register T Przerwanie N 45
Peryferia przetwornik ADC - na przykładzie LPC2368 procedura obsługi T Przerwanie N REJ. U1LCR bit DLAB =0 Line Control Register T Nadawanie N VICVectCnt VICVectAddr VICIntEnable U1LSR & 0x20 załaduj U1THR T Odbiór 46 U1LSR & 0x01 pobierz U1RBR
Peryferia port szeregowy RS232 - rejestry LSR - Line Control Register Budowa rejestru U0FCR - FIFO Control Register RX Trigger Level po ilu znakach zostanie wygenerowane przerwanie Zarezerwowane TX FIFO Reset kasowanie znaków z nadajnika RX FIFO Reset kasowanie znajów z odbiornika FIFO Enable włączenie kolejki FIFO 47
Peryferia port szeregowy RS232 - rejestry IRR - Interrupt Identification Register U0IRR - Interrupt Identification Register U0IER - Interrupt Enable Register 48
Zegar systemowy CLK kilka pf 5 Źródło sygnału: generator sygnałowy, rezonator kwarcowy częstotliwość sygnału zegarowego: 1 MHz 24 MHz
5 Zegar systemowy CLK
Zegar systemowy możliwe ścieżki CLKSRCSEL PLLCON PLLCFG PLLSTAT PLLFEED 32 khz 24 MHz CCLK 5 PLLCLK
PLL- budowa pętli Current Controlled Oscillator N-DIVIDER M-MULTIPLIER 2 PLLCFG - mnożnik: 1-32768 (275 550) MHz 5 PLLCFG - dzielnik: 1-32 F CCO = (2 M F IN )/N Dla: N=16, M=125, F CCO = (18,432*2*125)/16 = 288 MHz
PLL- procedura inicjalizacji PLL - UM10211 str.42 START Odłącz pętlę PLL PLLCON = (0<<1) POTWIERDZ PLLFEED=0xAA, PLLFEED=0x55 Wyłącz pętlę PLL PLLCON = 0 POTWIERDZ PLLFEED=0xAA, PLLFEED=0x55 Zapisz wartość do N i M PLLCFG M(14:0), N(23:16) POTWIERDZ PLLFEED=0xAA, PLLFEED=0x55 Włącz pętlę PLL PLLCON = 1 POTWIERDZ PLLFEED=0xAA, PLLFEED=0x55 while (((PLLSTAT & (1<< 26))== 0)) 56 Ustaw podział dla rdzenia CCLKSEL (7:0) Wskaż źródło sygnału SSCS = (1<<5) N Sprawdź czy synchroniz.? PLLSTAT bit PLOCK
PLL- procedura inicjalizacji PLL - UM10211 str.42 while (((PLLSTAT & (1<< 26))== 0)) N Sprawdź czy synchroniz.? PLLSTAT bit PLOCK T Podłącz pętlę PLL PLLCON = 3 POTWIERDZ PLLFEED=0xAA, PLLFEED=0x55 57 N Sprawdź czy PLL działa z określoną częstotliwością? PLLSTAT bit PLLC T GOTOWE
Dane MAM Memory Acceleration Module Zadanie: przyspieszenie dostępu do pamięci FLASH 5 Rdzeń ARM Interfejs adres 15 Pamięć FLASH Bufory Magistrala Local Bus 128 Pamięć RAM szybka Flash cykl zapis/odczyt ~50 ns Przy założeniu, że procesor działa przy 60 MHz, czas dostępu do pamięci to ~16,33 ns 128 bitowa organizacja pamięci odczyt czterech 32-bitowych rozkazów ARM lub osiem 16- bitowych Thumb Data Buffer Prefetch Buffer Branch Tail Buffer
Kod sekwencyjny Dane i skoki Zarówno dane i kod MAM Memory Acceleration Module TRYB 0 TRYB 1 TRYB 2 Rdzeń ARM Rdzeń ARM Rdzeń ARM MAM MAM MAM FLASH FLASH FLASH 59 MAM tryby pracy: całkowicie wyłączony (tylko Flash), częściowo włączony (Flash + MAM), całkowicie załączony (MAM)
60 Dziękuję za uwagę