CooCox CoIDE i STM32F4Discovery – jak zacząć?
Do obsługi diody LED wystarczy wybrać tylko jeden komponent standardowej biblioteki obsługi peryferii – komponent GPIO, a zaraz potem pojawi się okienko dialogowe z pytaniem czy utworzyć nowy projekt, gdyż w zakładce Project okna głównego brak jest jakiegokolwiek projektu i należy tutaj wybrać „Tak” (rysunek 7). W kolejnym okienku (rysunek 8) wystarczy podać nazwę projektu oraz ewentualną inną lokalizację (wtedy należy odznaczyć pole Use default location i podać katalog roboczy projektu) i kliknąć Finish. Można teraz zauważyć, że program automatycznie wybrał wszystkie te komponenty z których korzysta element GPIO (występują tutaj powiązania) oraz przygotował gotową strukturę projektu w zakładce Project okna głównego (rysunek 9).
Rys. 6. Lista dostępnych komponentów
Rys. 7. Pytanie o utworzenie nowego projektu
Rys. 8. Podanie nazwy i lokalizacji tworzonego projektu
Rys. 9. Przykładowa struktura projektu
Rys. 10. Komponenty obsługi zewnętrznych urządzeń
W tym samym kroku oprócz komponentów związanych z obsługą wewnętrznych modułów peryferyjnych mikrokontrolera można również wybierać komponenty obsługi zewnętrznych urządzeń, takie jak pliki obsługi wyświetlacza LCD i czujnika temperatury – patrz zakładki Drivers i Others w dolnej części okna Repository (rysunek 10). Warto dodać, że takie komponenty mogą być dodawane przez zwykłych użytkowników do głównej bazy projektu nawet z poziomu samego oprogramowania. Ponieważ zestaw STM32F4Discovery posiada zewnętrzny oscylator 8MHz za pomocą którego jest taktowany układ to wymagana jest drobna modyfikacja pliku system_stm32f4xx.c, w którym częstotliwość sygnału systemowego jest ustawiona na 168 MHz. Należy znaleźć linijkę:
#define PLL_M 25
i zamienić wartość 25 na 8:
#define PLL_M 8
Plik main.c z pętlą while() został również dodany automatycznie, więc aby przetestować kompilację prostego projektu dodajemy poniższy kod realizujący migotanie dwóch diod LED podłączonych do wyprowadzeń PD12 oraz PD14 i z menu głównego wybieramy: Project -> Build (albo klawisz F7). Jeżeli wszystko zostało wykonane bez błędów to efekt powinien być podobny do przedstawionego na rysunku 11.
#include #include void Delay(void) { volatile uint32_t i; for (i = 0; i != 0xFFFFF; i++); } int main(void) { GPIO_InitTypeDef GPIO_InitStructure; // Wlaczenie sygnalu taktujacego port D RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD , ENABLE); GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_12 | GPIO_Pin_14); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOD, &GPIO_InitStructure); // Wyzerowanie wyjscia PD14 GPIO_ResetBits(GPIOD, GPIO_Pin_14); // Ustawienie wyjscia PD12 GPIO_SetBits(GPIOD, GPIO_Pin_12); while(1){ // Zmiana stanu wyjsc na przeciwny GPIO_ToggleBits(GPIOD, GPIO_Pin_12 | GPIO_Pin_14); // Czekaj Delay(); } }