#include "AT91SAM9263-EK.h" #include "AT91SAM9263.h" //void TIMER_handler()__attribute__ ((interrupt("IRQ"))); volatile int flag = 0; void initLED1(){ AT91C_BASE_PIOB->PIO_OER = AT91C_PIO_PB8; AT91C_BASE_PIOB->PIO_PER = AT91C_PIO_PB8; AT91C_BASE_PIOB->PIO_CODR = AT91C_PIO_PB8; } void initLED2(){ AT91C_BASE_PIOC->PIO_OER = AT91C_PIO_PC29; AT91C_BASE_PIOC->PIO_PER = AT91C_PIO_PC29; AT91C_BASE_PIOC->PIO_CODR = AT91C_PIO_PC29; } void TurnOnLED1(){ AT91C_BASE_PIOB->PIO_CODR = AT91C_PIO_PB8; } void TurnOffLED1(){ AT91C_BASE_PIOB->PIO_SODR= AT91C_PIO_PB8; } void TurnOnLED2(){ AT91C_BASE_PIOC->PIO_CODR = AT91C_PIO_PC29; } void TurnOffLED2(){ AT91C_BASE_PIOC->PIO_SODR= AT91C_PIO_PC29; } void TurnOnLEDS(){ TurnOnLED1(); TurnOnLED2(); } void TurnOffLEDS(){ TurnOffLED1(); TurnOffLED2(); } void InitLEDS(){ initLED1(); initLED2(); } /*void delay(int time){ for (volatile int j=0;j PITC_PIMR |= AT91C_PITC_PITEN | 6249; //1 ms while(1) { ReadData = AT91C_BASE_PITC->PITC_PISR & (1 << 1); if (ReadData) { AT91C_BASE_PITC->PITC_PIVR; //reading PIVR resets PICNT and clears PITS break; } } } }*/ void TIMER_handler (void) { //Odczyt rejestru statusowego PITC_PISR //jeżeli flaga od timera INT_ENABLE (PITS?) jest ustawiona (rejestr PITC_PIMR) to odczyt //rejestru PITC_PIVR - skasowanie flagi przerwania //AT91C_BASE_PITC->PITC_PIMR |= AT91C_PITC_PITEN | AT91C_PITC_PITIEN; //if(AT91C_BASE_PITC->PITC_PISR & (1 << 1)){ //flag= flag - 2*flag; flag = !flag; AT91C_BASE_PITC->PITC_PIVR; //reading PIVR resets PICNT and clears PITS //} //jeżeli nie to inne urządzenie peryferyjne zgłosiło przerwanie – odpowiednia reakcja AT91C_BASE_AIC->AIC_EOICR=1; } void PIT_IRQ(){ //1. Konfiguracja okresu timera, np. 5 ms //AT91C_BASE_PITC -> PITC_PIMR |= 6249; //1ms AT91C_BASE_PITC->PITC_PIMR = AT91C_PITC_PIV; //2. Wyłączenie przerwania od Timera PIT na czas konfiguracji (AIC_IDCR, przerwanie nr 1 - //urządzenia peryferyjne procesora, stała AT91C_ID_SYS) AT91C_BASE_AIC->AIC_IDCR=(1 << 1); //3. Ustawienie wskaźnika do procedury obsługującej przerwanie dla urządzeń peryferyjnych w //tablicy wektorów AIC_SVR (AIC_SVR[AT91C_ID_SYS]) AT91C_BASE_AIC->AIC_SVR[AT91C_ID_SYS] = (unsigned long) TIMER_handler; //4. Konfiguracja poziomu i metody wyzwalania przerwania (rejestr AIC_SMR, wyzwalanie //AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE, dowolny poziom, np.AT91C_AIC_PRIOR_LOWEST) AT91C_BASE_AIC->AIC_SMR[AT91C_ID_SYS] = AT91C_AIC_SRCTYPE_INT_EDGE_TRIGGERED | AT91C_AIC_PRIOR_HIGHEST; //5. Wyczyszczenie flagi przerwania urządzeń peryferyjnych (rejestr AIC_ICCR) AT91C_BASE_AIC->AIC_ICCR=(1 << 1); //6. Włącznie przerwania urządzeń peryferyjnych AT91C_ID_SYS (rejestr AIC_IECR) AT91C_BASE_AIC->AIC_IECR=(1 << 1); //7. Włączenie przerwania od Timera (AT91C_PITC_PITIEN) AT91C_BASE_PITC->PITC_PIMR |= AT91C_PITC_PITIEN; //8. Włączenie Timera PIT (AT91C_PITC_PITEN) AT91C_BASE_PITC->PITC_PIMR |= AT91C_PITC_PITEN; //9. Wyzerowanie tzw. licznika lokalnego Timera (zmienna Local_Counter) AT91C_BASE_PITC->PITC_PIVR; } int main() { InitLEDS(); TurnOnLEDS(); PIT_IRQ(); while(1){ if(flag == 0) TurnOffLEDS(); else TurnOnLEDS(); //AT91C_BASE_PITC->PITC_PIVR; } return 0; } void dbgu_print_ascii(){}