LinkedIn YouTube Facebook
Szukaj

Wstecz
Artykuły

STM32Butterfly2: obsługa LCD z telefonu Nokia 6100/6610

Natomiast listing programu głównego przedstawia się następująco.

int main(void)
{

   //JOY pin configuration input pullup VCC
    RCC->APB2ENR |= JOY_PORT_APB2;
    io_config_ext(JOY_PORT, JOY_BITS, GPIO_MODE_INPUT, GPIO_CNF_IN_PULLUP );
    io_set_clr_mask( JOY_PORT, JOY_BITS, JOY_BITS );
    //Initialize system timer
    time_init();
    //Initialize the color display
    nlcd_init();  
    //Clear screen
    nlcd_clear_screen();
    //Draw initial lines
    draw_hline(1,HLINE_COLOR);
    draw_vline(1,VLINE_COLOR);
    for(int x=1,y=1,px=1,py=1;;)
    {
        //Read joy state
        int jstate1 = joy_keys();
        wait_ms(KBD_DEBOUNCE_TIME);
        int jstate2 = joy_keys();
        if(jstate1 && jstate1==jstate2)
        {
            //If key pressed get position
	    switch(jstate1)
            {
                case JOY_U: if(y1) y--;  break;
                case JOY_L: if(x>1) x--;  break;
                case JOY_R: if(x

 

W pierwszym kroku przeprowadzana jest konfiguracja linii joysticka. Operacja ta odbywa się poprzez włączenie zegara dla portu GPIO, do którego podłączone są linii joysticka (ustawienie bitu w rejestrze RCC->APB2ENR), oraz konfiguracji linii jako wejścia PULLUP. Za konfigurację linii jako wejścia odpowiada funkcja io_config_ext, jako pierwszy parametr przyjmuje ona nazwę portu, drugi parametr określa konfigurowane linie, trzeci parametr czy linie są wejściowe czy wyjściowe, ostatni parametr określa tryb działania. Niezbędnym w konfiguracji linii joysticka jest podciągnięcie ich do potencjału dodatniego, które realizowane jest przez funkcję io_set_clr_mask. Funkcja ta wymaga podania trzech parametrów, pierwszy z nich określa nazwę portu, drugi określa stan ustawianych linii (bitowa wartość ‘0’ na danej pozycji zeruje linię, bitowa wartość ‘0’ na danej pozycji ustawia w stan wysoki linię), ostatni parametr jest maską blokującą zmianę stanó1) tylko do wskazanych linii.

W kolejnym kroku realizowana jest konfiguracja licznika SysTick, za działanie to odpowiada funkcja time_init(). Działanie jej sprowadza się do określenia priorytetu przerwania pochodzącego od licznika SysTick, określeniu częstotliwości występowania przerwania oraz włączenia licznika.

Następnie, poprzez wywołanie funkcji , przeprowadzana jest inicjalizacja wyświetlacza modułu KAmodTFT2. Listing funkcji został przedstawiony poniżej.

void nlcd_init(void) 
{
	int i;
	// Hardware reset
	RCC->APB2ENR |=  SPI_APB2ENR_PORT | CTRL_APB2ENR_PORT;
	io_config(CTRL_PORT,SCE_BIT,GPIO_MODE_50MHZ,GPIO_CNF_GPIO_PP);
	io_config(CTRL_PORT,RES_BIT,GPIO_MODE_50MHZ,GPIO_CNF_GPIO_PP);
	io_config(SPI_PORT,MOSI_BIT,GPIO_MODE_50MHZ,GPIO_CNF_GPIO_PP);
	io_config(SPI_PORT,SCK_BIT,GPIO_MODE_50MHZ,GPIO_CNF_GPIO_PP);
	sce(1);
	sck(1);
	mosi(1);
	res(0);
	for(i = 0; i < 80000; i++) nop();
	res(1);
	for(i = 0; i < 80000; i++) nop();

	// Sleep out
	transfer_spi_command(SLEEPOUT);

	// Inversion on (command 0x20)
	transfer_spi_command(INVOFF); 

	// Color Interface Pixel Format (command 0x3A)
	transfer_spi_command(COLMOD);
	transfer_spi_data(0x03); // 0x03 = 12 bits-per-pixel

	// Memory access controler (command 0x36)
	transfer_spi_command(MADCTL);
	transfer_spi_data(0x50);

	for(i = 0; i < 2000; i++) nop();

	// Display On (command 0x29)
	transfer_spi_command(DISPON);	
}

 

W pierwszym kroku działania funkcji włączany jest zegar dla portów obsługującego linie transmisji oraz przeprowadzenie konfiguracji używanych linii przy pomocy funkcji io_config. Po przeprowadzeniu konfiguracji następuje ustawienie odpowiednich stanów na liniach SCE, SCK i MOSI. Wykonywany jest także reset wyświetlacza poprzez początkowe ustawienie linii RES w stan niski, a następnie przełączenie, po wykonaniu opóźnienia, w stan wysoki. Opóźnienie zostało zrealizowane poprzez wykonanie pętli for określoną liczbę razy w ramach, której wywoływana jest operacja nop().

Następnym działaniem jest wysłanie do wyświetlacza komend, które w pierwszej kolejności wybudzają go, wyłączają inwersje, ustawienie 12-bitowego formatu określającego kolor danego piksela (4 bity na każdy z kolorów) oraz określenie żądanego dostępu do pamięci wyświetlacza (parametr ten określa odbicie obrazu w poziomie i w pionie oraz sposób inkrementowania kolejnych komórek). Po wysłaniu powyższych poleceń następuje zatrzymanie programu na pewien czas, po którym wysyłana jest komenda włączająca wyświetlanie obrazu na wyświetlaczu.

Tagi: GPIO, LED