Advertisement
teplofizik

slowtimer.c

Aug 7th, 2013
301
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.24 KB | None | 0 0
  1.  
  2. #include "Slow_timer.h"
  3. #include "bitbanding.h"
  4.  
  5. // Привязку к контроллеру тоже делаем внутри сишника, не надо светить ею наружу - это не их дело
  6. #include <stm32f10x.h>
  7.  
  8. // Снаружи это знать никому не надо, потому пусть в сишнике и объявляется, а не в заголовочном
  9. typedef enum
  10. {
  11.     TIMER_MODE_DELETED,
  12.     TIMER_MODE_STOP,
  13.     TIMER_MODE_REPEAT,
  14.     TIMER_MODE_ONCE
  15. } TTimerMode;
  16.  
  17. // Ну и все кишочки тоже спрячем. Внешним модулям толку от них никакого, только зря мусорить в пространстве имён будет
  18. #if (SLOW_TIMER_NUMBER == 1)||(SLOW_TIMER_NUMBER==8)||(SLOW_TIMER_NUMBER==9)||(SLOW_TIMER_NUMBER==10)||(SLOW_TIMER_NUMBER==11)
  19. #define SYS_FREQ_TIMER                          SystemFrequency_APB2Clk
  20. #define TIMER_IRQ_SUFFIX                        _UP_
  21. #define TIMER_SLOW_APBENR                       APB2ENR
  22. #else
  23. #define SYS_FREQ_TIMER                         (SystemFrequency_APB1Clk*2)
  24. #define TIMER_IRQ_SUFFIX                        _
  25. #define TIMER_SLOW_APBENR                       APB1ENR
  26. #endif
  27.  
  28. #define __SLOW_TIMER(N)                         TIM##N
  29. #define _SLOW_TIMER(N)                          __SLOW_TIMER(N)
  30. #define SLOW_TIMER                              _SLOW_TIMER(SLOW_TIMER_NUMBER)
  31.  
  32. #define __SLOW_TIMER_IRQH(N,S)                  TIM##N##S##IRQHandler
  33. #define _SLOW_TIMER_IRQH(N,S)                   __SLOW_TIMER_IRQH(N,S)
  34. #define SLOW_TIMER_IRQHandler                   _SLOW_TIMER_IRQH(SLOW_TIMER_NUMBER, TIMER_IRQ_SUFFIX)
  35.  
  36. #define __SLOW_TIMER_IRQN(N,S)                  TIM##N##S##IRQn
  37. #define _SLOW_TIMER_IRQN(N,S)                   __SLOW_TIMER_IRQN(N,S)
  38. #define SLOW_TIMER_IRQn                         _SLOW_TIMER_IRQN(SLOW_TIMER_NUMBER, TIMER_IRQ_SUFFIX)
  39.  
  40. #define __SLOW_TIMER_RCC_EN(A, N)               RCC_##A##_TIM##N##EN
  41. #define _SLOW_TIMER_RCC_EN(A, N)                __SLOW_TIMER_RCC_EN(A, N)
  42. #define SLOW_TIMER_RCC_EN                       _SLOW_TIMER_RCC_EN(TIMER_SLOW_APBENR, SLOW_TIMER_NUMBER)
  43.  
  44. #define SLOW_TIMER_PRESCALER                    ((SYS_FREQ_TIMER/100000)-1)
  45. #define SLOW_TIMER_PERIOD                       ((100000/SLOW_TIMER_FREQUENCY)-1)
  46.  
  47. typedef struct
  48. {
  49.    uint8_t timer_mode;
  50.    uint16_t counter;
  51.    uint16_t reload;
  52.    void (*handler)();
  53. } sSlow_Timer;
  54.  
  55. volatile sSlow_Timer Slow_Timers[SLOW_TIMER_COUNT];
  56.  
  57. __inline void Slow_Timer_Lock(void)
  58. {
  59.     BIT_BAND_PER(SLOW_TIMER->DIER,TIM_DIER_UIE)=RESET;
  60. }
  61.  
  62. __inline void Slow_Timer_Unlock(void)
  63. {
  64.     BIT_BAND_PER(SLOW_TIMER->DIER,TIM_DIER_UIE)=SET;
  65. }
  66.  
  67. void Slow_Timer_Delete(int8_t index)
  68. {
  69.     if (index >= SLOW_TIMER_COUNT) return;
  70.  
  71.     Slow_Timers[index].timer_mode = TIMER_MODE_DELETED;
  72.     Slow_Timers[index].handler = 0;
  73. }
  74.  
  75. void Init_Slow_Timer(void)
  76. {
  77.     uint8_t i;
  78.     for(i = 0; i < SLOW_TIMER_COUNT; i++) Slow_Timer_Delete(i);
  79.  
  80.     BIT_BAND_PER(RCC->TIMER_SLOW_APBENR,SLOW_TIMER_RCC_EN) = SET;
  81.  
  82.     SLOW_TIMER->PSC = SLOW_TIMER_PRESCALER;
  83.     SLOW_TIMER->CNT = 0x0000;
  84.     SLOW_TIMER->ARR = SLOW_TIMER_PERIOD;
  85.  
  86.     NVIC_SetPriority(SLOW_TIMER_IRQn, 15);
  87.     NVIC_EnableIRQ(SLOW_TIMER_IRQn);
  88.  
  89.     BIT_BAND_PER(SLOW_TIMER->EGR,TIM_EGR_UG) = SET;
  90.     BIT_BAND_PER(SLOW_TIMER->SR,TIM_SR_UIF) = SET;
  91.     BIT_BAND_PER(SLOW_TIMER->DIER,TIM_DIER_UIE)=SET;
  92.     BIT_BAND_PER(SLOW_TIMER->CR1,TIM_CR1_CEN)=SET;
  93. }
  94.  
  95. void Slow_Timer_Modify(int8_t index, uint8_t mode, uint16_t counter, uint16_t reload)
  96. {
  97.     if (index >= SLOW_TIMER_COUNT) return;
  98.  
  99.     Slow_Timer_Lock();
  100.     if (!mode)    Slow_Timers[index].timer_mode = mode;
  101.     if (!counter) Slow_Timers[index].counter = counter;
  102.     if (!reload)  Slow_Timers[index].reload = reload;
  103.     Slow_Timer_Unlock();
  104. }
  105.  
  106. int8_t Slow_Timer_Add(uint8_t mode, uint16_t counter, void (*handler)(void))
  107. {
  108.     uint8_t i;
  109.  
  110.     for (i = 0; i < SLOW_TIMER_COUNT; i++)
  111.     {
  112.         if (Slow_Timers[i].timer_mode == TIMER_MODE_DELETED)
  113.         {
  114.             Slow_Timers[i].counter = counter;
  115.             Slow_Timers[i].reload = counter;
  116.             Slow_Timers[i].handler = handler;
  117.             Slow_Timers[i].timer_mode = mode;
  118.             return i;
  119.         }
  120.     }
  121.  
  122.     return -1;
  123.     // Проверка тут не нужна
  124. }
  125.  
  126. void SLOW_TIMER_IRQHandler(void)
  127. {
  128.     uint8_t i;
  129.  
  130.     BIT_BAND_PER(SLOW_TIMER->SR,TIM_SR_UIF) = RESET;
  131.     for(i = 0; i < Timer_Counter - 1; i++)
  132.     {
  133.         // Шлак пропустим
  134.         if(Slow_Timers[i].timer_mode <= TIMER_MODE_STOP) continue;
  135.  
  136.         if(Slow_Timers[i].counter <= 1)
  137.         {
  138.             void (* Handler)(void) = Slow_Timers[i].handler;
  139.  
  140.             // Перезапустим
  141.             Slow_Timers[i].counter = Slow_Timers[i].reload;
  142.             if(Slow_Timers[i].timer_mode == TIMER_MODE_ONCE)
  143.                 Slow_Timers[i].timer_mode = TIMER_MODE_STOP;
  144.  
  145.             // Поменяем все поля заранее, чтоб не насорить потом, если таймер удалят в handler или ещё что
  146.             if(Handler) Handler();
  147.         }
  148.         else
  149.         {
  150.             Slow_Timers[i].counter--;      
  151.         }
  152.     }
  153. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement