sobota, 22 października 2016

[0] STM32F4 - Rejestry - Rejestry specjale mikrokontrolera

W tym poście chciałbym opisać rejestry specjalne mikrokontrolera STM32F4.

Z rejestrów specjalnych można wyróżnić:
  • PSR - rejestr w statusie.
  • PRIMASK - rejestry masek wyjątków
  • FAULATMASK - rejestry masek wyjątków
  • BASEPRI - rejestry masek wyjątków
  • CONTROL - rejestry kontrolny

W celu operacji na nich wykorzystuje się następujące instrukcje:

  • PRIMASK - rejestry masek wyjątków - odczyt (uint32_t __get_PRIMASK(void)); zapis (void __set_PRIMASK(uint32_t value));
  • FAULATMASK - rejestry masek wyjątków - odczyt (uint32_t __get_FAULTMASK(void)); zapis (void __set_FAULTMASK(uint32_t value));
  • BASEPRI - rejestry masek wyjątków - odczyt (uint32_t __get_BASERPI(void)); zapis (void __set_BASERPI(uint32_t value));
  • CONTROL - rejestry kontrolny - odczyt (uint32_t __get_CONTROL(void)); zapis (void __set_CONTROL(uint32_t value));
  • MSP - odczyt (uint32_t __get_MSP(void)); zapis (void __set_MSP(uint32_t value));
  • PSP - odczyt (uint32_t __get_PSP(void)); zapis (void __set_PSP(uint32_t value));

Do operacji na nich wykorzystuje się takie instrukcje jak MRS czy MSR.

MRS przenosi wartość z rejestru specjalnego do ogólnego. MSR działa natomiast odwrotnie, przenosi wartość z rejestru ogólnego do specjalnego.

Teraz przejdę do opisu zawartości każdego z rejestrów:

Pierwszym z nich będzie PRIMASK jest on wykorzystywany podczas wyzwalania przerwań NVIC, Gdy przerwanie zostanie wywołane oraz jego włączenie zostało zainicjalizowane w rejestrze PRIMASK to będzie ono poprawnie odczytane i nastąpi wywołanie jego obsługi.

Jest on 32 bitowym rejestrem z zarezerwowanymi bitami z zakresu od 31 do 1, dostęp uzyskuje się tylko do bitu oznaczanego jako 0 (czyli do pierwszego bitu). Wprowadzenie zera nie wprowadza żadnych zmian, natomiast wpisanie 1 zapobiega wywołaniu wszystkich wyjątków, przerwań, do których istnieje możliwość przypisanie priorytetu. 

Drugim rejestrem jest FAULTMASK. Zapobiega on aktywacji wszystkich przerwań z wyjątkiem tych niemaskowalnych, które domyślnie są ustawione z priorytetem -2. Jest ono stosowane głównie do debugowania kodu programu w którym może wyłączać zwykłe przerwania poprzez zwieranie ich obwodu.

W tym rejestrze można ustawić, tak jak w PRIMASK, tylko dwie wartości na bicie w pozycji 0. Wprowadzenie jedynki pozwala na wyłączenie obsługi przerwań.

Procesor sam czyści ten wartość tego bitu poprzez wprowadzenie 0. Wykonuje to po wyjściu z handlera dla danego wyjątku, oczywiście poza NMI.

Następnym w kolejności jest BASERPI (ang. Base priority mask register). Pozwala on na zdefiniowanie minimalnej wartości priorytetu dla wyjątków. Czyli jeśli jest do niego wprowadzona wartość niezerowa to wszystkie wyjątki o takim samym priorytecie lub niższym zostają zablokowane.
Tym razem do dyspozycji jest nieco więcej bitów bo aż 3 tzn od. 4 do 7.


Teraz przyszła kolej na rejestr CONTROL czyli rejestr kontrolny. W nim do ustawienia są trzy bity na pozycjach 0, 1 oraz 2. Bit 2 tzw. FPCA pozwala na zdefiniowanie czy stan zmiennoprzecinkowy będzie aktywny czy podczas wykonywania wyjątku. Następnym bit jest SPSEL pozwala on na ustawienie wskaźnika MSP dla wartości zero lub PSP dla 1. PSP wykonuje się tylko podczas normalnej pracy układu, w przerwaniu obsługiwany jest MSP. Bit 0 nPRIV określa tryb pracy użytkownika jako uprzywilejowany, po wprowadzeniu zera, lub nieuprzywilejowany dla jedynki. Określają one jakie prawa dostępu do obszarów przestrzeni adresowej są dostępne dla użytkownika. Należy pamiętać, że w trakcie wykonywania przerwania mikrokontroler automatycznie wchodzi w tryb uprzywilejowany, po czym wraca do normalnego po zakończeniu obsługi przerwania. Taki tryb jest też włączany dla mikrokontrolera bezpośrednio po jego włączeniu, dopiero po wprowadzeniu głównych ustawień zostaje on zmieniony.

Przejście pomiędzy tymi trybami jest możliwe tylko podczas obsługi przerwania, w innych wypadkach jest on ignorowany.

PSR jest podzielony na kilka rejestrów takich jak APSR (Application program Status Register), IPSR(Interrupt Program Status Register), EPSR(Execution Program Status Register). Prezentują się one następująco:


Pierwszym z grupy jest APSR, Przechowuje on aktualny stan flag z wywołanych wcześniej instrukcji. Składa się z następujących możliwości ustawienia danych:

N - Flaga określająca wartość negatywną albo mniejszą od wywołanego rezultatu
Z - Wynik operacji był niezerowy (dla 0) lub zero (dla 1)
C - Flaga przenoszona lub pożyczona
V - Flaga przeładowania, czyli czy dana operacja wywołała przeładowanie bądź czy go nie wywołała.
Q - Przeładowanie DSP albo gdy instrukcje SSAT lub USAT spowodowały nasycenie. 
GE - Określa czy dane wystąpienia flag były większe lub równe 

Następnym rejestrem jest IPSR. Przechowuje on wartości aktualnie wykonywanego przerwania. Wynik znajduje się na bitach od 0 do 8.

EPSR przechowuje bity stanu instrukcji Thumb oraz bity stanu dla instrukcji IT oraz ICI.