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)
{
}
}