#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<time;j++)
{
AT91C_BASE_PITC -> 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(){}