Facebook
From diody, 7 Years ago, written in C.
Embed
Download Paste or View Raw
Hits: 393
  1. #include "AT91SAM9263-EK.h"
  2. #include "AT91SAM9263.h"
  3.  
  4. //void TIMER_handler()__attribute__ ((interrupt("IRQ")));
  5.  
  6.  
  7. volatile int flag = 0;
  8.  
  9. void initLED1(){
  10.         AT91C_BASE_PIOB->PIO_OER = AT91C_PIO_PB8;
  11.         AT91C_BASE_PIOB->PIO_PER = AT91C_PIO_PB8;
  12.         AT91C_BASE_PIOB->PIO_CODR = AT91C_PIO_PB8;
  13. }
  14.  
  15. void initLED2(){
  16.         AT91C_BASE_PIOC->PIO_OER = AT91C_PIO_PC29;
  17.         AT91C_BASE_PIOC->PIO_PER = AT91C_PIO_PC29;
  18.         AT91C_BASE_PIOC->PIO_CODR = AT91C_PIO_PC29;
  19. }
  20.  
  21. void TurnOnLED1(){
  22.         AT91C_BASE_PIOB->PIO_CODR = AT91C_PIO_PB8;
  23. }
  24.  
  25. void TurnOffLED1(){
  26.         AT91C_BASE_PIOB->PIO_SODR= AT91C_PIO_PB8;
  27. }
  28.  
  29. void TurnOnLED2(){
  30.         AT91C_BASE_PIOC->PIO_CODR = AT91C_PIO_PC29;
  31. }
  32.  
  33. void TurnOffLED2(){
  34.         AT91C_BASE_PIOC->PIO_SODR= AT91C_PIO_PC29;
  35. }
  36.  
  37. void TurnOnLEDS(){
  38.         TurnOnLED1();
  39.         TurnOnLED2();
  40. }
  41.  
  42. void TurnOffLEDS(){
  43.         TurnOffLED1();
  44.         TurnOffLED2();
  45. }
  46. void InitLEDS(){
  47.         initLED1();
  48.         initLED2();
  49. }
  50.  
  51.  
  52. /*void delay(int time){
  53.         for (volatile int j=0;j<time;j++)
  54.         {
  55.                 AT91C_BASE_PITC -> PITC_PIMR |= AT91C_PITC_PITEN | 6249;       //1 ms
  56.                 while(1)
  57.                 {
  58.                         ReadData = AT91C_BASE_PITC->PITC_PISR & (1 << 1);
  59.                         if (ReadData)
  60.                         {
  61.                                 AT91C_BASE_PITC->PITC_PIVR;             //reading PIVR resets PICNT and clears PITS
  62.                                 break;
  63.                         }
  64.                 }
  65.         }
  66. }*/
  67.  
  68. void TIMER_handler (void) {
  69.         //Odczyt rejestru statusowego PITC_PISR
  70.         //jeĹĽeli flaga od timera INT_ENABLE (PITS?) jest ustawiona (rejestr PITC_PIMR) to odczyt
  71.         //rejestru PITC_PIVR - skasowanie flagi przerwania
  72.         //AT91C_BASE_PITC->PITC_PIMR |= AT91C_PITC_PITEN | AT91C_PITC_PITIEN;
  73.         //if(AT91C_BASE_PITC->PITC_PISR & (1 << 1)){
  74.                 //flag= flag - 2*flag;
  75.                 flag = !flag;
  76.                 AT91C_BASE_PITC->PITC_PIVR;             //reading PIVR resets PICNT and clears PITS
  77.         //}
  78.         //jeĹĽeli nie to inne urzÄ…dzenie peryferyjne zgĹ‚osiĹ‚o przerwanie – odpowiednia reakcja
  79.         AT91C_BASE_AIC->AIC_EOICR=1;
  80. }
  81.  
  82.  
  83. void PIT_IRQ(){
  84.         //1. Konfiguracja okresu timera, np. 5 ms
  85.         //AT91C_BASE_PITC -> PITC_PIMR |= 6249; //1ms
  86.         AT91C_BASE_PITC->PITC_PIMR = AT91C_PITC_PIV;
  87.         //2. WyĹ‚Ä…czenie przerwania od Timera PIT na czas konfiguracji (AIC_IDCR, przerwanie nr 1 -
  88.         //urzÄ…dzenia peryferyjne procesora, staĹ‚a AT91C_ID_SYS)
  89.         AT91C_BASE_AIC->AIC_IDCR=(1 << 1);
  90.        
  91.         //3. Ustawienie wskaĹşnika do procedury obsĹ‚ugujÄ…cej przerwanie dla urzÄ…dzeĹ„ peryferyjnych w
  92.         //tablicy wektorĂłw AIC_SVR (AIC_SVR[AT91C_ID_SYS])
  93.         AT91C_BASE_AIC->AIC_SVR[AT91C_ID_SYS] = (unsigned long) TIMER_handler;
  94.        
  95.         //4. Konfiguracja poziomu i metody wyzwalania przerwania (rejestr AIC_SMR, wyzwalanie
  96.         //AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE, dowolny poziom, np.AT91C_AIC_PRIOR_LOWEST)
  97.         AT91C_BASE_AIC->AIC_SMR[AT91C_ID_SYS] = AT91C_AIC_SRCTYPE_INT_EDGE_TRIGGERED | AT91C_AIC_PRIOR_HIGHEST;
  98.        
  99.         //5. Wyczyszczenie flagi przerwania urzÄ…dzeĹ„ peryferyjnych (rejestr AIC_ICCR)
  100.         AT91C_BASE_AIC->AIC_ICCR=(1 << 1);
  101.        
  102.         //6. WĹ‚Ä…cznie przerwania urzÄ…dzeĹ„ peryferyjnych AT91C_ID_SYS (rejestr AIC_IECR)
  103.         AT91C_BASE_AIC->AIC_IECR=(1 << 1);
  104.        
  105.         //7. WĹ‚Ä…czenie przerwania od Timera (AT91C_PITC_PITIEN)
  106.         AT91C_BASE_PITC->PITC_PIMR |= AT91C_PITC_PITIEN;
  107.        
  108.         //8. WĹ‚Ä…czenie Timera PIT (AT91C_PITC_PITEN)
  109.         AT91C_BASE_PITC->PITC_PIMR |= AT91C_PITC_PITEN;
  110.        
  111.         //9. Wyzerowanie tzw. licznika lokalnego Timera (zmienna Local_Counter)
  112.         AT91C_BASE_PITC->PITC_PIVR;
  113.  
  114. }
  115.  
  116. int main() {
  117.  
  118.         InitLEDS();
  119.         TurnOnLEDS();
  120.  
  121.         PIT_IRQ();
  122.  
  123.         while(1){
  124.                 if(flag == 0)
  125.                         TurnOffLEDS();
  126.                 else
  127.                         TurnOnLEDS();
  128.                 //AT91C_BASE_PITC->PITC_PIVR;
  129.         }
  130.        
  131.         return 0;
  132. }
  133.  
  134. void dbgu_print_ascii(){}
  135.