Advertisement
teplofizik

systick.c

Aug 18th, 2013
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.10 KB | None | 0 0
  1. // ***********************************************************
  2. //  systick.с
  3. //  Системный таймер
  4. //
  5. // ***********************************************************
  6.  
  7. #include "systick.h"
  8. #include "clock.h"
  9. #include <stm32f4xx.h>
  10. #include <string.h>
  11.  
  12. // Количество обработчиков максимальное
  13. #define TIMER_HANDLERS    10
  14.  
  15. typedef struct
  16. {
  17.     TTimerHandler Handler;
  18.     uint16_t      Countdown;
  19.     uint16_t      Reload;
  20.    
  21.     // Запущено
  22.     bool          Run;
  23.     // Сработало
  24.     bool          Fired;
  25. } THandlers;
  26.  
  27. // Функции, кои будут вызываться
  28. static THandlers Handlers[TIMER_HANDLERS];
  29. static uint32_t  TimerFrequency;
  30. static int       TimerCount;
  31.  
  32. void SysTick_Handler(void)
  33. {
  34.     int i;
  35.    
  36.     for(i = 0; i < TIMER_HANDLERS; i++)
  37.     {
  38.         if(Handlers[i].Run)
  39.         {
  40.             if(--Handlers[i].Countdown == 0)
  41.             {
  42.                 Handlers[i].Countdown = Handlers[i].Reload;
  43.        
  44.                 // Запишем, что сработало
  45.                 Handlers[i].Fired = true;
  46.             }
  47.         }
  48.     }
  49. }
  50.  
  51. // Запуск таймера с заданной частотой
  52. void timer_Init(uint32_t Frequency)
  53. {
  54.     if(!Frequency) return;
  55.    
  56.     // Сбросим параметры
  57.     TimerCount = 0;
  58.     TimerFrequency = Frequency;
  59.     memset(&Handlers[0], 0, sizeof(Handlers));
  60.    
  61.     // Настройка частоты
  62.     SysTick_Config(clock_GetSYS() / Frequency);
  63.    
  64.     // Разрешение прерывания
  65.     NVIC_EnableIRQ(SysTick_IRQn);
  66. }
  67.  
  68. // Добавить функцию в список вызова, Handler будет вызываться с заданной частотой
  69. void timer_AddFunction(uint16_t Frequency, TTimerHandler Handler)
  70. {
  71.     int i;
  72.    
  73.     for(i = 0; i < TIMER_HANDLERS; i++)
  74.     {
  75.         if(!Handlers[i].Handler)
  76.         {
  77.             Handlers[i].Run       =  true;
  78.             Handlers[i].Fired     =  false;
  79.             Handlers[i].Handler   =  Handler;
  80.             Handlers[i].Reload    = (TimerFrequency / Frequency);
  81.             Handlers[i].Countdown =  Handlers[i].Reload;
  82.  
  83.                     TimerCount++;
  84.             return;
  85.         }
  86.     }
  87. }
  88.  
  89. // Изменить частоту таймера
  90. void timer_ChangeFrequency(TTimerHandler Handler, uint16_t Frequency)
  91. {
  92.     int i;
  93.    
  94.     for(i = 0; i < TIMER_HANDLERS; i++)
  95.     {
  96.         if(Handlers[i].Handler == Handler)
  97.         {
  98.             Handlers[i].Reload = (TimerFrequency / Frequency);
  99.             Handlers[i].Countdown = Handlers[i].Reload;
  100.             break;
  101.         }
  102.     }
  103. }
  104.  
  105. // Включить таймер
  106. void timer_Resume(TTimerHandler Handler)
  107. {
  108.     int i;
  109.    
  110.     for(i = 0; i < TIMER_HANDLERS; i++)
  111.     {
  112.         if(Handlers[i].Handler == Handler)
  113.         {
  114.             Handlers[i].Run = true;
  115.             break;
  116.         }
  117.     }
  118. }
  119.  
  120. // Остановить таймер
  121. void timer_Stop(TTimerHandler Handler)
  122. {
  123.     int i;
  124.    
  125.     for(i = 0; i < TIMER_HANDLERS; i++)
  126.     {
  127.         if(Handlers[i].Handler == Handler)
  128.         {
  129.             Handlers[i].Run = false;
  130.             Handlers[i].Fired =  false;
  131.             break;
  132.         }
  133.     }
  134. }
  135.  
  136. void timer_Main(void)
  137. {
  138.     int i;
  139.    
  140.     for(i = 0; i < TIMER_HANDLERS; i++)
  141.     {
  142.         // Если сработало - вызовем.
  143.         if(Handlers[i].Fired)
  144.         {
  145.             Handlers[i].Fired = false;
  146.             Handlers[i].Handler();
  147.         }
  148.     }
  149. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement