LinkedIn YouTube Facebook
Szukaj

Newsletter

Proszę czekać.

Dziękujemy za zgłoszenie!

Wstecz
Artykuły

KwikStik K40: Kinetis i SmartSwitch z OLED

Zanim zaczniemy zapisywać do pamięci sterownika obraz musimy poinformować sterownik do jakiego okna mają trafić dane, służą do tego instrukcje:

  • 0x15, następnie wysyłamy numery pierwszej i ostatniej kolumny okna
  • 0x75, następnie wysyłamy numery pierwszego i ostatniego wiersza okna

Aby zapisać cały ekran przycisku ISC15ANP4 musimy wysłać sekwencje 0x15, 0x10, 0x4F i 0x75, 0x0, 0x2F. Ta operacja jest realizowana przez funkcję ISC15ANP4_SetRangeToFullScreen.

void ISC15ANP4_SetRangeToFullScreen()
{
DC_Low();

	SPI0Write(0x15, 0); SPI0Write(0x10, 0); SPI0Write(0x4F, 1);	// Set column range
	
	SPI0Write(0x75, 0); SPI0Write(0x0, 0); SPI0Write(0x2F, 1);	// Set row range

	DC_High();
}

 

Rys. 5. Format zapisu koloru pojedynczego piksela

Rys. 5. Format zapisu koloru pojedynczego piksela

 

 

Po ustaleniu okna możemy przystąpić do wysłania obrazu do wyświetlenia. Kolor każdego piksela jest określony przez dwa bajty (format RGB 565 – rysunek 5). Przykładowa aplikacja wyświetla po kolei bitmapy zapisane w tablicach kinetis, kamami i µc, zmiana wyświetlanego obrazu następuje po naciśnięciu przycisku, nowa bitmapa jest „wskrolowywana” na wyświetlacz od prawej strony, operacja ta jest dość nieskomplikowana, więc nie będę się skupiał na realizacji tego efektu, zainteresowani mogą zajrzeć do źródeł.
Tablice z bitmapami stworzone zostały z wykorzystaniem programu BitmapToCArray.exe, który konwertuje bitmapy w formacie BMP do tablicy w języku C w formacie 565 (do pobrania poniżej).

Konfiguracja zewnętrznego przerwania

Naciśnięcia przycisku obsłużymy wykorzystując przerwanie zewnętrzne. Przerwanie dla linii PTE9 (dołączona do jednego z wyprowadzeń SW przycisku) konfigurowane jest w funkcji ISC15ANP4_Init, kolejne kroki konfiguracji to:

  • Odblokowanie zegara portu
    SIM->SCGC5 |= (1 << SIM_SCGC5_PORTE_SHIFT);
  • Wybór funkcji linii (MUX = 1), włączenie rezystora podciągającego do masy (PE=1, PS=0) oraz odblokowanie przerwania na krawędzi rosnącej (IRQC = 9)
    PORTE->PCR[9] = PORT_PCR_MUX(1) | (1 << PORT_PCR_PE_SHIFT) | PORT_PCR_IRQC(9);
  • Konfiguracja linii PTE9 jako wejściowej
    PTE->PDDR &= ~(1 << 9);
  • Odblokowanie przerwania w kontrolerze przerwań NVIC. Żeby to zrobić musimy ustawić odpowiedni bit jednego z rejestrów ISER, w których każdy kolejny bit dotyczy jednego przerwania. W celu określenia numeru rejestru i bitu najlepiej jest sięgnąć do Reference Manuala, w tabeli 3-4 możemy odczytać numer przerwania (kolumna IRQ), dla naszego przerwania numer to 91. Ponieważ rejestry ISER są 32-bitowe i numerowane od 0 obliczenia wyglądają następująco
    Numer rejestru ISER = 91 div 32 = 2
    Numer bitu w rejestrze ISER = 91 mod 32 = 27
    Czyli zapisujemy jedynkę w bicie 27 rejestru ISER2.
    NVIC->ISER[2] |= (1 << 27);

Obsługa przerwania dokonywana jest w funkcji PORTE_IRQHandler, aby poinformować kontroler przerwań że przerwanie zostało już obsłużone musimy zapisać jedynkę w odpowiednim bicie rejestru ISFR, w innym przypadku po pierwszym naciśnięciu przycisku ciągle wywoływana byłaby funkcja obsługująca przerwanie (poniżej).

void PORTE_IRQHandler()
{
	if (++currentImage == 3) currentImage = 0;
	switch (currentImage)
	{
	case 0:
		ISC15ANP4_Transition(kinetis, kamami);
		break;
	case 1:
		ISC15ANP4_Transition(kamami, uc);
		break;
	case 2:
	    	ISC15ANP4_Transition(uc, kinetis);
	}						
	PORTE->ISFR |= (1 << 9);
}