Hola Lejan,
he hecho alguna cosilla con arm7, en concreto con el LPC2148, aunque con KEIL sobre windows, y no con GNU ARM.
Te paso un pedazo de codigo para utilizar la interrupcion del timer. Todo esta hecho en C (nada de tocar ensamblador). De todos modos mañana echo un vistazo a codigo que tengo para el ARM9, que si lo he hecho con el GNUARM y te comento:
#include <LPC214x.H> /* LPC21xx definitions */
#include "timer.h"
void Ini_timer0(unsigned short ms)
{
T0PR = 14999; // Preescaler: cada 1mseg (15000 PCLK ticks), incrementa T0TC
T0TCR = 0x00000002; // Reset counter
T0MCR = 0x00000003; // genera interrupcion cuando MR0 = TC, y resetea TC
T0MR0 = ms; // Cuando T0TC llega a 1000, se produce una interrupcion (match0 channel)
T0TCR = 0x00000001; // Enable counter
VICVectAddr4 = (unsigned) T0_interrupt;
VICVectCntl4 = 0x00000024; // Habilitamos este vector de interrupcion y asociamos a timer0
VICIntEnable |= 0x00000010; // Habilitamos interrupcion timer0
}
void T0_interrupt(void) __irq
{
// YOUR CODE
FIO0PIN = FIO0PIN ^ 0x00000800;
// END YOUR CODE
T0IR |= 0x00000001; // Borramos match0 flag
VICVectAddr = 0x00000000; // Dummy write to addres
}
Espero que te sirva de referencia. Osea, puedes hacerlo todo en C.
Nota: Ahora ya no recuerdo el porque, pero no olvides la línea "VICVectAddr = 0x00000000;" al final de la interrupcion o se va todo a tomar por c.... Tiene su razon
, pero no la recuerdo.
EDIT: te adjunto tambien la parte de I2C que tenia de codigo. Veras que hay cosas comentadas, ya que era para usar o no interrupcion. Es codigo de hace tiempo, y no lo tengo fresco (para explicarlo). Echale un vistazo, a ver si le sacas partido. Descomenta lo relacionado con la interrupcion y lo pruebas. No me acaba de gustar usar I2C por interrupcion, veras que tiene muchos estados la rutina de interrupcion (que si el bit de start, que si bit de restart, que si ack correcto a address o a data, etc.....). Es una excepcion, pero el I2C es el unico recurso que prefiero hacerlo por polling.
Un saludo. Dani.