Przykład 2 – wykorzystanie linii GPIO (joystick)
W ćwiczeniu należy zaświecić diodę LED po przechyleniu joysticka.W ćwiczeniu należy zaświecić diodę LED po przechyleniu joysticka. Sposób dołączenia diod LED oraz joysticka do mikrokontrolera jest następujący:
Główna funkcja programu jest pokazana na list. 1.
List. 1. Funkcja główna przykładowego programu
int main(void) { // GPIO Configuration GPIO_Configuration(); while (1) { if(GPIO_ReadInputDataBit(GPIOE, JOY_R) == 0) GPIO_ResetBits(GPIOE, GPIO_Pin_15); else GPIO_SetBits(GPIOE, GPIO_Pin_15); if(GPIO_ReadInputDataBit(GPIOE, JOY_L) == 0) GPIO_ResetBits(GPIOE, GPIO_Pin_14); else GPIO_SetBits(GPIOE, GPIO_Pin_14); } }
Jak widać w nieskończonej pętli jest sprawdzany stan linii 11 i 12 portu E. Po wykryciu niskiego poziomu na tych liniach jest zapalana odpowiednia dioda LED. Dioda D1 jest dołączona do linii 14 portu E (PE14), dioda D2 jest dołączona do linii 15 portu E (PE15). Diody są zapalane niskim poziomem napięcia na linii, który można uzyskać funkcją:
GPIO_ResetBits(nazwa_portu, numery_linii_do_wyzerowania)
Funkcja GPIO_Configuration() ustawia linie wejścia-wyjścia w odpowiedni tryb pracy. W opisywanym przypadku konieczne jest ustawienie linii 14 i 15 portu E w tryb wyjściowy, natomiast linie 11 i 12 tego portu należy ustawić jako linie wejściowe. Jest to dokonywane za pomocą:
// Configuration of LED pins GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14 | GPIO_Pin_15; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOE, &GPIO_InitStructure); // Configuration of joystick pins GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOE, &GPIO_InitStructure);
Dodatkowo konieczne jest dołączenie sygnału zegarowego do modułu portów wejścia-wyjścia (domyślnie sygnał zegarowy jest odłączony, aby mikrokontroler pobierał mniej prądu):
RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE);