Advertisement
teplofizik

exti.c (exti)

May 30th, 2013
618
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.22 KB | None | 0 0
  1. //
  2. // exti.c
  3. //
  4.  
  5. #include "exti.h"
  6. #include <stm32f4xx.h>
  7.  
  8. #include <string.h>
  9.  
  10. typedef struct
  11. {
  12.     TPin        Pin;
  13.     bool        Enabled;
  14.     TSignalEdge Edge;
  15.    
  16.     void     (* Handler)(void);
  17. } TEXTIRecord;
  18.  
  19. static const int HandlerCount = 16;
  20. static TEXTIRecord EXTIHandlerList[HandlerCount];
  21.  
  22. static void EXTI_IRQHandler(TEXTIRecord * Record)
  23. {
  24.     if(Record->Handler) Record->Handler();
  25. }
  26.  
  27. void EXTI0_IRQHandler(void) { EXTI->PR = (1 << 0); EXTI_IRQHandler(&EXTIHandlerList[0]); }
  28. void EXTI1_IRQHandler(void) { EXTI->PR = (1 << 1); EXTI_IRQHandler(&EXTIHandlerList[1]); }
  29. void EXTI2_IRQHandler(void) { EXTI->PR = (1 << 2); EXTI_IRQHandler(&EXTIHandlerList[2]); }
  30. void EXTI3_IRQHandler(void) { EXTI->PR = (1 << 3); EXTI_IRQHandler(&EXTIHandlerList[3]); }
  31. void EXTI4_IRQHandler(void) { EXTI->PR = (1 << 4); EXTI_IRQHandler(&EXTIHandlerList[4]); }
  32.  
  33. void EXTI5_9_IRQHandler(void)
  34. {
  35.     int i;
  36.    
  37.     for(i = 5; i < 10; i++)
  38.     {
  39.         if(EXTI->PR & (1 << i))
  40.         {
  41.             EXTI->PR = (1 << i);
  42.             EXTI_IRQHandler(&EXTIHandlerList[i]);
  43.         }
  44.     }
  45. }
  46.  
  47. void EXTI10_15_IRQHandler(void)
  48. {
  49.     int i;
  50.    
  51.     for(i = 10; i < 16; i++)
  52.     {
  53.         if(EXTI->PR & (1 << i))
  54.         {
  55.             EXTI->PR = (1 << i);
  56.             EXTI_IRQHandler(&EXTIHandlerList[i]);
  57.         }
  58.     }
  59. }
  60.  
  61. void exti_Init(void)
  62. {
  63.     RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN;
  64. }
  65.  
  66. void exti_Main(void)
  67. {
  68.    
  69. }
  70.  
  71. static void exti_EnableInterrupt(uint8_t Index)
  72. {
  73.     EXTI->IMR |= (1 << Index);
  74.    
  75.     switch(Index)
  76.     {
  77.     case 0: NVIC_EnableIRQ(EXTI0_IRQn); break;
  78.     case 1: NVIC_EnableIRQ(EXTI1_IRQn); break;
  79.     case 2: NVIC_EnableIRQ(EXTI2_IRQn); break;
  80.     case 3: NVIC_EnableIRQ(EXTI3_IRQn); break;
  81.     case 4: NVIC_EnableIRQ(EXTI4_IRQn); break;
  82.     case 5:
  83.     case 6:
  84.     case 7:
  85.     case 8:
  86.     case 9: NVIC_EnableIRQ(EXTI9_5_IRQn); break;
  87.     case 10:
  88.     case 11:
  89.     case 12:
  90.     case 13:
  91.     case 14:
  92.     case 15: NVIC_EnableIRQ(EXTI15_10_IRQn); break;
  93.     }
  94. }
  95.  
  96. // void Handler(void);
  97. bool exti_Listen(const TPin * Pin, TSignalEdge Edge, void * Handler)
  98. {
  99.     uint8_t Register;
  100.     uint8_t Shift;
  101.     uint32_t Temp;
  102.     uint8_t Index;
  103.    
  104.     Index = Pin->Pin;
  105.    
  106.     if(Index > 15) return false;
  107.     if(Pin->Port > PI) return false;
  108.    
  109.     Register = Index >> 2;
  110.     Shift = (Index & 0x03) * 4;
  111.    
  112.     // Выберем порт для прослушивания
  113.     Temp = SYSCFG->EXTICR[Register];
  114.     Temp &= ~(0xF << Shift);
  115.     Temp |= (Pin->Port << Shift);
  116.     SYSCFG->EXTICR[Register] = Temp;
  117.    
  118.     EXTIHandlerList[Index].Edge = Edge;
  119.     EXTIHandlerList[Index].Enabled = true;
  120.     EXTIHandlerList[Index].Handler = (void(*)(void))Handler;
  121.     memcpy(&EXTIHandlerList[Index].Pin, Pin, sizeof(TPin));
  122.    
  123.     switch(Edge)
  124.     {
  125.     case EDGE_RISING:
  126.         EXTI->RTSR |=  (1 << Index);
  127.         EXTI->FTSR &= ~(1 << Index);
  128.         break;
  129.     case EDGE_FALLING:
  130.         EXTI->RTSR &= ~(1 << Index);
  131.         EXTI->FTSR |=  (1 << Index);
  132.         break;
  133.     case EDGE_BOTH:
  134.         EXTI->RTSR |= (1 << Index);
  135.         EXTI->FTSR |= (1 << Index);
  136.         break;
  137.     }
  138.    
  139.     exti_EnableInterrupt(Index);
  140.    
  141.     return true;
  142. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement