Interrupciones FIQ

El set-up depende de si el código se ejecutará desde flash o desde RAM. Mis pruebas las estoy haciendo en modo RAM DEBUG, por lo que es necesario:

#define RAM_RUN 1
//#define ROM_RUN 1

Las IRQ funcionan con  ROM_RUN definido aún depurando en RAM; sin embargo las FIQ no, por lo que se debe especificar que los vectores de interrupción se muevan a RAM, como se mostró en el fragmento anterior.

El código completo queda:

...
void irq_handler(void) __attribute__((interrupt("IRQ")));
void fiq_handler(void) __attribute__((interrupt("FIQ")));
 ...
void irq_handler(void){

 void (*interrupt_function) ();
 unsigned int vector;

 vector = VICVectAddr;			// Get interrupt vector.
 interrupt_function = (void(*) ()) vector;
 (*interrupt_function) ();
 VICVectAddr = 0;				// Clear interrupt in VIC.
}

void fiq_handler(void)
{
 cron_isr();
//	VICVectAddr=0;
}
void cron_isr_init(void){
 /*
 * Detiene y resetea al contador
 */
 T0TCR=2;

 /*
 * Clear pending interrupts
 */
 (void)T0IR;
 T0IR=0xff;


 /*
 * Cuando termina la cuenta, genera una interrupción, resetea 
 * a MR0, y continúa el ciclo
 */
 T0MCR|=3;

 /* 
 * 14745000/1000=60000, por lo tanto no se requiere al prescaler
 */
 T0PR=0;

 /*
 * 1 tick cada 1ms
 */
 T0MR0=58982;

 /* 
 * En cada interrupción el pin cambia de estado (toggle). Se utilizará
 * para la calibración
 */
 T0EMR|=(3<<4);

 /* 
 * Conecta el tick con el pin P0.22
 */
 PINSEL1|=(3<<12);

 /*
 * FIQ
 */
 VICIntEnable|=(1<<4);					/* enable MR0 */
 VICIntSelect|=(1<<4);
}
 int main()
{
 ...
 system_init();
...
 cron_isr_init();
...
 __ARMLIB_enableIRQ();
 __ARMLIB_enableFIQ();
...
for(;;){...}
 }
Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s