LinkedIn YouTube Facebook
Szukaj

Wstecz
Artykuły

ZL31ARM: implementacja funkcji graficznych 2D

Kolejną rzeczą jest pobranie załącznika „Przykładowy program dla STM32” dla modułu KAmodTFT2, który zostanie zmodyfikowany dla potrzeb prezentowanego projektu. Następujące pliki należy skopiować do katalogu projektu i dodać jej w IDE µVision do grupy User: board.h, graphics.c, lcdlib.c, lcdlib.h, main.c, SystemInit.c. W pliku main.c należy usunąć linijki związane z obsługą czujnika przypieszenia MEMS LIS35, aby program został prawidłowo skompilowany. Na rysunku 5 pokazano strukturę projektu.

 

Rys. 5. Drzewo projektu

Rys. 5. Drzewo projektu

 

 

Aby mieć możliwość sterowania programem należy zmodyfikować w pliku board.h jedynie linie związane z joystickiem w następujący sposób:

// Joystick
#define JOY_PORT_OK		GPIOB
#define JOY_OK		GPIO_Pin_5
#define RCC_APB2Periph_JOYOK	RCC_APB2Periph_GPIOB
#define JOY_PORT		GPIOC
#define JOY_UP		GPIO_Pin_0
#define JOY_DOWN		GPIO_Pin_1
#define JOY_LEFT		GPIO_Pin_2
#define JOY_RIGHT		GPIO_Pin_3
#define RCC_APB2Periph_JOY	RCC_APB2Periph_GPIOC

Następnie zmieniamy wiersz na początku powyższych plików z #include „stm32f10x_lib.h” na #include „stm32f10x.h”. Konfiguracja portów wykorzystywanych przez joystick oraz wyświetlacz w pliku SystemInit.c przebiega następująco:

void GPIO_Configuration(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;

	// LCD lines configuration  
  	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ctrl, ENABLE);
  	GPIO_InitStructure.GPIO_Pin = DATA | CLK | CS | RES ;
  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  	GPIO_Init(PORT_ctrl, &GPIO_InitStructure);

	// Joystick direction lines configuration
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_JOY, ENABLE);
  	GPIO_InitStructure.GPIO_Pin = JOY_UP | JOY_DOWN | JOY_LEFT | JOY_RIGHT;
  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  	GPIO_Init(JOY_PORT, &GPIO_InitStructure);
	// Joystick OK line configuration
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_JOYOK, ENABLE);
  	GPIO_InitStructure.GPIO_Pin = JOY_OK;
  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  	GPIO_Init(JOY_PORT_OK, &GPIO_InitStructure);
}

Konfiguracja interfejsu SPI:

void SPI_Configuration(void){
  	SPI_InitTypeDef  SPI_InitStructure;
  	GPIO_InitTypeDef GPIO_InitStructure;

  	// Enable SPI1 and GPIO clocks 
  	RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1 | RCC_APB2Periph_GPIOA, ENABLE);

  	// Configure SPI1 pins: SCK, MISO and MOSI 
  	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  	GPIO_Init(GPIOA, &GPIO_InitStructure);

  	// Configure I/O for Flash Chip select 
  	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_CS;
  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  	GPIO_Init(GPIO_CS, &GPIO_InitStructure);

  	// SPI1 configuration - Master, 8-bit
  	SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  	SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  	SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  	SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
  	SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
  	SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  	SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
  	SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  	SPI_InitStructure.SPI_CRCPolynomial = 7;
  	SPI_Init(SPI1, &SPI_InitStructure);

  	// Enable SPI1  
  	SPI_Cmd(SPI1, ENABLE);
}

Rysowanie punktu

W pliku lcdlib.c znajdują się gotowe definicje kolejnych funkcji, które zostaną wykorzystane przy obsłudze wyświetlacza:

void InitLcdNokia(void);					--inicjalizacja wyświetlacza LCD
void LCDClearScreen(unsigned int color);		--czyszczenie ekranu LCD
void LCDSetPixel(int x, int y, unsigned int color);	--rysowanie punktu(x,y)
void SetContrast(char con);				--ustawienie kontrastu

Inicjalizację wyświetlacza wykonuje się raz na początku działania programu. Gotowa funkcja LCDSetPixel() posłuży jako podstawa do przenoszenia kolejnych punktów na wyświetlacz. Przyjmuje ona 3 parametry: dwie wartości współrzędnych (x,y) z zakresu od 1 do 130 włącznie, oraz 12-bitową wartość koloru (paleta typu BRG, 4 bity/kolor = 16 odmian podstawowego koloru). Tak więc, aby wyświetlić punkt o współrzędnych (x=50,y=100) i kolorze G=4, R=8, B=12 (wartości te są odniesione do maksymalnej, czyli 15) należy wykonać następującą instrukcję:

LCDSetPixel(50,100,0xC84);
Autor: Jan Szemiet
Tagi: ARM, BTC, GPIO, MEMS, STM32