Instrukcja_Lab5(2).pdf

(269 KB) Pobierz
Zakład Techniki Cyfrowej
Laboratorium z przedmiotu „Architektura komputerów i systemy operacyjne”
Ćwiczenie nr 5 Komunikacja z wykorzystaniem portu szeregowego UART
autor instrukcji: dr inż. Lech Zagoździński
Celem ćwiczenia jest zapoznanie studentów z zasadami programowania i wykorzystania interfejsów
szeregowych na przykładzie interfejsu UART.
Wymagania dla studentów
Niezbędna jest umiejętność programowania z wykorzystaniem języka C w zakresie składni,
operatorów pętli, konstrukcji warunkowych oraz znajomości operacji na wskaźnikach, tablicach, i
operacji wywołania funkcji.
Konieczne jest rozumienie pojęcia „przerwanie” oraz sposobu jego obsługi w mikrokontrolerach z
rdzeniem ARM Cortex M3.
Przed wykonaniem ćwiczenia studenci powinni zapoznać się z niniejszą instrukcją, plikami
aplikacji przykładowej z katalogu LAB_UART oraz umieć wyjaśnić zagadnienia podane jako
„tematy do przemyślenia” (podane kursywą).
Ponadto studenci powinni posiadać umiejętności nabyte we wcześniejszych ćwiczeniach
laboratoryjnych z przedmiotu „Architektura komputerów i systemy operacyjne”, w szczególności
znać sposoby obsługi środowiska IDE Keil Vision oraz budowy aplikacji w języku C.
Kolokwium wstępne
W czasie kolokwium będą zadane trzy pytania z zakresu objętego wymaganiami dla studentów.
Każde z pytań będzie ocenione w skali od 0 – 1pkt z gradacją co 0,25pkt.
W czasie kolokwium można korzystać z wydrukowanych fragmentów dokumentacji procesora [z
plików STM32F103VBT6.pdf – rozdział 4 Memory mapping oraz stm32f10xxx.pdf – rozdział 25
Universal synchronous asynchronous receiver transmitter (USART)] oraz z wydruków aplikacji
przykładowej.
Zakres pytań:
Pytanie nr 1- podstawowe konstrukcje języka C
Pytanie nr 2- budowa i konfiguracja interfejsu USART
Pytanie nr 3- budowa i zasada działania aplikacji przykładowej
Ocena wyników
Ocenie będą podlegały następujące składniki ćwiczenia:
• staranność wykonania kodu
• samodzielność pracy i znajomość wytworzonego oprogramowania
• uzyskane funkcjonalności
każde z zadań jest oceniane osobno, punktacja podana jest w rozdziale 2.4 .
1 Asynchroniczna transmisja szeregowa
Transmisja asynchroniczna oznacza szeregowy przesył danych znak po znaku, które są kodowane
jako ciąg bitów oddzielanych specjalnymi znacznikami początku i końca znaku. Transmisja nie jest
synchronizowana żadnymi znakami specjalnymi, czy ciągami synchronizującymi. Jej początek
określają zmiany wartości początkowej z poziomu wysokiego na niski. Początek transmisji każdego
ze znaków jest określany z chwilą rozpoczęcia jego nadawania. Interpretacja znaku w odbiorniku
następuje po nadaniu kilku bitów danych, dlatego niewielkie różnice częstotliwości taktowania, po
obu stronach linii (nadajnik/odbiornik), nie mają istotnego znaczenia. Dla detekcji błędów
transmisji opcjonalnie używa się 1-bitowego znacznika parzystej liczby takich samych wartości
bitów jednego znaku. Dane są transmitowane znak-po-znaku na jednym przewodzie transmisyjnym.
W układach transmisji danych każdy bit (lub znak) musi być rozpoznany w czasie określonym
przez takt zegara synchronizującego. Ciąg bitów określających znak jest transmitowany w
znormalizowanej formie zwanej ramką czasową, którą przedstawiono na rys 1.
D0
D1
D2
D7
P
START
STOP
Rysunek 1: Struktura ramki asynchronicznej transmisji
szeregowej
Zmiana sygnału, na przewodzie transmisyjnym, z poziomu wysokiego na niski rozpoczyna
przedział czasu określający bit startu (START). Po bicie startu następuje od 5 do 8 bitów danych
poczynając od najmłodszego - D0, do najstarszego - D7. Ilość bitów zależy od konfiguracji
współpracujących urządzeń. Po bitach danych zostaje zapisany bit parzystości (P) określający
liczbę jedynek w ciągu danych (parzysta lub nieparzysta). Jego zastosowanie jest najprostszym
sposobem sprawdzenia pojedynczego błędu transmisji. Przed kolejnym bajtem danych (znakiem),
rozpoczynanym bitem startu są umieszczane: 1, 1.5 lub 2 interwały czasowe dla bitów końca znaku,
które nazwano bitami stopu (STOP).
Temat do przemyślenia:
Przeanalizuj zależności czasowe transmisji asynchronicznej dla różnych szybkości np. 9600, 19200,
itd. [bod]. Jaka jest rzeczywista przepływność binarna łącza, rozumiana jako ilość bitów
informacyjnych jaką maksymalnie udaje się przetransmitować w jednostce czasu.
2 Wykonanie ćwiczenia
Ćwiczenie wykorzystuje interfejs USART układu STM32F10103, który będzie skonfigurowany w
tryb pracy asynchronicznej (UART). Wymiana danych pomiędzy interfejsem a aplikacja będzie
następowała z wykorzystaniem systemu przerwań. Duży nacisk położono na strukturę kodu, w
której wyraźnie rozdzielono funkcjonalności drivera i aplikacji.
2.1 Konfiguracja stanowiska
Płytka laboratoryjna ZL27ARM wykorzystuje złącze CON3 w standardzie RS232C do transmisji
szeregowej.
Temat do przemyślenia
Przeanalizuj schemat ideowy płyty ZL27ARM. Wskaż numer portu USART, do którego jest
dołączone złącze CON3. Wyszuka informacje na temat standardu RS232C oraz układu U4. Jaka jest
jego funkcja?
Podłączenie płyty ZL27ARM do komputera wymaga wykorzystania kabla typu DCE-DTE, oraz
konwertera USB-RS232C. Należy zestawić stanowisko zgodnie z rysunkiem 1. Przed włączeniem
zasilania płyty należy uzyskać zgodę prowadzącego.
1073139579.009.png 1073139579.010.png 1073139579.011.png 1073139579.012.png
 
ST-LINK
JTAG
USB
ZL27ARM
PC
Konwerter
USB RS232
CON3
USB
Rysunek 2: Konfiguracja stanowiska laboratoryjnego
Następnie należy realizować ćwiczenie zgodnie z punktem 2.4 . Po zrealizowaniu każdego
podpunktu należy zgłosić ten fakt prowadzącemu. Kolejność realizacji podpunktów jest narzucona
przez instrukcję i nie należy jej zmieniać. Do końca ćwiczenia należy zachować kopię kodów
programu wykonanych do danego podpunktu.
Ćwiczenie jest realizowane w oparciu o aplikację przykładową. Wszystkie działania
studentów polegają na modyfikacjach i uzupełnianiu tej aplikacji. Do końca ćwiczenia należy
zachować kopię kodów programu wykonanych do danego podpunktu.
Należy skopiować katalog LAB_UART_ZRODLA do własnego katalogu i otworzyć w środowisku
Keil Microvision projekt LAB_UART. Okno projektu powinno odpowiadać rysunkowi
Rysunek 3: Struktura projektu
2.2 Struktura aplikacji
Wykonanie ćwiczenia opiera się na algorytmie pokazanym na rysunku 4. Jest to prosta aplikacja,
która po rozpoczęciu działania wykonuje niezbędne inicjalizacje a następnie przechodzi do
nieskończonej pętli programu, w której oczekuje na zdarzenia, a po ich wystąpieniu obsługuje je.
Algorytm aplikacji przykładowej pokazano na rysunku 4.
1073139579.001.png 1073139579.002.png
main
Niezbędne
inicjalizacje
Sprawdze-
nie
znacznika
0
Driver
1
Obsługa
danych
Obsługa
przerwań
Bufor danych
Bufor danych
Rysunek 4: Struktura aplikacji przykładowej
Ilustruje to fragment kodu.
<main.c>=
#include "stm32f10x.h"
#include "uart_drv.h"
#include "io.h"
void main(void){
<deklaracje zmiennych lokalnych funkcji main>
<niezbędne inicjalizacje>
while(1){
if(<sprawdzenie znaczników>){
<obsługa danych>
}
}
}
Temat do przemyślenia
Na podstawie kodu źródłowego aplikacji laboratoryjnej należy wskazać jakie urządzenia
peryferyjne mikrokontrolera są inicjalizowane w bloku <niezbędne inicjalizacje> . Należy
zapoznać się z tymi urządzeniami.
Jak pokazano program main nie zajmuje się obsługą buforów danych, funkcja ta jest realizowana
przez driver. Zadaniem drivera jest obsługa systemu przerwań oraz buforów danych. Funkcje
wchodzące w jego skład bezpośrednio odczytują i zapisują dane do rejestrów danych interfejsu
1073139579.003.png 1073139579.004.png 1073139579.005.png 1073139579.006.png 1073139579.007.png 1073139579.008.png
 
transmisji danych (UART). Operacje te będą opisane w dalszej części instrukcji.
Znaczniki informują aplikację, czy w buforach danych znajduje się informacja, która wymaga
obsłużenia. W aplikacji przykładowej znaczniki te są ukryte w pliku <buffer.o> . Dostęp do
nich jest zrealizowany niejawnie, za pośrednictwem funkcji interfejsu
<sprawdzenie znaczników>=
getRxUartData(<adres bufora>) .
Temat do przemyślenia
Funkcja getRxUartData zwraca wartość, która odpowiada ilości danych przepisanych do bufora,
którego adres jest parametrem wywołania. Wskazać deklarację tego bufora w aplikacji
przykładowej oraz podać własny przykład implementacji funkcji getRxUartData .
Obsługa danych w aplikacji przykładowej polega na wysłaniu danych do drivera celem odesłania
ich do komputera PC.
<obsługa danych>=
putTxUartData(buffer, num);
putTxUartData("\n\r", 2);
Funkcja putTxUartData jest interfejsem drivera, który pobiera adres bufora oraz ilość danych,
które się w nim znajdują.
Temat do przemyślenia
W jakim celu umieszczono instrukcję putTxUartData("\n\r", 2) . Co oznaczają znaki \n i \r.
2.2.1 Driver - obsługa buforów danych
Obsługa buforów danych interfejsu UART jest zrealizowana przy pomocy funkcji:
int putTxUartData(char * buffer, int num);
int putRxUartData(char * buffer, int num);
int getTxUartChar(char * buffer);
int getRxUartData(char * buffer);
Aplikacja przykładowa nie udostępnia szczegółów implementacji funkcji obsługi buforów danych.
Implementacja procedur obsługi buforów danych jest tematem zadania 2.4.3 . Udostępniony jest
interfejs funkcji w postaci nagłówka „ buffer.h ”. Kod binarny biblioteki jest dołączany do projektu
w postaci pliku „ buffer.o ”.
Ważne jest, aby Studenci przed realizacją ćwiczenia zrozumieli zasady wykorzystania buforów w
aplikacji przykładowej. Jeżeli Ty masz kłopoty, zapytaj kolegów lub wykładowcy.
2.2.1.1 Funkcja putTxUartData
Funkcja interfejsu putTxUartData umieszcza w buforze nadawczym interfejsu UART num bajtów
danych zawartych w buforze buffer oraz inicjuje nadawanie. Funkcja zwraca wartość mówiącą o
ilości danych, które udało się umieścić w buforze. Jeżeli bufor jest pełny funkcja zwraca wartość
zero. Oznacza to, że funkcja nie nadpisuje danych w buforze nadawczym. Wszystkie uprzednio
wpisane dane zostaną wysłane.
Temat do przemyślenia
Zaproponuj własną implementację bufora. Czy Twoja implementacja posiada zabezpieczenie przed
nadpisaniem jeszcze nie wysłanych danych? Jeżeli nie, to w jaki sposób można zrealizować tą
funkcjonalność?
Zgłoś jeśli naruszono regulamin