Hi
I'm using the F28027 PICCOLO control kit
I'm made GPIO16 as external interrupt connected to Vcc by 1.2K resistor
GPIOs 17,18,19 & 32 are connected to push buttons and the other terminal on the switches is connected to GPIO16
i programmed the GPIOs and interrupt to make action on the LED connected to GPIO34
but there is a problem the code not work correctly
void DeviceInit(void);
void InitFlash();
void PieCntlInit(void);
void PieVectTableInit(void);
void Timer0_Ctrl(void);
void Timer1_Conf (unsigned int Time);
void Scan_Key(void);
interrupt void gpio16_isr(void);
interrupt void Timer0_isr(void);
interrupt void Timer1_isr(void);
void main(void)
{
DeviceInit(); // Device Life support & GPIO mux settings
Timer0_Ctrl();
EALLOW;
// GPIO-16 - PIN FUNCTION = --Spare--
GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 0; // 0=GPIO, 1=SPISIMO-A, 2=Resv, 3=TZ2
GpioCtrlRegs.GPADIR.bit.GPIO16 = 0; // 1=OUTput, 0=INput
GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL = 16;
// GPIO-17 - PIN FUNCTION = --Spare--
GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 0; // 0=GPIO, 1=SPISOMI-A, 2=Resv, 3=TZ3
GpioCtrlRegs.GPADIR.bit.GPIO17 = 1; // 1=OUTput, 0=INput
GpioDataRegs.GPADAT.bit.GPIO17 = 0;
//--------------------------------------------------------------------------------------
// GPIO-18 - PIN FUNCTION = --Spare--
GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 0; // 0=GPIO, 1=SPICLK-A, 2=SCITX-A, 3=XCLKOUT
GpioCtrlRegs.GPADIR.bit.GPIO18 = 1; // 1=OUTput, 0=INput
GpioDataRegs.GPADAT.bit.GPIO18 = 0;
//--------------------------------------------------------------------------------------
// GPIO-19 - PIN FUNCTION = --Spare--
GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 0; // 0=GPIO, 1=SPISTE-A, 2=SCIRX-A, 3=ECAP1
GpioCtrlRegs.GPADIR.bit.GPIO19 = 1; // 1=OUTput, 0=INput
GpioDataRegs.GPADAT.bit.GPIO19 = 0;
// GPIO-32 - PIN FUNCTION = --Spare--
GpioCtrlRegs.GPBMUX1.bit.GPIO32 = 0; // 0=GPIO, 1=I2C-SDA, 2=SYNCI, 3=ADCSOCA
GpioCtrlRegs.GPBDIR.bit.GPIO32 = 1; // 1=OUTput, 0=INput
GpioDataRegs.GPBDAT.bit.GPIO32 = 0;
PieVectTable.TINT0 = &Timer0_isr;
PieVectTable.XINT1 = &gpio16_isr;
PieVectTable.TINT1 = &Timer1_isr;
PieCtrlRegs.PIEIER1.bit.INTx4 = 1; //External interrupt 1
PieCtrlRegs.PIEIER1.bit.INTx7 = 1; //Timer 0 interrupt
IER |= M_INT1; // Enable CPU Interrupt 1
IER |= M_INT13;
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
EDIS;
XIntruptRegs.XINT1CR.bit.POLARITY = 1; //00 falling Edge H-L
//01 rising edge L-H
//10 falling edge H-L
XIntruptRegs.XINT1CR.bit.ENABLE = 1;
interrupt void gpio16_isr (void)
{
//Stop timer 1
CpuTimer1Regs.TCR.bit.TSS = 1;
CpuTimer0Regs.TCR.bit.TSS = 0;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}
interrupt void Timer0_isr(void)
{
CpuTimer0Regs.TCR.bit.TSS = 1;
CpuTimer0Regs.TCR.bit.TIF = 1;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
Scan_Key();
return;
}
interrupt void Timer1_isr(void)
{
CpuTimer1Regs.TCR.bit.TSS = 0;
CpuTimer1Regs.TCR.bit.TIF = 1;
GpioDataRegs.GPBTOGGLE.bit.GPIO34 = 1;
return;
}
void Timer0_Ctrl(void)
{
CpuTimer0Regs.TPR.bit.TDDR = 0x60;
CpuTimer0Regs.TPRH.bit.TDDRH = 0xea;
CpuTimer0Regs.PRD.all = 30;
CpuTimer0Regs.TCR.bit.TIE = 1; //Enable interrupt
CpuTimer0Regs.TCR.bit.TRB = 1; //load period and perscaler
CpuTimer0Regs.TCR.bit.TSS = 1; //Stop timer
}
void Timer1_Conf (unsigned int Time)
{
CpuTimer1Regs.TPR.bit.TDDR = 0x60;
CpuTimer1Regs.TPRH.bit.TDDRH = 0xea;
CpuTimer1Regs.PRD.all = Time;
CpuTimer1Regs.TCR.bit.TIE = 1;
CpuTimer1Regs.TCR.bit.TRB = 1;
CpuTimer1Regs.TCR.bit.TSS = 0;
}
void Scan_Key()
{
//scan GPIO17
GpioDataRegs.GPADAT.bit.GPIO17 = 1;
if (GpioDataRegs.GPADAT.bit.GPIO16 == 1)
{
GpioDataRegs.GPADAT.bit.GPIO17 = 0;
GpioDataRegs.GPBSET.bit.GPIO34 = 1;
}
else
{
GpioDataRegs.GPADAT.bit.GPIO17 = 0;
//Scan GPIO18
GpioDataRegs.GPADAT.bit.GPIO18 = 1;
}
if (GpioDataRegs.GPADAT.bit.GPIO16 == 1)
{
GpioDataRegs.GPADAT.bit.GPIO18 = 0;
GpioDataRegs.GPBCLEAR.bit.GPIO34 = 1;
}
else
{
GpioDataRegs.GPADAT.bit.GPIO18 = 0;
//Scan GPIO32
GpioDataRegs.GPADAT.bit.GPIO19 = 1;
}
if (GpioDataRegs.GPADAT.bit.GPIO16 == 1)
{
GpioDataRegs.GPADAT.bit.GPIO19 = 0;
Timer1_Conf(100);
}
else
{
GpioDataRegs.GPADAT.bit.GPIO19 = 0;
//Scan GPIO32
GpioDataRegs.GPBDAT.bit.GPIO32 = 1;
}
if (GpioDataRegs.GPADAT.bit.GPIO16 == 1)
{
GpioDataRegs.GPBDAT.bit.GPIO32 = 0;
Timer1_Conf(600);
}
else
GpioDataRegs.GPBDAT.bit.GPIO32 = 0;
}
The code scan only one key the 1st one in the Scan_Key() only key code is executed
what the problem is?