Hello,
Can anyone please tell me why I can not get interrupt for QEI1, will I can get interrupt on QEI0.
Setup.c:
__root const uVectorEntry __vector_table[] @ ".intvec" =
{
{ .ulPtr = (unsigned long)pulStack + sizeof(pulStack) },
// The initial stack pointer
ResetISR, // The reset handler
NmiSR, // The NMI handler
FaultISR, // The hard fault handler
..........
QEI1IntHandler, // GPIO Port C
QEI0IntHandler, // GPIO Port D
..........
};
Encoder.h:
/*****************************************************/
/* For LM4F230H5QR */
/*****************************************************/
#define QEI_PITCH_INDEX_PORT GPIO_PORTD_BASE
#define QEI_PITCH_INDEX_PIN GPIO_PIN_3
#define QEI_PITCH_INDEX_INT INT_GPIOD
#define QEI_PITCH_PHA_PORT GPIO_PORTD_BASE
#define QEI_PITCH_PHA_PIN GPIO_PIN_6
#define QEI_PITCH_PHA_INT INT_GPIOD
#define QEI_PITCH_PHB_PORT GPIO_PORTD_BASE
#define QEI_PITCH_PHB_PIN GPIO_PIN_7
//*****************************************************
#define QEI_ROLL_INDEX_PORT GPIO_PORTC_BASE
#define QEI_ROLL_INDEX_PIN GPIO_PIN_4
#define QEI_ROLL_INDEX_INT INT_GPIOC
#define QEI_ROLL_PHA_PORT GPIO_PORTC_BASE
#define QEI_ROLL_PHA_PIN GPIO_PIN_5
#define QEI_ROLL_PHA_INT INT_GPIOC
#define QEI_ROLL_PHB_PORT GPIO_PORTC_BASE
#define QEI_ROLL_PHB_PIN GPIO_PIN_6
//*****************************************************
Encoder.c:
//*****************************************************************************
//
// This function prepares the quadrature encoder module for capturing the
// position and speed of the motor.
//
//*****************************************************************************
void
Encoder_Init(unsigned long ulBase)
{
if(ulBase == QEI0_BASE)
{
//
// Enable the peripherals QEI example.
//
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
SysCtlPeripheralEnable(SYSCTL_PERIPH_QEI0);
// unlock GPIO PD7
GPIO_PORTD_LOCK_R = GPIO_LOCK_KEY;
GPIO_PORTD_CR_R = GPIO_PIN_7;
//Enable GPIO for QEI0
//PD3-> IDX0
//PD6-> PHA0
//PD7-> PHB0
GPIOPinConfigure(GPIO_PD3_IDX0);
GPIOPinConfigure(GPIO_PD6_PHA0);
GPIOPinConfigure(GPIO_PD7_PHB0);
GPIOPinTypeQEI(QEI_PITCH_PHA_PORT,QEI_PITCH_PHA_PIN);
GPIOPinTypeQEI(QEI_PITCH_PHB_PORT,QEI_PITCH_PHB_PIN);
GPIOPinTypeQEI(QEI_PITCH_INDEX_PORT,QEI_PITCH_INDEX_PIN);
// Set D 0 and 1 to alternative use
GPIODirModeSet(GPIO_PORTD_BASE, GPIO_PIN_3, GPIO_DIR_MODE_HW);//GPIO_DIR_MODE_HW
GPIODirModeSet(GPIO_PORTD_BASE, GPIO_PIN_6, GPIO_DIR_MODE_HW);
GPIODirModeSet(GPIO_PORTD_BASE, GPIO_PIN_7, GPIO_DIR_MODE_HW);
//
// Configure the QEI module.
//
QEIConfigure(QEI0_BASE,
(QEI_CONFIG_NO_RESET | QEI_CONFIG_CAPTURE_A_B |
QEI_CONFIG_QUADRATURE | QEI_CONFIG_NO_SWAP), QEI1_POSCNT_MAX-1);
//Set to 0
QEIPositionSet(QEI0_BASE, 100);
QEIVelocityConfigure(QEI0_BASE, QEI_VELDIV_1, 500000); //Configure the Velocity capture Module //500000 is 10ms at 50MHz
QEIVelocityEnable(QEI0_BASE); //Enable the Velocity capture Module
QEIIntEnable(QEI0_BASE, QEI_INTDIR | QEI_INTINDEX); //Enable Interrupt when the Timer is reach 0 on Valocity capture mode
QEIEnable(QEI0_BASE);
//
// Configure the encoder input to generate an interrupt on every rising
// edge.
//
GPIOIntTypeSet(QEI_PITCH_PHA_PORT, QEI_PITCH_PHA_PIN, GPIO_RISING_EDGE);
GPIOPinIntEnable(QEI_PITCH_PHA_PORT, QEI_PITCH_PHA_PIN);
IntEnable(QEI_PITCH_PHA_INT);
//Interrupt Enable
//IntEnable(INT_QEI1);
}
else
if(ulBase == QEI1_BASE) // J8 ROLL Encoder
{
//
// Enable the peripherals QEI example.
//
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
SysCtlPeripheralEnable(SYSCTL_PERIPH_QEI1);
//Enable GPIO for QEI1
//PC4-> IDX0
//PC5-> PHA0
//PC6-> PHB0
GPIOPinConfigure(GPIO_PC4_IDX1);
GPIOPinConfigure(GPIO_PC5_PHA1);
GPIOPinConfigure(GPIO_PC6_PHB1);
GPIOPinTypeQEI(QEI_ROLL_PHA_PORT,QEI_ROLL_PHA_PIN);
GPIOPinTypeQEI(QEI_ROLL_PHB_PORT,QEI_ROLL_PHB_PIN);
GPIOPinTypeQEI(QEI_ROLL_INDEX_PORT,QEI_ROLL_INDEX_PIN);
// Set F 0 and 1 to alternative use
GPIODirModeSet(GPIO_PORTC_BASE, GPIO_PIN_4, GPIO_DIR_MODE_HW);//GPIO_DIR_MODE_HW
GPIODirModeSet(GPIO_PORTC_BASE, GPIO_PIN_5, GPIO_DIR_MODE_HW);
GPIODirModeSet(GPIO_PORTC_BASE, GPIO_PIN_6, GPIO_DIR_MODE_HW);
//
// Configure the QEI module.
//
QEIConfigure(QEI1_BASE,
(QEI_CONFIG_NO_RESET | QEI_CONFIG_CAPTURE_A_B |
QEI_CONFIG_QUADRATURE | QEI_CONFIG_NO_SWAP), QEI1_POSCNT_MAX-1);
//Set to 0
QEIPositionSet(QEI1_BASE, 0);
QEIVelocityConfigure(QEI1_BASE, QEI_VELDIV_1, 500000); //Configure the Velocity capture Module //500000 is 10ms at 50MHz
QEIVelocityEnable(QEI1_BASE); //Enable the Velocity capture Module
QEIIntEnable(QEI1_BASE, QEI_INTDIR | QEI_INTINDEX); //Enable Interrupt when the Timer is reach 0 on Valocity capture mode
QEIEnable(QEI1_BASE);
//
// Configure the encoder input to generate an interrupt on every rising
// edge.
//
GPIOIntTypeSet(QEI_ROLL_PHA_PORT, QEI_ROLL_PHA_PIN, GPIO_RISING_EDGE);
GPIOPinIntEnable(QEI_ROLL_PHA_PORT, QEI_ROLL_PHA_PIN);
IntEnable(QEI_ROLL_PHA_INT);
//Interrupt Enable
//IntEnable(INT_QEI1);
}
}