STM32 i czujnik koloru TCS3200
Poniżej przedstawiono fragment programu głównego stworzonej aplikacji.
int main(void) { //konfiguracja Configuration_RCC(); Configuration_Interrupts(); Configuration_GPIO(); //ustawienie nEO TCS3200_DISABLE; //wybranie filtru - Clear TCS3200_Clear; //ustawienie skali częstotliwości TCS3200_Freq_20p; //włączenie diod LED TCS3200_LED_ON; //konfiguracja licznika TIM_TimeBaseStructure.TIM_Period = 999; TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //konfiguracja sygnału TIM_TIxExternalClockConfig(TIM2, TIM_TIxExternalCLK1Source_TI1, TIM_ICPolarity_Rising, 0x0); //wlaczenie licznika TIM_Cmd(TIM2, ENABLE); //pobranie informacji o częstotliwości RCC_GetClocksFreq(&RCC_Clocks); //konfiguracja SysTick SysTick_Config(RCC_Clocks.SYSCLK_Frequency/100); //inicjalizacja wyświetlacza modułu KAmodLCD1 PCD8544_INIT(); PCD8544_LCDClear(); //aktualizacja informacji wyświetlanych na wyświetlaczu PCD8544_LCDWriteText("KAmodColor",12,0); PCD8544_LCDWriteText("Clear 00,0 kHz",0,1); //14 PCD8544_LCDWriteText("Red 00,0 kHz",6,2); //12 PCD8544_LCDWriteText("Green 00,0 kHz",0,3); //14 PCD8544_LCDWriteText("Blue 00,0 kHz",3,4); //13 PCD8544_LCDWrite(); //nieskończona pętla while (1) { //aktualizacja informacji, filtr - Clear tmp = FreqClear; PCD8544_LCDWriteSign((tmp % 10) + 0x30,60-6*1,1); tmp = tmp / 10; PCD8544_LCDWriteSign((tmp % 10) + 0x30,60-6*3,1); tmp = tmp / 10; PCD8544_LCDWriteSign((tmp % 10) + 0x30,60-6*4,1); ... //aktualizacja danych wyświetlanych na LCD PCD8544_LCDWrite(); } }
Na początku programu przeprowadzana jest konfiguracja zegarów, przerwań oraz linii GPIO. W kolejnym kroku przeprowadzane jest ustawienie poszczególnych linii, realizowane jest to przy wykorzystaniu definicji bardziej złożonych operacji, definicje operacji znajdują się w pliku defines.h projektu. Dla przykładu definicja polecenia TCS3200_DISABLE przedstawia się następująco:
GPIO_TCS3200->BSRR = GPIO_BSRR_BS(TCS3200_PIN_nOE)
Funkcja GPIO_BSRR_BS także jest definicją, która w połączeniu z parametrem generuje nazwę bitu rejestru BSRR. Tak duża liczba definicji zwiększa czytelność kodu oraz powoduje, że w prowadzenie zmian (np. odnośnie połączenia linii) sprowadza się do zmiany paru wartości w jednym miejscu całego projektu. W zależności od warunków można zmienić ustawienia zakresu częstotliwości oraz ustawić we własnym zakresie czy diody LED mają być zapalone, czy zgaszone.
W następnym kroku przeprowadzana jest inicjalizacja licznika, przeprowadzana jest ona w klasyczny sposób. Jak wiadomo w programie będzie realizowany pomiar częstotliwości poprzez zliczanie impulsów. W przypadku mikrokontrolerów z rodziny STM32 mamy możliwość skonfigurowania licznika tak aby sygnał podawany był z zewnątrz. Właśnie za to odpowiada polecenie:
TIM_TIxExternalClockConfig(TIM2, TIM_TIxExternalCLK1Source_TI1, TIM_ICPolarity_Rising, 0x0);
Powyższe polecenie powoduje, że sygnałem zegarowym licznika TIM2 staje się sygnał podawany na linię kanału pierwszego licznika TIM2 (w tym przypadku jest to pin PA0), natomiast zliczanie odbywa się na zboczu narastającym. Następnie włączany jest licznik TIM2.
W kolejnym kroku mamy pobranie częstotliwości poszczególnych linii zegarowych i zapisanie ich to struktury RCC_Clocks. W wyniku tego działania w następnym kroku konfigurowane jest przerwanie SysTick w taki sposób aby występowało 100 w ciągu sekundy, uzyskano to poprzez podzielenie częstotliwości sygnału, jakim taktowany jest licznik SysTcik, przez 100. Podczas obsługi przerwania realizowany jest odczyt licznika, występowanie przerwania z taką częstotliwością sprawia, iż odczytany wynik jest wielokrotnością 102Hz.