Odtwarzacz plików muzycznych
Transkrypt
Odtwarzacz plików muzycznych
Paweł Kallas Warszawa, 30.06.2016r. Mikrokontrolery ARM Odtwarzacz plików muzycznych Cel projektu Celem projektu jest stworzenie prostego odtwarzacza plików muzycznych zapisanych w formacie *.wav przy użyciu mikrokontrolera ARM wraz z podłączonymi peryferiami. Projekt będzie składał się z następujących podzadań: • • • • odczyt danych z pamięci zewnętrznej (karta pamięci) Przetwarzanie plików *.wav przesłanie danych do przetwornika cyfrowo-analogowego i wysłanie ich przez port mini-jack obsługa przycisków w celu interakcji z użytkownikiem (zmiana utworu, pauza itp.) Z punktu widzenia obsługi gotowy projekt powinien zachowywać się jak klasyczny przenośny odtwarzacz mp3. Wykorzystany sprzęt Do realizacji tego projektu wykorzystana zostanie płytka uruchomieniowa STM32F407 (zawiera ona układ DAC oraz wyjście audio). Dodatkowo konieczne będzie podłączenie: • • pamięci zewnętrznej (USB) przycisków do nawigacji – podłączanych do dowolnego z portów mikrokontrolera Przetwornik CS43L22 Na płytce uruchomieniowej STM32F407VG zainstalowany jest przetwornik audio. Komunikacja z nim odbywa się poprzez interfejs I2C (włączanie, konfiguracja), natomiast dane przesyłane są przez interfejs I2S. Wykorzystane biblioteki W celu uproszczenia programowania miktrokontrolera wykorzystane zostały biblioteki zewnęrzne stworzone przez Tilena Majerle dostępne na stronie http://stm32f4-discovery.com. Są to następujące biblioteki: GPIO – do obsługi portów zewnętrznych DISCO – obsługa przycisku oraz diod FATFS – system plików USB_MSC_HOST – stworzenie hosta do obsługi pamięci zewnętrznej I2C – do komunikacji z przetwornikiem audio SPI – do przesyłania danych do przetwornika EXTI – do obsługi przerwań zewnętrznych (wykorzystywane do obsługi przycisku) Opis działania programu W kodzie programu zostało użyte bardzo dużo komentarzy, które wyjaśniają jego działanie. Poniżej przedstawiono opis zgrubny działania programu, aby przybliżyć jego ogólne założenia. Program jest stworzony w pojedynczym pliku „main.c” z odwołaniami do bibliotek zewnętrznych zamieszczonych w folderze „TM”. Przed główną pętlą programu zadeklarowane zostały zmienne, które będą wykorzystywane przez całość programu. Następnie, w głównej funkcji programu inicjowane są wszystkie używane komponenty, w tym konfigurowany jest przetwornik CS43L22. Następnie, w nieskończonej pętli następuje próba połączenia się z urządzeniem podłączonym do portu USB. Jeżeli taka próba się powiedzie urządzenie zostaje zmontowane a następnie przeszukiwany jest jego główny folder. Jeżeli znajdą się tam pliki z rozszerzeniem *.wav, zostają one kolejno odtwarzane. Odpowiedzialna jest za to funkcja „playWavFile”. Odtwarzanie pliku WAV Na początku z pliku sczytywane są pierwsze 44 bajty, które zgodnie ze standardem pliku wave przechowują informacje o sposobie zakodowania pliku. Są to między innymi prędkość próbkowania pliku, ilość bajtów w próbce, ilość kanałów itp. Informacje te są wykorzystane do odpowiedniej konfiguracji przetwornika audio. Następnie plik jest odczytywany kolejno do 2 buforów, które są przesyłane do przetwornika przez SPI w przerwaniu. Działa to w ten sposób, że w momencie gdy bufor wyjściowy jest pusty przesyłane sa kolejne dane z aktualnego bufora. Gdy dojdziemy do końca bufora zmieniamy bufor na drugi i informujemy program główny (przez zmienną „bufferEmpty”) o konieczności wypełnienia pustego buforu. Taki sposób odtwarzania gwarantuje ciągłe odtwarzanie pliku. Obsługa przycisku Dodatkowo, poza pętlą główną, w przerwaniu, obsługiwany jest przycisk. Do jego poprawnego działania zastosowano programowe przeciwdziałanie drganiu styków. Polega to na sprytnym wykorzystaniu oczekiwania procesora a następnie ponownym teście stanu przycisku. Obsługa przycisku polega wyłącznie na zmianie stanu zmiennej logicznej „play”. W sytuacji gdy zmienna ta przechowuje wartość 1 odtwarzanie następuje, natomiast w przeciwnym przypadku (0) odtwarzanie jest wstrzymane. Działa to więc na zasadzie przycisku „Play/Pause”. Diody LED Do dodatkowej komunikacji z użytkownikiem wykorzystane są diody LED istniejące na płytce. Po poprawnym połączeniu z pamięcią zewnętrzną zapalona zostaje dioda zielona. W trakcie odtwarzania świeci się dioda niebieska, natomiast w sytuacji gdy skończą się pliki do odtwarzania zapalona zostaje dioda pomarańczowa.