Configuració del mòdul I2C i TSI amb clock gating i interrupcions
Configuració del mòdul I2C
Petició: Activació del clock gating del mòdul I2C
SIM_BASE_PTR->SCGC5 |= SIM_SCGC5_I2C0_MASK;
Petició: Activar el mòdul I2C
I2C0_BASE_PTR->CONTROL |= 0x80;
Petició: Declarar el mòdul I2C en mode Master
I2C0_BASE_PTR->CONTROL |= 0x20;
Petició: Declarar el mòdul I2C en mode de transmissió (envia)
I2C0_BASE_PTR->CONTROL |= (1<<4);
Petició: Declarar el mòdul I2C slave R/W, com a esclau que rep
I2C0_BASE_PTR->STATUS |= 0x04;
Petició: Enviar la primera dada al bus I2C
I2C0_BASE_PTR->DATA = buffer[0];
Petició: Esperar que el mòdul pugui rebre una altra dada (espera activa / polling)
while ((I2C0_BASE_PTR->STATUS & 0x80) == 0);
Petició: Enviament de la següent dada
I2C0_BASE_PTR->DATA = buffer[i];
Petició: Transferència finalitzada, desactivo el mòdul I2C
I2C0_BASE_PTR->CONTROL &= 0x7F;
Petició: Activació local de les interrupcions de I2C
I2C0_BASE_PTR->CONTROL |= (1<<6);
Petició: Activació global de les interrupcions de I2C0 (posició 24 del NVIC)
NVIC_BASE_PTR->ISER |= (1 << (24 - 16));
Petició: Desactivació de les interrupcions locals de I2C
I2C0_BASE_PTR->CONTROL &= 0x7F;
Petició: Desactivació del mode Master del I2C
I2C0_BASE_PTR->CONTROL &= 0xDF;
Petició: Desactivació del mode Envia del I2C
I2C0_BASE_PTR->CONTROL &= 0xEF;
Petició: Preparar el mòdul per a la següent interrupció esborrant el flag d'interrupció del mòdul I2C
I2C0_BASE_PTR->STATUS |= 0x02;
Configuració del Touch Sensing Input (TSI)
Petició: Activació del clock gating per al Port B
SIM_BASE_PTR->SCGC5 |= SIM_SCGC5_PORTB_MASK;
Petició: Activar el mòdul Touch Sensing Input (TSI)
TSI0_BASE_PTR->GENCS |= (1<<7);
Petició: Activació de les interrupcions locals del TSI0
TSI0_BASE_PTR->GENCS |= (1<<6);
Petició: Activació de les interrupcions globals del TSI (posició 42 del NVIC)
NVIC_BASE_PTR->ISER |= (1 << (42 - 16));
Petició: Inici d'escaneig del touch pel canal 9 (suposant DATA a zeros)
TSI0_BASE_PTR->DATA = (9 << 28) | (1 << 22);
Petició: Esperar canvi d'estat del touch (fi d'escaneig)
while ((TSI0_BASE_PTR->GENCS & (1<<2)) == 0);
Petició: Esborrar el bit EOSF de GENCS (w1c)
TSI0_BASE_PTR->GENCS |= (1<<2);
Petició: Guardar el TempsBase (bits TSICNT[0:15] de DATA)
TempsBase = TSI0_BASE_PTR->DATA & 0xFFFF;
Petició: Captura del temps actual (bits TSICNT del registre DATA)
TempsActual = TSI0_BASE_PTR->DATA & 0xFFFF;
Petició: Calcular si hi ha contacte al touch
ContacteAlTouch = TempsActual - TempsBase;
Petició: Esborrar la selecció de canal
TSI0_BASE_PTR->DATA &= 0x0FFFFFFF;
Petició: Seleccionar el canal 9
TSI0_BASE_PTR->DATA |= (9 << 28);
Petició: Iniciar un nou escaneig per al canal seleccionat
TSI0_BASE_PTR->DATA |= (1 << 22);
Petició: Definició de la capçalera de la RSI (Rutina de Servei d'Interrupció) del TSI0
void TSI0_IRQHandler() attribute ((interrupt("IRQ")));
Suma d'elements d'un array en ARM
Petició: Crear apuntador a A
ADR r1, A
Petició: Inicialitzar r2 a 0
MOV r2, #0
Petició: Inicialitzar r4 a 0
MOV r4, #0
Petició: Comprovar que hem arribat al final de l'array
CMP r2, #7
Petició: En cas que s'hagi arribat al final de l'array, salta a final
BGE final
Petició: Agafar un element més d'A (element següent d'A)
LDR r3, [r1]
Petició: Suma acumulada
ADD r4, r3
Petició: Incrementar el punter a A
ADD r1, #4
Petició: Tornem a bucle
B bucle
Petició: Crear apuntador a B
ADR r1, B
Petició: Guardar a B la suma acumulada
STR r4, [r1]