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
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);