SHARE
TWEET

systick.c

teplofizik Aug 18th, 2013 80 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
Top