Final assignment for the course "Real Time and Embedded Systems" of THMMY in AUTH university.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

68 lines
1.8 KiB

//=========================================================
// Simulation setup file for esc07_demo project
//=========================================================
__var _timer0_interrupt_ID;
irqBreak()
{
__var __AIC_SMR;
__var __AIC_IECR;
__var __AIC_IVR;
// read AIC_IECR instead, since not fully supported by simulator
__AIC_IECR = __readMemory32(0xFFFFF120, "Memory");
if(__AIC_IECR & 0x1000)
{
__AIC_SMR = __readMemory32(0xFFFFF060, "Memory");
__AIC_IVR = __readMemory32(0xFFFFF0B0, "Memory"); //AIC_IVR = AIC_SVR[x]
__writeMemory32(__AIC_IVR, 0xFFFFF100, "Memory"); //AIC_IVR
__writeMemory32(0x1000, 0xFFFFF10C, "Memory"); //AIC_IPR
__writeMemory32(0x2, 0xFFFFF114, "Memory"); //AIC_CISR
}
return 0;
}
setupProcessorRegisters()
{
// Write TC0_SR.CPCS with correct status for ISR (Clock enabled; RC Compare Flag = TRUE)
__writeMemory32(0x00010010, 0xfffa0020, "Memory");
// Set TX ready flag in USART0 status register
// USART0_BASE->US_CSR = AT91C_US_TXRDY
__writeMemory32(0x00000002, 0xfffc0014, "Memory");
}
configureTimer0Interrupt()
{
__var _master_clock_frequency;
__var _timer0_period_cycles;
// Calculate timer0 frequency in master clock cycles
_master_clock_frequency = 48054857;
_timer0_period_cycles = _master_clock_frequency / 100;
if((_master_clock_frequency % 100) >= 50)
{
_timer0_period_cycles++;
}
__cancelAllInterrupts();
__enableInterrupts();
_timer0_interrupt_ID = __orderInterrupt("IRQ", _timer0_period_cycles, _timer0_period_cycles, 0, 0, 0, 100);
if(-1 == _timer0_interrupt_ID)
{
__message "ERROR: failed to order timer 0 interrupt";
}
__setCodeBreak("0x18", 0, "irqBreak()", "TRUE", "");
}
execUserReset()
{
setupProcessorRegisters();
configureTimer0Interrupt();
}