[2] Aplikacje zestawu FRDM-KL25Z – sterowanie diodami LED w Kinetis Design Studio

Rozbudowa projektu o dodatkowe diody LED i licznik SysTick

Zaprezentowany powyżej program jest bardzo prosty, jednak nie pozwala on na jawne określenie czasu oczekiwania pomiędzy przełączaniem stanów czerwonej diody LED. Aby to poprawić wykorzystamy licznik SysTick, którego zadaniem będzie precyzyjne zliczanie czasu oraz generowanie przerwań co 1 ms zliczanych z kolei przez zdefiniowaną przez nas funkcję wait_ms().

 

Rys. 16. Dodanie komponentu typu TimerInt_LDD

 

Dodanie interesującego nas komponentu TimerInt_LDD przeprowadzamy podobnie jak w przypadku pojedynczej linii GPIO, ale tym razem na bloczku SysTick (rysunek 16). W widoku Component Inspector powinna pojawić się odpowiednia zakładka Properties (rysunek 17) – można ją również wywołać klikając na dodanym komponencie TI1:TimerInt_LDD w widoku Components lub na grafice w widoku Processor. W podświetlonym na czerwono polu Interrupt period wprowadzamy „1 kHz”, natomiast w wewnętrznej zakładce Initialization zaznaczamy opcję Auto Initialization (rysunek 18). Po zapisaniu projektu generujemy nowy kod z menu Project → Generate Processor Expert Code. Warto tutaj zauważyć, że przy dodawaniu bardziej złożonych komponentów są automatycznie dodawane komponenty je tworzące.

 

Rys. 17. Komponent TimerInt_LDD wymaga skonfigurowania podstawowych parametrów

 

Rys. 18. Konfiguracja licznika SysTick

 

Dalej przełączamy się do perspektywy C/C++ oraz otwieramy plik Events.c, w którym odnajdujemy wygenerowaną funkcję TI1_OnInterrupt() i uzupełniamy ją w następujący sposób:

  1. [...]
  2. /* User includes (#include below this line is not maintained by Processor Expert) */
  3. int delay_ms;
  4. [...]
  5.  
  6. void TI1_OnInterrupt(LDD_TUserData *UserDataPtr){
  7. if(delay_ms)
  8. --delay_ms;
  9. }

Natomiast w pliku main.c definiujemy funkcję wait_ms(), przy czym robimy to w miejscu które nie zostanie nadpisane przez generator kodu (można byłoby ją zdefiniować w oddzielnym pliku, ale dla wygody przy niewielkich programach można to zrobić w tym samym pliku co funkcja main()):

  1. [...]
  2. /*** End of main routine. DO NOT MODIFY THIS TEXT!!! ***/
  3. void wait_ms(int d){
  4. extern int delay_ms;
  5.  
  6. delay_ms = d;
  7. while( delay_ms );
  8. }
  9. [...]

Pamiętajmy również o umieszczeniu deklaracji danej funkcji gdzieś w dozwolonym miejscu na początku pliku, aby uniknąć błędów kompilacji. Zamieniamy także w głównej pętli programu instrukcje:

  1. for(i = 0; i < 0xAFFF; ++i);

na instrukcje:

  1. wait_ms(250);

W wyniku takiej modyfikacji czerwona dioda LED będzie zapalana i gaszona z częstotliwością 2Hz. Dodatkowo program można uzupełnić o obsługę pozostałych diod LED dostępnych na płytce FRDM-KL25Z (rysunek 5,19,20), zapalanych po kolei w sekwencji R, G, B, OFF.

 

Rys. 19. Dodanie komponentów z widoku Components Library

 

Rys. 20. Uzupełnienie projektu o dodatkowe komponenty typu BitIO_LDD

 

  1. int main(void)
  2. /*lint -restore Enable MISRA rule (6.3) checking. */
  3. { /* Write your local variable definition here */
  4.  
  5. /*** Processor Expert internal initialization. DON'T REMOVE THIS CODE!!! ***/
  6. PE_low_level_init();
  7. /*** End of Processor Expert internal initialization. ***/
  8.  
  9. /* Write your code here */
  10. while(1){
  11. wait_ms(250);
  12. RLED_ClrVal(NULL);
  13. GLED_SetVal(NULL);
  14. BLED_SetVal(NULL);
  15.  
  16. wait_ms(250);
  17. RLED_SetVal(NULL);
  18. GLED_ClrVal(NULL);
  19. BLED_SetVal(NULL);
  20.  
  21. wait_ms(250);
  22. RLED_SetVal(NULL);
  23. GLED_SetVal(NULL);
  24. BLED_ClrVal(NULL);
  25.  
  26. wait_ms(250);
  27. RLED_SetVal(NULL);
  28. GLED_SetVal(NULL);
  29. BLED_SetVal(NULL);
  30. }
  31.  
  32. /*** Don't write any code pass this line, or it will be deleted during code generation. ***/
  33. /*** RTOS startup code. Macro PEX_RTOS_START is defined by the RTOS component. DON'T MODIFY THIS CODE!!! ***/
  34. #ifdef PEX_RTOS_START
  35. PEX_RTOS_START(); /* Startup of the selected RTOS. Macro is defined by the RTOS component. */
  36. #endif
  37. /*** End of RTOS startup code. ***/
  38. /*** Processor Expert end of main routine. DON'T MODIFY THIS CODE!!! ***/
  39. for(;;){}
  40. /*** Processor Expert end of main routine. DON'T WRITE CODE BELOW!!! ***/
  41. } /*** End of main routine. DO NOT MODIFY THIS TEXT!!! ***/