MSP430
DMA
Układ bezpośredniego dostępu do pamięci (Direct Memory Access - DMA)
umożliwia przesyłanie danych spod jednego adresu pod inny adres bez
pośrednictwa jednostki centralnej. Na przykład możliwy jest transfer
danych z rejestrów przetwornika ADC12 do wybranego obszaru pamięci
RAM.
W zależności od modelu mikrokontrolera może on zawierać od jednego do
trzech układów DMA.
Użycie kontrolera DMA może zwiększyć przepustowość danych pomiędzy
peryferiami mikrokontrolera. Może również zmniejszać pobór energii gdyż
na czas działania układu jednostka centralna jest wprowadzana w stan
uśpienia.
Układ DMA na następujące właściwości:
- do trzech niezależnych kanałów transmisyjnych
- wybór konfiguracja priorytetów dla kanałów
- tylko dwa cykle na transfer
- możliwość transmisji bajt, słowo lub bajt/słowo
- blok transmisji danych do 65535 bajtów lub słów
- wybór źródła wyzwalania
- wybór wyzwalania zboczem lub poziomem
- cztery tryby adresowania
- trzy tryby transmisji:
pojedyncza
blokowa
blokowa przerywana
Tryby adresowania
Ustawianie trybów adresowania dla każdego kanału jest niezależne.
- stały adres do stałego adresu:
- Stały adres do bloku adresów
- Blok adresów do stałego adresu
- blok adresów do bloku adresów
Transfer pojedynczy
Znacznik DMASRCINCRx określa, czy adres źródła jest inkrementowany,
dekrementowany czy pozostaje bez zmian.
Znacznik DMADSTINCRx określa, czy adres przeznaczenia jest
inkrementowany, dekrementowany czy pozostaje bez zmian.
Jeżeli następuje transfer słowo – bajt, to przesyłany jest tylko mniej
znaczący bajt słowa.
Jeżeli następuje transfer bajt – słowo, bardziej znaczący bajt słowa jest
zerowany.
Rejestry
DMAxSZ - jest używany do określenia liczby transferów.
DMAxSA – rejestr z adresem źródła.
DMAxDA - rejestr z adresem przeznaczenia.
Jeżeli DMAxSZ = 0, to nie ma transmisji. Zawartości rejestrów DMAxSA,
DMAxDA i DMAxSZ są kopiowane do rejestrów pomocniczych .
Zawartość rejestru DMAxSZ jest dekrementowana po każdej operacji
transferu. Jeżeli stan rejestru po dekrementacji osiągnie 0, to rejestr ten
jest ładowany z rejestru pomocniczego i jest ustawiany znacznik DMAIFG
– start przerwania.
Jeżeli znacznik DMADTx = 0, znacznik DMAEN jest kasowany
automatycznie kiedy DMAxSZ osiągnie wartość 0 i musi być ustawiony
ponownie, by odbył się kolejny transfer.
W trybie powtarzania DMAEN = 1 i transfer następuje po przyjściu
sygnału wyzwalania.
Transfer blokowy
W trybie pracy blokowej jeden sygnał wyzwalający uruchamia przesyłanie
całego bloku danych. W trakcie przesyłania danych inne sygnały
wyzwalające są pomijane. Gdy znacznik DMADTx = 1, po skończonej
transmisji znacznik DMAEN jest zerowany. Przed kolejną transmisją musi
on być ustawiony ponownie.
DMAxSZ – określa liczbę przesłanych danych, DMADSTINCRx
inkrementację/dekrementację adresu przeznaczenia, a DMASRCINCRx –
inkrementację/dekrementację adresu źródła.
Rejestry DMAxSA, DMAxDA, and DMAxSZ pracują tak samo jak przy
przesyłaniu pojedynczym. Znacznik DMAIFG jest ustawiany gdy rejestr
DMAxSZ osiągnie wartość 0.
W trakcie transmisji jest wstrzymywana praca CPU. Trnsmisja blokowa
trwa 2xMCLK x DMAxSZ.
Jeżeli transfer blokowy jest powtarzany cyklicznie to znacznik DMAEN
pozostaje ustawiony po skończonym przesłaniu bloku i układ oczekuje na
następny sygnał wyzwalania.
Transfer blokowy przerywany
W tym trybie układ DMA pracuje na przemian z CPU. CPU wykonuje 2
cykle MCLK po każdy przesłaniu czterech bajtów lub słów. Po skończonej
transmisji znacznik DMAEN jest kasowany. Przed następną transmisją
musi być ponownie ustawiony.
Przychodzące sygnały wyzwalające podczas transferu są ignorowane.
Praca rejestrów i ustawianie znaczników jest takie samo jak podczas
pracy blokowej za wyjątkiem przesyłania ciągu bloków. Po skończeniu
transmisji jednego bloku znacznik DMAEN pozostaje ustawiony i
transmisja kolejnego loku następuje od razu - bez sygnału
wyzwalającego. Przerwanie transmisji może nastąpić poprzez
zerowanie znacznika DMAEN lub przerwanie niemaskowane NMI jeżeli
jest odblokowane.
Rejestr DMAxTSELx
Każdy kanał DMA jest ustawiany niezależnie poprzez wpis odpowiednich
wartości do rejestrów DMAxTSELx. Modyfikacja tych rejestrów może
nastąpić tylko wtedy, gdy odpowiadający im znacznik DMAEN jest
wyzerowany. W przeciwnym przypadku działanie DMA jest
nieprzewidywalne. Układ DMA działa tylko na zbocze narastające sygnału
wyzwalającego z wyjątkiem sygnału zewnętrznego.
Uwaga! Transfer uruchamiany przez wybrany układ struktury
wewnętrznej startuje w momencie ustawienia znacznika przerwania ale
tylko wtedy gdy nie jest ustawiony odpowiedni znacznik odblokowujący
przerwanie. Znacznik przerwania jest automatycznie kasowany po
rozpoczęciu transferu.
0000 - transfer jest wyzwalany po ustawieniu znacznika DMAREQ.
Znacznik jest kasowany
automatycznie po
rozpoczęciu transmisji.
0001 – transfer jest wyzwalany gdy jest ustawiany znacznik CCIFG a
wyzerowany jest
znacznik CCIE rejestru TACCR2. Znacznik
CCIFG jest zerowany automatycznie
po rozpoczęciu transferu.
0010 - transfer jest wyzwalany gdy jest ustawiany znacznik CCIFG a
wyzerowany jest
znacznik CCIE rejestru TBCCR2. Znacznik
CCIFG jest zerowany automatycznie
po rozpoczęciu transferu.
0011 - USART0: transfer jest wyzwalany gdy jest ustawiony znacznik
URXIFG0 a
wyzerowany jest znacznik URXIE0. Znacznik URXIFG0
jest zerowany automatycznie po rozpoczęciu transferu.
- USCI_A0: transfer jest wyzwalany gdy jest ustawiony znacznik
UCA0RXIFG a wyzerowany jest znacznik UCA0RXIE. Znacznik
UCA0RXIFG jest zerowany
automatycznie po rozpoczęciu transferu.
0100 - USART0: transfer jest wyzwalany gdy jest ustawiony znacznik
UTXIFG0 a
wyzerowany jest znacznik UTXIE0. Znacznik UTXIFG0
jest zerowany automatycznie po rozpoczęciu transferu.
- USCI_A0: transfer jest wyzwalany gdy jest ustawiony znacznik
UCA0TXIFG a wyzerowany jest znacznik UCA0TXIE. Znacznik
UCA0TXIFG jest zerowany
automatycznie po rozpoczęciu transferu.
0101 - transfer jest wyzwalany gdy jest ustawiany znacznik DAC12IFG a
wyzerowany jest
znacznik DAC12IE rejestru DAC12_0CTL.
Znacznik DAC12IFG jest zerowany
automatycznie po rozpoczęciu
transferu.
0110 – przy przetwarzaniu dla pojedynczego kanału transfer jest
wyzwalany gdy jest
ustawiany odpowiadający mu znacznik
ADC12IFGx. Przy przetwarzaniu
sekwencyjnym transfer jest
wyzwalany po ustawieniu znacznika ADC12IFGx po
ostatnim
przetworzeniu. Ustawienie znacznika ADC12IFGx programowa nie da
żadnego efektu. Znaczniki ADC12IFGx są automatycznie kasowane gdy
odpowiedni rejestr ADC12MEMx jest odczytywany przez układ
DMA.
0111 - transfer jest wyzwalany gdy jest ustawiany znacznik CCIFG a
wyzerowany jest
znacznik CCIE rejestru TACCR0. Znacznik
CCIFG jest zerowany automatycznie po rozpoczęciu transferu.
1000 - transfer jest wyzwalany gdy jest ustawiany znacznik CCIFG a
wyzerowany jest
znacznik CCIE rejestru TBCCR0. Znacznik
CCIFG jest zerowany automatycznie po
rozpoczęciu transferu.
1001 – transfer jest wyzwalany gdy jest ustawiany znacznik URXIFG1 a
wyzerowany jest
znacznik URXIE1. Znacznik URXIFG1 jest
zerowany automatycznie po
rozpoczęciu transferu.
1010 - transfer jest wyzwalany gdy jest ustawiany znacznik UTXIFG1 a
wyzerowany jest
znacznik UTXIE1. Znacznik UTXIFG1 jest
zerowany automatycznie po
rozpoczęciu transferu.
1011 - transfer jest wyzwalany gdy mnożnik hardware’owy jest gotowy do
nowej operacji
1100 - transfer jest wyzwalany gdy jest ustawiany znacznik UCB0RXIFG
a wyzerowany jest
znacznik UCB0RXIE. Znacznik
UCB0RXIFG jest zerowany automatycznie po rozpoczęciu transferu.
1101 - transfer jest wyzwalany gdy jest ustawiany znacznik UCB0TXIFG a
wyzerowany jest
znacznik UCB0TXIE. Znacznik
UCB0TXIFG jest zerowany automatycznie po rozpoczęciu transferu.
1110 - transfer jest wyzwalany gdy jest ustawiany znacznik DMAxIFG.
Znacznik DMA0IFG
wyzwala kanał 1, znacznik DMA1IFG wyzwala
kanał 2 a znacznik DMA2IFG wyzwala kanał 0. Powyższe znaczniki nie
są kasowane po starcie transferu.
1111 - transfer jest wyzwalany zewnętrznym sygnałem DMAE0.
Wyzwalanie sygnałem zewnętrznym.
Sygnał zewnętrzny wyzwala transfer zboczem narastający gdy znacznik
DMALEVEL = 0. Transfer trwa do momentu przesłania wszystkich
danych. Gdy DMALEVEL = 1 transfer trwa tak długo jak znacznik DMAE0
jest w stanie wysokim. Jeżeli sygnał DMAE0 przyjmuje poziom niski
podczas transferu blokowego, to transfer ten jest przerywany. Ponowne
ustawienie tego znacznika powoduje kontynuację transferu, chyba że
zostały zmodyfikowane rejestry układu DMA.
Wstrzymanie pracy CPU.
Znacznik DMAONFETCH steruje sposobem pracy CPU podczas transferu
przez układ DMA.
Gdy DMAONFETCH = 0 jednostka centralna jest natychmiast
zatrzymywana po rozpoczęciu transferu przez układ DMA. Gdy
DMAONFETCH = 1 jednostka centralna najpierw kończy wykonywanie
instrukcji a dopiero potem jest zatrzymywana i w tym momencie startuje
transfer danych.
Gdy układ DMA realizuje wpis do pamięci flash znacznik DMAONFETCH
musi być ustawiony. W przeciwny przypadku trudno określić przebieg
operacji zapisu.
Zatrzymanie pracy DMA
Pracę DMA można zatrzymać na dwa sposoby:
a. Każdy rodzaj transmisji można zatrzymać przerwaniem
niemaskowalnym NMI gdy w rejestrze DMACTL1 jest ustawiony
znacznik ENNMI.
b. Przerywana praca blokowa może być zatrzymana po wyzerowaniu
znacznika DMAEN.
Priorytety układu DMA
Priorytety dla układu DMA są następujące: DMA0−DMA1−DMA2. Jeżeli
przyjdą równocześnie dwa lub trzy sygnały wyzwalające, to startuje układ
o najwyższym priorytecie. Następnie jest uruchamiany układ o niższym
priorytecie, a na końcu o najniższym priorytecie, niezależnie od trybu
pracy układów DMA. Kanał o wyższym priorytecie czeka na zakończenie
trwającej transmisji kanału o niższym priorytecie.
Priorytety kanałów DMA można ustawiać znacznikiem ROUNDROBIN.
Jeżeli znacznik ten jest ustawiony, to kanał który skończy transmisję
przyjmuje najniższy priorytet. Natomiast układ priorytetów nie ulegają
zmianie, tzn. zachowana jest kolejność: DMA0−DMA1−DMA2.
Priorytety dla kanałów DMA nie mają zastosowania dla procesorów serii
MSP430FG43x.
Liczba cykli transferu.
Układ DMA potrzebuje jednego lub dwóch cykli zegarowych do
synchronizacji przed każdym transferem pojedynczym lub do
zakończenia transferów blokowych. Każde przesłanie bajtu lub słowa
wymaga dwóch cykli MCLK po synchronizacji i jednego cyklu
opóźnienia po transferze. Ponieważ układ DMA jest taktowany sygnałem
MCLK, dlatego szybkość przesyłania zależy od trybu pracy i stanu
generatora , z którego jest pobierany sygnał MCLK.
Jeżeli źródło sygnału MCLK jest aktywne, a CPU jest wyłączone, to
układ DMA używa sygnału MCLK bez uruchamiania CPU. Jeżeli źródło
MCLK jest wyłączone, to układ DMA uruchamia to źródło na czas
transferu, a następnie je wyłącza.
Układ DMA i system przerwań.
Wykonywany przez DMA transfer nie jest przerywany przez przerwanie.
System przerwań oczekuje na koniec transferu. Wyjątkiem jest
przerwanie NMI gdy jest ustawiony znacznik ENNMI.
Natomiast program obsługi przerwania jest przerywany gdy startuje
transfer DMA. Jeżeli wybrana procedura nie może być przerwana przez
układ DMA, to układ ten musi by zablokowany przed uruchomieniem tej
procedury.
Kontroler przerwań DMA
Każdy kanał DMA posiada własny znacznik przerwań DMAIFG. Znacznik
ten jest ustawiony dla dowolnego trybu pracy gdy odpowiadający mu
rejestr DMAxSZ dojdzie do zera. Jeżeli odpowiedni znacznik DMAIE jest
ustawiony i jest odblokowany znacznik ogólny przerwań GIE, jest
generowany sygnał przerwania.
Wszystkie znaczniki mają jeden wspólny wektor przerwań. Należy
programowo sprawdzić który układ DMA uruchomił przerwanie.
Znaczniki przerwań nie są automatycznie kasowane.
Wyjątkiem jest procesor serii MSP430FG461x który posiada rejestr
wektorów przerwań DMAIV wskazujący numer przerwania. Podobnie jak
w układach TimerA itp.