Advertisement
teplofizik

systick.c

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