Configuració del mòdul I2C i TSI amb clock gating i interrupcions

Economia4,19 KB

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]

Descarregar

PDF Word HTML