Funkcje API w obsłudze GPIO
Producent mikrokontrolerów STM32 zaleca, aby wszystkie nieużywane wyprowadzenia były skonfigurowane jako analogowe wejścia, czego konsekwencją jest mniejsze zużycie energii oraz większa odporność na EMI. O ile w mniejszych jednostkach 8-bitowych miało to mniejsze znaczenie, to należy pamiętać, że tutaj mikrokontroler pracuje z dużo większą częstotliwością, ponadto znaczna część rodziny STM32 posiada relatywnie dużą liczbę wyprowadzeń, zatem takie ich ustawienie ma istotne znaczenie dla optymalizacji pracy systemu.
Funkcje alternatywne i „remapping”
W niektórych przypadkach fizyczne rozmieszczenie elementów na docelowej płytce drukowanej nie pozwala na podłączenie urządzenia, bądź elementu zewnętrznego do wyprowadzenia, które jest domyślnie powiązane z interesującą projektanta alternatywną jego funkcją. W takich sytuacjach na ratunek przychodzi możliwość „przemapowania” (remapping) GPIO. Jeśli więc przypisanie danej funkcji alternatywnej, np. portu USART nie odpowiada potrzebom projektowanej aplikacji, to można ową funkcję przepisać do innego, bardziej odpowiedniego dla aktualnego zastosowania wyprowadzenia. Takie zabiegi mogą być przeprowadzane tylko dla ściśle określonych wyprowadzeń, co jest szczegółowo podane w nocie katalogowej każdego mikrokontrolera z rodziny STM32.
List. 2. Przykładowe przemapowanie pinów związanych funkcjonalnie z Timerem 3
void GPIO_Conf(void) { GPIO_InitTypeDef GPIO_InitStruct; GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStruct); }
Tab. 1. Możliwe sposoby przypisania linii Timera 3 do GPIO
Funkcja | Domyślnie | Częściowy remapping | Całkowity remapping |
TIM3_CH1 | PA6 | PB4 | PC6 |
TIM3_CH2 | PA7 | PB5 | PC7 |
TIM3_CH3 | PB0 | PC8 | |
TIM3_CH4 | PB1 | PC9 |
Przykłady możliwości zmiany funkcji różnych pinów dla czterech kanałów Timera 3 są przedstawione w tab. 1, natomiast jedno z możliwych rozwiązań programowych przedstawiono na list. 2. Do zmiany przypisania domyślnego funkcji alternatywnej służy funkcja GPIO_PinRemapConfig. Informacje, które należy przekazać funkcji to określenie interesujących nas peryferiów, podanie czy przemapowanie ma być tylko częściowe, czy całkowite oraz czy włączamy, czy wyłączamy remapping. Przedstawiony fragment kodu sprawi, że Timer 3 będzie sterował wyjściami od GPIO_Pin_6 do GPIO_Pin_9. Należy oczywiście pamiętać o włączeniu taktowania dla funkcji alternatywnej i samego portu (tutaj będzie to port GPIOC) w bloku konfiguracji sygnałów zegarowych i zerowania – funkcja RCC_Conf.