/*----------------------------------------------------------------------------
- Ejemplo 2. Código fuente
----------------------------------------------------------------------------/
#include "LPC17xx.H"
#define Enable_RIT LPC_RIT->RICTRL |= ((0x1<<0)|(0x1<<1))
#define Disable_RIT LPC_RIT->RICTRL &= ~((0x1<<0)|(0x1<<1))
#define Reset_RIT LPC_RIT->RICTRL |= (0x1<<1)
//volatile uint32_t ritCounter = 0;
volatile uint32_t ritCounter = 0;
int estados, vartiempo; //Variables auxiliares para conocer el estado actual y el tiempo transcurrido en el//
/----------------------------------------------------------------------------
Function name: RIT_IRQHandler
----------------------------------------------------------------------------/
void RIT_IRQHandler (void)
{
LPC_RIT->RICTRL |= (0x1<<0); // Borra fuente de interrupción
ritCounter++;
}
/----------------------------------------------------------------------------
Function name: Init_RIT
----------------------------------------------------------------------------/
void Init_RIT ( uint32_t timerInterval )
{
LPC_SC->PCONP |= (1 << 16); // Power Control: Alimentar RIT
Disable_RIT;
ritCounter = 0;
LPC_RIT->RICOMPVAL = timerInterval;
NVIC->ISER[0] = 1 << RIT_IRQn; // RIT_IRQn = 29 (LPC17xx.h)
return;
}
/----------------------------------------------------------------------------
Function name: CONFIG
----------------------------------------------------------------------------/
void Config(void)
{
/* ENTRADAS Y SALIDAS */
LPC_GPIO1->FIODIR = 0x3F << 20; // P1.20..25 Outputs
LPC_GPIO1->FIOCLR = 0x3F << 20; // Turn off all the LEDs
/* INICIALIZAMOS RIT */
Init_RIT( 25000000 ); // 1s (RITCLK = CCLK/4 = 25 MHz)
Enable_RIT ;
/* INTERRUPCION EINT3 */
// Configuramos prioridad 1 a la interrupcion EINT3 (IRQ21) --> IPR5
// La definición de IP es uint8_t. Los bits válidos son los 5 de mayor peso
NVIC->IP[20] = 0x01 << 3;
// Configuracion del P2.13 como EINT3 --> PINSEL4.26 y PINSEL4.27
LPC_PINCON->PINSEL4 |= 1 << (13*2);
// Interrupción activa por flanco de bajada --> EXTMODE.3
LPC_SC->EXTMODE |= 1<< 3;
// Configuramos prioridad 1 a la interrupcion EINT3 (IRQ21) --> IPR5
// La definición de IP es uint8_t. Los bits válidos son los 5 de mayor peso
NVIC->IP[21] = 0x01 << 3;
// Habilitar la interrupcion EINT3 --> ISER0.21
NVIC->ISER[0] = 1 << 21; // enable interrupt
};
/----------------------------------------------------------------------------
FUNCIONES ESTADO
----------------------------------------------------------------------------/
void Estado1(void)
{
estados=1;
ritCounter=0;
LPC_GPIO1->FIOCLR = 0x3F << 20;
LPC_GPIO1->FIOSET = 0x21 << 20;
if(ritCounter == 20)
Estado2();
}
void Estado2(void)
{
estados=2;
ritCounter=0;
LPC_GPIO1->FIOCLR = 0x3F << 20;
LPC_GPIO1->FIOSET = 0x11 << 20;
if(ritCounter == 4)
Estado3();
}
void Estado3(void)
{
estados=3;
ritCounter=0;
LPC_GPIO1->FIOCLR = 0x3F << 20;
LPC_GPIO1->FIOSET = 0x0C << 20;
if(ritCounter == 20)
Estado4();
}
void Estado4(void)
{
estados=4;
ritCounter=0;
LPC_GPIO1->FIOCLR = 0x3F << 20;
LPC_GPIO1->FIOSET = 0x0A << 20;
if(ritCounter == 4)
Estado1();
}
/----------------------------------------------------------------------------
Function name: EINT3
----------------------------------------------------------------------------/
void EINT3_IRQHandler(void)
{
ritCounter = vartiempo;
ritCounter = 0;
LPC_GPIO1->FIOCLR = 0x3F << 20;
LPC_GPIO1->FIOSET = 0x09 << 20;
if(ritCounter == 20)
{
if(estados == 2)
Estado1();
if(estados == 4)
Estado3();
if(estados == 1)
{
if(vartiempo <= 10)
Estado1();
else
Estado2();
}
if(estados == 3)
{
if(vartiempo <= 10)
Estado3();
else
Estado4();
}
}
// Borrar el falg de la EINT3 --> EXTINT.3
LPC_SC->EXTINT = 1 << 3;
}
/----------------------------------------------------------------------------
Main Program
----------------------------------------------------------------------------/
int main (void)
{
Config();
while(1);
}