This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

Unresolved symbol error in interrupt vector table

Other Parts Discussed in Thread: TM4C123GH6PM

I'm trying to set up basic timer interrupts in my project but am receiving an unresolved symbol error during linking. The exact error is seen below:

 undefined         first referenced              

  symbol               in file                   

 ---------         ----------------              

 Timer0BIntHandler ./tm4c123gh6pm_startup_ccs.obj

error #10234-D: unresolved symbols remain

error #10010: errors encountered during linking; "Senior Design.out" not built

My source code is in an attached zip file, in addition to the two files with the error being listed below. I've tried browsing most of the issues on the forum, but it seems as if they all deal with users simply forgetting to add a search path. The function I am trying to use is defined in a source file (main.c) and declared using extern in another source file (tm4c123gh6pm_startup_ccs.c). It is being used as an ISR for a timer.

I feel as if my C syntax is correct, but the issue may be a project configuration or an issue with mixing C/C++.

Thanks for your time.

Main.c:

//Senior Design Project - Austin Riffle
/***************************************************************************************/
/*****                                 INCLUDES                                    *****/
/***************************************************************************************/
#include <stdint.h>
#include <stdbool.h>
#include "inc/tm4c123gh6pm.h"
#include "inc/hw_memmap.h"
#include "driverlib/pin_map.h"
#include "driverlib/gpio.h"
#include "driverlib/sysctl.h"
#include "driverlib/adc.h"
#include "driverlib/timer.h"
#include "driverlib/interrupt.h"
#include "LharpMidiDefs.h"
#include "MidiInterface.h"
#include "UartInterface.h"
#include "globalDefs.h"

using midi::MidiInterface;
/***************************************************************************************/
/*****                                 DEFINITIONS                                 *****/
/***************************************************************************************/
//ADC Definitions
#define ADC_SEQ_NUMBER							3//FIFO Depth of 1
#define ADC_PRIORITY_LEVEL						0
#define ADC_OVERSAMPLE_RATE						64//Must be exponent of two, no more then 64

#define ADC_RANGE_SENS_PERIPH					SYSCTL_PERIPH_ADC1
#define ADC_LDR_SENS_PERIPH						SYSCTL_PERIPH_ADC0
#define ADC_RANGE_SENS_BASE						ADC1_BASE
#define ADC_LDR_SENS_BASE						ADC0_BASE
#define ADC_RANGE_SENS_CTL_CH					ADC_CTL_CH6
#define ADC_LDR_SENS_CTL_CH						ADC_CTL_CH7

//Mux Definitions:
#define MUX_GPIO_REG_LDR						GPIO_PORTA_BASE
#define MUX_GPIO_REG_RANGE						GPIO_PORTC_BASE
#define MUX_GPIO_LDR_A							GPIO_PIN_2
#define MUX_GPIO_LDR_B							GPIO_PIN_3
#define MUX_GPIO_LDR_C							GPIO_PIN_4
#define MUX_GPIO_RANGE_A						GPIO_PIN_6
#define MUX_GPIO_RANGE_B						GPIO_PIN_5
#define MUX_GPIO_RANGE_C						GPIO_PIN_4
#define MUX_LINE_ON								0xFF
#define MUX_LINE_OFF							0x00

/***************************************************************************************/
/*****                                 ENUMS                                       *****/
/***************************************************************************************/

enum SensorType
{
	RangeSensors,
	LightDependentResistors
};

/***************************************************************************************/
/*****                            FORWARD DECLARATIONS                             *****/
/***************************************************************************************/

static void initADC(void);
static void initMUX_GPIO(void);
static void initTimer(void);
static ADCData readADC(SensorType sensorType);
static uint16_t getMidiPitchBend(void);
static void setMUXPosition(uint8_t inputPosition, SensorType sensorType);
static void setMUXLines(SensorType sensorType, uint8_t msb, uint8_t nmsb, uint8_t lsb);
static void calibrateLDRs(uint16_t thresholdValue[], bool noteSent[]);

/***************************************************************************************/
/*****                          GLOBAL/MODULE VARIABLES                            *****/
/***************************************************************************************/

static volatile bool g_CalibrationMode;

/***************************************************************************************/
/*****                                 ISRS                                        *****/
/***************************************************************************************/

void Timer0BIntHandler(void)
{
	//Timer has expired, we need to calibrate
	g_CalibrationMode = true;

    // Clear the timer interrupt flag.
    TimerIntClear(TIMER0_BASE, TIMER_TIMB_TIMEOUT);
}

/***************************************************************************************/
/*****                                 SOURCE                                      *****/
/***************************************************************************************/

int main(void)
{
	//set the clock source
	SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ);

	//initialize globals
	g_CalibrationMode = false;

    //initialize peripherals
	initADC();
	initMUX_GPIO();
	initTimer();

	//initialize state table
	bool noteSent[MIDI_CHANNEL_NUMBERS] = {false};
	//each channel will have its own threshold
	uint16_t thresholdValue[MIDI_CHANNEL_NUMBERS];
	uint16_t pitchBend;
	uint16_t channelNumber = 0;

	//calibrate the LDR's
	calibrateLDRs(thresholdValue, noteSent);

	//initialize MIDI
	MidiInterface midi;
	midi.turnThruOff();
	midi.begin(MIDI_CHANNEL_OFF);

	while (1)
	{
		if (g_CalibrationMode == false)
		{
			//Set the MUX position for the LDR's
			setMUXPosition(channelNumber, LightDependentResistors);

			//Read Data from LDR's, generate MIDI data if appropriate
			if (readADC(LightDependentResistors) > thresholdValue[channelNumber])
			{
				//Only want to send the note when initially played, not constantly
				if (noteSent[channelNumber] == false)
				{
					midi.sendNoteOn(CMajorMidiScale[channelNumber],
							MIDI_DEFAULT_ON_VELOCITY,
							channelNumber);
					noteSent[channelNumber] = true;
				}
				//determine pitch bend
				setMUXPosition(channelNumber, RangeSensors);
				pitchBend = getMidiPitchBend();
				midi.sendPitchBend(pitchBend, channelNumber);
			}
			else
			{
				//Only want to send note if we are tunring off
				if (noteSent[channelNumber] == true)
				{
					midi.sendNoteOff(CMajorMidiScale[channelNumber],
									 MIDI_DEFAULT_OFF_VELOCITY,
									 channelNumber);
					noteSent[channelNumber] = false;
				}
			}
			//increment channel
			channelNumber = ++(channelNumber) % MIDI_CHANNEL_NUMBERS;
		}
		//Calibration mode has been set
		else
		{
			calibrateLDRs(thresholdValue, noteSent);
			g_CalibrationMode = false;
		}
	}
}

/***************************************************************************************/
//Initializes pins PD0 (AIN7) to ADC0 and PD1 (AIN6) to ADC1. These pins are available on both boards
//PD0/AIN7 corresponds to the Cadmium Sulfide Resistors
//PD1/AIN6 corresponds to the Range Sensors
void initADC(void)
{
	//Enable the ADC Peripheral and related ports
	SysCtlPeripheralEnable(ADC_RANGE_SENS_PERIPH);
	SysCtlDelay(3);
	SysCtlPeripheralEnable(ADC_LDR_SENS_PERIPH);
	SysCtlDelay(3);
	SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
	SysCtlDelay(3);

	//Set ADC PINS
	//PE1, for use with ADC0
	GPIOPinTypeADC(GPIO_PORTD_BASE, GPIO_PIN_0);
	SysCtlDelay(3);
	//PE2, for use with ADC1
	GPIOPinTypeADC(GPIO_PORTD_BASE, GPIO_PIN_1);
	SysCtlDelay(3);

	//Set ADC to average samples in hardware before returning the value
	ADCHardwareOversampleConfigure(ADC_RANGE_SENS_BASE, ADC_OVERSAMPLE_RATE);
	SysCtlDelay(3);
	ADCHardwareOversampleConfigure(ADC_LDR_SENS_BASE, ADC_OVERSAMPLE_RATE);
	SysCtlDelay(3);

	//Turn off ADC sequences before configuring
	ADCSequenceDisable(ADC_RANGE_SENS_BASE, ADC_SEQ_NUMBER);
	SysCtlDelay(3);
	ADCSequenceDisable(ADC_LDR_SENS_BASE, ADC_SEQ_NUMBER);
	SysCtlDelay(3);

	//Configure the ADC - Sequence 3 -> 1 step
	//PE2 (AIN1)
	ADCSequenceConfigure(ADC_RANGE_SENS_BASE, ADC_SEQ_NUMBER, ADC_TRIGGER_PROCESSOR, ADC_PRIORITY_LEVEL);
	ADCSequenceStepConfigure(ADC_RANGE_SENS_BASE, ADC_SEQ_NUMBER, 0, ADC_RANGE_SENS_CTL_CH |
														   ADC_CTL_IE |
														   ADC_CTL_END);

	//Configure the ADC - Sequence 3 -> 1 step
	//PE1 (AIN2)
	ADCSequenceConfigure(ADC_LDR_SENS_BASE, ADC_SEQ_NUMBER, ADC_TRIGGER_PROCESSOR, ADC_PRIORITY_LEVEL);
	ADCSequenceStepConfigure(ADC_LDR_SENS_BASE, ADC_SEQ_NUMBER, 0, ADC_LDR_SENS_CTL_CH |
														   ADC_CTL_IE |
														   ADC_CTL_END);

	//Enable the sequence
	ADCSequenceEnable(ADC_RANGE_SENS_BASE, ADC_SEQ_NUMBER);
	ADCSequenceEnable(ADC_LDR_SENS_BASE, ADC_SEQ_NUMBER);

	//clear the interrupt flag
	ADCIntClear(ADC_RANGE_SENS_BASE, ADC_SEQ_NUMBER);
	ADCIntClear(ADC_LDR_SENS_BASE, ADC_SEQ_NUMBER);
}

/***************************************************************************************/

void initMUX_GPIO(void)
{
	//GPIOA Has the mux lines for Mux1/AIN7/PD0
	SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
	SysCtlDelay(3);

	//GPIOc Has the mux lines for Mux0/AIN6/PD1
	SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
	SysCtlDelay(3);

	//Initialize the pins for A:
	GPIOPinTypeGPIOOutput(MUX_GPIO_REG_LDR, MUX_GPIO_LDR_A);
	SysCtlDelay(3);
	GPIOPinTypeGPIOOutput(MUX_GPIO_REG_LDR, MUX_GPIO_LDR_B);
	SysCtlDelay(3);
	GPIOPinTypeGPIOOutput(MUX_GPIO_REG_LDR, MUX_GPIO_LDR_C);
	SysCtlDelay(3);

	//Initialize the pins for C:
	GPIOPinTypeGPIOOutput(MUX_GPIO_REG_RANGE, MUX_GPIO_RANGE_A);
	SysCtlDelay(3);
	GPIOPinTypeGPIOOutput(MUX_GPIO_REG_RANGE, MUX_GPIO_RANGE_B);
	SysCtlDelay(3);
	GPIOPinTypeGPIOOutput(MUX_GPIO_REG_RANGE, MUX_GPIO_RANGE_C);
	SysCtlDelay(3);
}

/***************************************************************************************/

void initTimer(void)
{
	// The Timer0 peripheral must be enabled for use.
	SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);

	// Configure Timer0B as a 16-bit periodic timer.
	TimerConfigure(TIMER0_BASE, TIMER_CFG_SPLIT_PAIR | TIMER_CFG_B_PERIODIC);

	// Set the Timer0B load value to 1ms.
	TimerLoadSet(TIMER0_BASE, TIMER_B, SysCtlClockGet() / 1000);

	// Enable processor interrupts.
	IntMasterEnable();

	// Configure the Timer0B interrupt for timer timeout.
	TimerIntEnable(TIMER0_BASE, TIMER_TIMB_TIMEOUT);

	// Enable the Timer0B interrupt on the processor (NVIC).
	IntEnable(INT_TIMER0B);

	// Enable Timer0B.
	TimerEnable(TIMER0_BASE, TIMER_B);
}

/***************************************************************************************/

ADCData readADC(SensorType sensorType)
{
	ADCData data;
	uint32_t base = (sensorType == RangeSensors ? ADC_RANGE_SENS_BASE : ADC_LDR_SENS_BASE);

	//Trigger the interrupt
	ADCProcessorTrigger(base, ADC_SEQ_NUMBER);

	//Wait for the ADC to finish reading
	while(!ADCIntStatus(base, ADC_SEQ_NUMBER, false)) {}

	//Clear the flags
	ADCIntClear(base, ADC_SEQ_NUMBER);

	//write data to adcValues (FIFO)
	ADCSequenceDataGet(base, ADC_SEQ_NUMBER, &data);

	return data;
}

/***************************************************************************************/

uint16_t getMidiPitchBend(void)
{
	//normalize 12 ADC bit value to 14 bit MIDI value
	//multiply by 4
	return ((readADC(RangeSensors) << 2) & MIDI_PITCH_BEND_MASK);
}

/***************************************************************************************/

void setMUXPosition(uint8_t channelNumber, SensorType sensorType)
{
	switch(channelNumber)
	{
		case 0:
			//0, 0, 0
			setMUXLines(sensorType, MUX_LINE_OFF, MUX_LINE_OFF, MUX_LINE_OFF);
			break;

		case 1:
			//0, 0, 1
			setMUXLines(sensorType, MUX_LINE_OFF, MUX_LINE_OFF, MUX_LINE_ON);
			break;

		case 2:
			//0, 1, 0
			setMUXLines(sensorType, MUX_LINE_OFF, MUX_LINE_ON, MUX_LINE_OFF);
			break;

		case 3:
			//0, 1, 1
			setMUXLines(sensorType, MUX_LINE_OFF, MUX_LINE_ON, MUX_LINE_ON);
			break;

		case 4:
			//1, 0, 0
			setMUXLines(sensorType, MUX_LINE_ON, MUX_LINE_OFF, MUX_LINE_OFF);
			break;

		case 5:
			//1, 0, 1
			setMUXLines(sensorType, MUX_LINE_ON, MUX_LINE_OFF, MUX_LINE_ON);
			break;

		case 6:
			//1, 1, 0
			setMUXLines(sensorType, MUX_LINE_ON, MUX_LINE_ON, MUX_LINE_OFF);
			break;

		case 7:
			//1, 1, 1
			setMUXLines(sensorType, MUX_LINE_ON, MUX_LINE_ON, MUX_LINE_ON);
			break;

		default:
			//0, 0, 0
			setMUXLines(sensorType, MUX_LINE_OFF, MUX_LINE_OFF, MUX_LINE_OFF);
			break;
	}
}

/***************************************************************************************/
//Sets the mux select lines
void setMUXLines(SensorType sensorType, uint8_t msb, uint8_t nmsb, uint8_t lsb)
{
	uint32_t regBase = (sensorType == RangeSensors ? MUX_GPIO_REG_RANGE : MUX_GPIO_REG_LDR);
	uint8_t  aSelect = (sensorType == RangeSensors ? MUX_GPIO_RANGE_A : MUX_GPIO_LDR_A);
	uint8_t  bSelect = (sensorType == RangeSensors ? MUX_GPIO_RANGE_B : MUX_GPIO_LDR_B);
	uint8_t  cSelect = (sensorType == RangeSensors ? MUX_GPIO_RANGE_C : MUX_GPIO_LDR_C);
	GPIOPinWrite(regBase, aSelect, lsb);
	SysCtlDelay(3);
	GPIOPinWrite(regBase, bSelect, nmsb);
	SysCtlDelay(3);
	GPIOPinWrite(regBase, cSelect, msb);
	SysCtlDelay(3);
}

/***************************************************************************************/
//adjusts threshold to currently available values
void calibrateLDRs(uint16_t thresholdValue[], bool noteSent[])
{
	for (uint16_t channel = 0; channel < MIDI_CHANNEL_NUMBERS; ++channel)
	{
		//Only calibrate if not being played
		if (noteSent[channel] == false)
		{
			//change mux to current channel
			setMUXPosition(channel, LightDependentResistors);
			thresholdValue[channel] = readADC(LightDependentResistors);//TODO: Plus offset?
		}
	}
}

tm4c123gh6pm_startup_ccs.c:

//*****************************************************************************
//
// Startup code for use with TI's Code Composer Studio.
//
// Copyright (c) 2011-2014 Texas Instruments Incorporated.  All rights reserved.
// Software License Agreement
// 
// Software License Agreement
//
// Texas Instruments (TI) is supplying this software for use solely and
// exclusively on TI's microcontroller products. The software is owned by
// TI and/or its suppliers, and is protected under applicable copyright
// laws. You may not combine this software with "viral" open-source
// software in order to form a larger program.
//
// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT
// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY
// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
// DAMAGES, FOR ANY REASON WHATSOEVER.
//
//*****************************************************************************

#include <stdint.h>

//*****************************************************************************
//
// Forward declaration of the default fault handlers.
//
//*****************************************************************************
void ResetISR(void);
static void NmiSR(void);
static void FaultISR(void);
static void IntDefaultHandler(void);

//*****************************************************************************
//
// External declaration for the reset handler that is to be called when the
// processor is started
//
//*****************************************************************************
extern void _c_int00(void);

//*****************************************************************************
//
// Linker variable that marks the top of the stack.
//
//*****************************************************************************
extern uint32_t __STACK_TOP;

//*****************************************************************************
//
// External declarations for the interrupt handlers used by the application.
//
//*****************************************************************************
// To be added by user
extern void Timer0BIntHandler(void);

//*****************************************************************************
//
// The vector table.  Note that the proper constructs must be placed on this to
// ensure that it ends up at physical address 0x0000.0000 or at the start of
// the program if located at a start address other than 0.
//
//*****************************************************************************

#pragma DATA_SECTION(g_pfnVectors, ".intvecs")
void (* const g_pfnVectors[])(void) =
{
    (void (*)(void))((uint32_t)&__STACK_TOP),
                                            // The initial stack pointer
    ResetISR,                               // The reset handler
    NmiSR,                                  // The NMI handler
    FaultISR,                               // The hard fault handler
    IntDefaultHandler,                      // The MPU fault handler
    IntDefaultHandler,                      // The bus fault handler
    IntDefaultHandler,                      // The usage fault handler
    0,                                      // Reserved
    0,                                      // Reserved
    0,                                      // Reserved
    0,                                      // Reserved
    IntDefaultHandler,                      // SVCall handler
    IntDefaultHandler,                      // Debug monitor handler
    0,                                      // Reserved
    IntDefaultHandler,                      // The PendSV handler
    IntDefaultHandler,                      // The SysTick handler
    IntDefaultHandler,                      // GPIO Port A
    IntDefaultHandler,                      // GPIO Port B
    IntDefaultHandler,                      // GPIO Port C
    IntDefaultHandler,                      // GPIO Port D
    IntDefaultHandler,                      // GPIO Port E
    IntDefaultHandler,                      // UART0 Rx and Tx
    IntDefaultHandler,                      // UART1 Rx and Tx
    IntDefaultHandler,                      // SSI0 Rx and Tx
    IntDefaultHandler,                      // I2C0 Master and Slave
    IntDefaultHandler,                      // PWM Fault
    IntDefaultHandler,                      // PWM Generator 0
    IntDefaultHandler,                      // PWM Generator 1
    IntDefaultHandler,                      // PWM Generator 2
    IntDefaultHandler,                      // Quadrature Encoder 0
    IntDefaultHandler,                      // ADC Sequence 0
    IntDefaultHandler,                      // ADC Sequence 1
    IntDefaultHandler,                      // ADC Sequence 2
    IntDefaultHandler,                      // ADC Sequence 3
    IntDefaultHandler,                      // Watchdog timer
    IntDefaultHandler,                      // Timer 0 subtimer A
	Timer0BIntHandler,//*****               // Timer 0 subtimer B
    IntDefaultHandler,                      // Timer 1 subtimer A
    IntDefaultHandler,                      // Timer 1 subtimer B
    IntDefaultHandler,                      // Timer 2 subtimer A
    IntDefaultHandler,                      // Timer 2 subtimer B
    IntDefaultHandler,                      // Analog Comparator 0
    IntDefaultHandler,                      // Analog Comparator 1
    IntDefaultHandler,                      // Analog Comparator 2
    IntDefaultHandler,                      // System Control (PLL, OSC, BO)
    IntDefaultHandler,                      // FLASH Control
    IntDefaultHandler,                      // GPIO Port F
    IntDefaultHandler,                      // GPIO Port G
    IntDefaultHandler,                      // GPIO Port H
    IntDefaultHandler,                      // UART2 Rx and Tx
    IntDefaultHandler,                      // SSI1 Rx and Tx
    IntDefaultHandler,                      // Timer 3 subtimer A
    IntDefaultHandler,                      // Timer 3 subtimer B
    IntDefaultHandler,                      // I2C1 Master and Slave
    IntDefaultHandler,                      // Quadrature Encoder 1
    IntDefaultHandler,                      // CAN0
    IntDefaultHandler,                      // CAN1
    0,                                      // Reserved
    0,                                      // Reserved
    IntDefaultHandler,                      // Hibernate
    IntDefaultHandler,                      // USB0
    IntDefaultHandler,                      // PWM Generator 3
    IntDefaultHandler,                      // uDMA Software Transfer
    IntDefaultHandler,                      // uDMA Error
    IntDefaultHandler,                      // ADC1 Sequence 0
    IntDefaultHandler,                      // ADC1 Sequence 1
    IntDefaultHandler,                      // ADC1 Sequence 2
    IntDefaultHandler,                      // ADC1 Sequence 3
    0,                                      // Reserved
    0,                                      // Reserved
    IntDefaultHandler,                      // GPIO Port J
    IntDefaultHandler,                      // GPIO Port K
    IntDefaultHandler,                      // GPIO Port L
    IntDefaultHandler,                      // SSI2 Rx and Tx
    IntDefaultHandler,                      // SSI3 Rx and Tx
    IntDefaultHandler,                      // UART3 Rx and Tx
    IntDefaultHandler,                      // UART4 Rx and Tx
    IntDefaultHandler,                      // UART5 Rx and Tx
    IntDefaultHandler,                      // UART6 Rx and Tx
    IntDefaultHandler,                      // UART7 Rx and Tx
    0,                                      // Reserved
    0,                                      // Reserved
    0,                                      // Reserved
    0,                                      // Reserved
    IntDefaultHandler,                      // I2C2 Master and Slave
    IntDefaultHandler,                      // I2C3 Master and Slave
    IntDefaultHandler,                      // Timer 4 subtimer A
    IntDefaultHandler,                      // Timer 4 subtimer B
    0,                                      // Reserved
    0,                                      // Reserved
    0,                                      // Reserved
    0,                                      // Reserved
    0,                                      // Reserved
    0,                                      // Reserved
    0,                                      // Reserved
    0,                                      // Reserved
    0,                                      // Reserved
    0,                                      // Reserved
    0,                                      // Reserved
    0,                                      // Reserved
    0,                                      // Reserved
    0,                                      // Reserved
    0,                                      // Reserved
    0,                                      // Reserved
    0,                                      // Reserved
    0,                                      // Reserved
    0,                                      // Reserved
    0,                                      // Reserved
    IntDefaultHandler,                      // Timer 5 subtimer A
    IntDefaultHandler,                      // Timer 5 subtimer B
    IntDefaultHandler,                      // Wide Timer 0 subtimer A
    IntDefaultHandler,                      // Wide Timer 0 subtimer B
    IntDefaultHandler,                      // Wide Timer 1 subtimer A
    IntDefaultHandler,                      // Wide Timer 1 subtimer B
    IntDefaultHandler,                      // Wide Timer 2 subtimer A
    IntDefaultHandler,                      // Wide Timer 2 subtimer B
    IntDefaultHandler,                      // Wide Timer 3 subtimer A
    IntDefaultHandler,                      // Wide Timer 3 subtimer B
    IntDefaultHandler,                      // Wide Timer 4 subtimer A
    IntDefaultHandler,                      // Wide Timer 4 subtimer B
    IntDefaultHandler,                      // Wide Timer 5 subtimer A
    IntDefaultHandler,                      // Wide Timer 5 subtimer B
    IntDefaultHandler,                      // FPU
    0,                                      // Reserved
    0,                                      // Reserved
    IntDefaultHandler,                      // I2C4 Master and Slave
    IntDefaultHandler,                      // I2C5 Master and Slave
    IntDefaultHandler,                      // GPIO Port M
    IntDefaultHandler,                      // GPIO Port N
    IntDefaultHandler,                      // Quadrature Encoder 2
    0,                                      // Reserved
    0,                                      // Reserved
    IntDefaultHandler,                      // GPIO Port P (Summary or P0)
    IntDefaultHandler,                      // GPIO Port P1
    IntDefaultHandler,                      // GPIO Port P2
    IntDefaultHandler,                      // GPIO Port P3
    IntDefaultHandler,                      // GPIO Port P4
    IntDefaultHandler,                      // GPIO Port P5
    IntDefaultHandler,                      // GPIO Port P6
    IntDefaultHandler,                      // GPIO Port P7
    IntDefaultHandler,                      // GPIO Port Q (Summary or Q0)
    IntDefaultHandler,                      // GPIO Port Q1
    IntDefaultHandler,                      // GPIO Port Q2
    IntDefaultHandler,                      // GPIO Port Q3
    IntDefaultHandler,                      // GPIO Port Q4
    IntDefaultHandler,                      // GPIO Port Q5
    IntDefaultHandler,                      // GPIO Port Q6
    IntDefaultHandler,                      // GPIO Port Q7
    IntDefaultHandler,                      // GPIO Port R
    IntDefaultHandler,                      // GPIO Port S
    IntDefaultHandler,                      // PWM 1 Generator 0
    IntDefaultHandler,                      // PWM 1 Generator 1
    IntDefaultHandler,                      // PWM 1 Generator 2
    IntDefaultHandler,                      // PWM 1 Generator 3
    IntDefaultHandler                       // PWM 1 Fault
};

//*****************************************************************************
//
// This is the code that gets called when the processor first starts execution
// following a reset event.  Only the absolutely necessary set is performed,
// after which the application supplied entry() routine is called.  Any fancy
// actions (such as making decisions based on the reset cause register, and
// resetting the bits in that register) are left solely in the hands of the
// application.
//
//*****************************************************************************
void
ResetISR(void)
{
    //
    // Jump to the CCS C initialization routine.  This will enable the
    // floating-point unit as well, so that does not need to be done here.
    //
    __asm("    .global _c_int00\n"
          "    b.w     _c_int00");
}

//*****************************************************************************
//
// This is the code that gets called when the processor receives a NMI.  This
// simply enters an infinite loop, preserving the system state for examination
// by a debugger.
//
//*****************************************************************************
static void
NmiSR(void)
{
    //
    // Enter an infinite loop.
    //
    while(1)
    {
    }
}

//*****************************************************************************
//
// This is the code that gets called when the processor receives a fault
// interrupt.  This simply enters an infinite loop, preserving the system state
// for examination by a debugger.
//
//*****************************************************************************
static void
FaultISR(void)
{
    //
    // Enter an infinite loop.
    //
    while(1)
    {
    }
}

//*****************************************************************************
//
// This is the code that gets called when the processor receives an unexpected
// interrupt.  This simply enters an infinite loop, preserving the system state
// for examination by a debugger.
//
//*****************************************************************************
static void
IntDefaultHandler(void)
{
    //
    // Go into an infinite loop.
    //
    while(1)
    {
    }
}

Project.zip