Precyzyjne opóźnienia w połączeniu z trybami oszczędzania energii w STM32, część 2

List. 9. Program testowy umieszczony w pliku main.c

Na listingu 9 zamieszczono przykładowy program główny. Częstotliwość w MHz taktowania rdzenia i liczników ustawiamy za pomocą stałej HCLK_MHZ. Rodzaj testu wybieramy za pomocą makrodefinicji:
Pobór prądu zasilania możemy mierzyć, definiując stałą SUPPLY_CURRENT. Zakomentowanie tej definicji umożliwia pomiar czasu opóźnień mikrosekundowych i milisekundowych. Na wyjściu FREQ pojawia się wtedy sygnał o częstotliwości będącej w przybliżeniu połową odwrotności opóźnienia zadanego definicjami USLEEP_TIME i MSLEEP_TIME. Jeśli zdefiniowana jest stała  USLEEP_TIME, to w pętli wywoływana jest dwukrotnie funkcja USleep z argumentem równym tej stałej. Analogicznie jeśli zdefiniowana jest stała MSLEEP_TIME, to w pętli wywoływana jest dwukrotnie funkcja MSleep z argumentem równym tej stałej. W czasie pierwszego wywołania każdej z tych funkcji na wyjściu FREQ jest poziom wysoki, a w czasie drugiego – poziom niski. Jeśli żadna z tych stałych nie jest zdefiniowana, mierzymy częstotliwość iteracji „pustej” pętli, bez funkcji opóźniających. Zmierzony czas opóźnienia obliczamy jako połowę różnicy miedzy okresem iteracji pętli z funkcjami opóźniającymi a okresem iteracji pętli bez funkcji opóźniających. Sposób pracy regulatora 1,8 V w trybie zatrzymania wybieramy za pomocą stałej PWR_REGULATOR_MODE zdefiniowanej w pliku sleep.c, co zostało omówione w pierwszej części artykułu.
Aby skompilować przykład, potrzebny jest jeszcze plik nagłówkowy delay.h zawierający sygnaturę funkcji Delay, która została przedstawiona na początku pierwszej części artykułu. W pliku delay.c należy umieścić jej implementację, a w pliku out.c – implementacje funkcji, których sygnatury są na listingu 6. Ponadto Standard Peripheral Library wymaga obecności pliku stm32f10x_conf.h, który w naszym przypadku zawiera tylko puste makro:

O autorze