Brian Fulton
Brian Fulton

Reputation: 51

How do I define a timer in code composer studio in gpiointerrupt.c

I need to create a state machine to blink "SOS" code with the LED lights. Using the Timer.h file reference from ti.com, I tried to implement this,..

Timer_Handle    handle;
Timer_Params    params;
Timer_Params_init(&params);
params.periodUnits = Timer_PERIOD_HZ;
params.period = 1000;
params.timerMode  = Timer_CONTINUOUS_CALLBACK;
params.timerCallback = UserCallbackFunction;
handle = Timer_open(Board_TIMER0, &params);
if (handle == NULL) {
    // Timer_open() failed
    while (1);
}
status = Timer_start(handle);
if (status == Timer_STATUS_ERROR) {
    //Timer_start() failed
    while (1);
}
sleep(10000);
Timer_stop(handle);

My full code to blink an SOS message:

/*
 *  ======== gpiointerrupt.c ========
 */
#include <stdint.h>
#include <stddef.h>


/* Driver Header files */
#include <ti/drivers/GPIO.h>
#include <ti/drivers/Timer.h>

/* Driver configuration */
#include "ti_drivers_config.h"




enum MESSAGES {SOS, OK} CURRENT_MESSAGE, BUTTON_PRESS;

enum LED {RED_LED, LED_OFF, GREEN_LED} LED_STATE;

enum LED sos[] = {
    // Print "S"
    RED_LED, LED_OFF,
    RED_LED, LED_OFF,
    RED_LED, LED_OFF, RED_LED, LED_OFF,

    // Print "O"
    GREEN_LED, GREEN_LED, GREEN_LED, LED_OFF,
    GREEN_LED, GREEN_LED, GREEN_LED, LED_OFF,
    GREEN_LED, GREEN_LED, GREEN_LED, LED_OFF, LED_OFF, LED_OFF,

    // Print "S"
    RED_LED, LED_OFF,
    RED_LED, LED_OFF,
    RED_LED, LED_OFF, LED_OFF, LED_OFF, LED_OFF, LED_OFF, LED_OFF
};

enum LED ok[] = {
    //Print "O"
    GREEN_LED, GREEN_LED, GREEN_LED, LED_OFF,
    GREEN_LED, GREEN_LED, GREEN_LED, LED_OFF,
    GREEN_LED, GREEN_LED, GREEN_LED, LED_OFF, LED_OFF, LED_OFF,

    // Print "K"
    GREEN_LED, GREEN_LED, GREEN_LED, LED_OFF,
    RED_LED, LED_OFF,
    GREEN_LED, GREEN_LED, GREEN_LED,
    LED_OFF, LED_OFF, LED_OFF, LED_OFF, LED_OFF, LED_OFF, LED_OFF

};

unsigned int mCounter = 0;

void setMorseCodeLEDs() {
    switch (LED_STATE) {
        case RED_LED:
            GPIO_write(CONFIG_GPIO_LED_0, CONFIG_GPIO_LED_ON);
            GPIO_write(CONFIG_GPIO_LED_1, CONFIG_GPIO_LED_OFF);
            break;
        case GREEN_LED:
            GPIO_write(CONFIG_GPIO_LED_0, CONFIG_GPIO_LED_OFF);
            GPIO_write(CONFIG_GPIO_LED_1, CONFIG_GPIO_LED_ON);
            break;
        case LED_OFF:
            GPIO_write(CONFIG_GPIO_LED_0, CONFIG_GPIO_LED_OFF);
            GPIO_write(CONFIG_GPIO_LED_1, CONFIG_GPIO_LED_OFF);
            break;
        default:
            break;

    }
}
/*
 *  ======== gpioButtonPress ========
 *  Callback function for the GPIO interrupt on CONFIG_GPIO_BUTTON_0 and                    *  CONFIG_GPIO_BUTTON_1.
 *
 */
void gpioButtonPress(uint_least8_t index)
{
    switch(BUTTON_PRESS) {
        case SOS:
            BUTTON_PRESS = OK;
            break;
        case OK:
            BUTTON_PRESS = SOS;
            break;
        default:
            break;
    }
}
/*
 *  ======== timerCallback ========
 *  Callback function for the timer interrupt
 */
void timerCallback(Timer_Handle myHandle, int_fast16_t status) {
    switch (CURRENT_MESSAGE) {
        case SOS:
            LED_STATE = sos[mCounter];
            setMorseCodeLEDs();
            mCounter++;

            if (mCounter == (sizeof(sos)/sizeof(sos[0]))) {
                CURRENT_MESSAGE = BUTTON_PRESS;
                mCounter = 0;
            }   
            break;
        case OK:
            LED_STATE = ok[mCounter];

            setMorseCodeLEDs();
            mCounter++;

            if (mCounter == (sizeof(ok)/sizeof(ok[0]))) {
                CURRENT_MESSAGE = BUTTON_PRESS;
                mCounter = 0;
            }
            break;
        default:
            break;
    
    }
}

/*
 *  ======== initTimer ========
 *
 * Initiate the timer interrupt function
 */
void initTimer(void)
{
    Timer_Handle timer0;
    Timer_Params params;
    Timer_init();
    Timer_Params_init(&params);
    params.period = 500000;
    params.periodUnits = Timer_PERIOD_US;
    params.timerMode = Timer_CONTINUOUS_CALLBACK;
    params.timerCallback = timerCallback;
    timer0 = Timer_open(CONFIG_TIMER_0, &params);
    if (timer0 == NULL) {
    /* Failed to initialized timer */
    while (1) {}
    }
    if (Timer_start(timer0) == Timer_STATUS_ERROR) {
    /* Failed to start timer */
    while (1) {}
    }
}

/*
 *  ======== mainThread ========
 */
void *mainThread(void *arg0)
{
    /* Call driver init functions */
    GPIO_init();
    /* Call the timer*/
    initTimer();

    /* Configure the LED and button pins */
    GPIO_setConfig(CONFIG_GPIO_LED_0, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
    GPIO_setConfig(CONFIG_GPIO_LED_1, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
    GPIO_setConfig(CONFIG_GPIO_BUTTON_0, GPIO_CFG_IN_PU | GPIO_CFG_IN_INT_FALLING);

    /* Start with both LEDs off */
    GPIO_write(CONFIG_GPIO_LED_0, CONFIG_GPIO_LED_OFF);
    GPIO_write(CONFIG_GPIO_LED_1, CONFIG_GPIO_LED_OFF);

    /* Install Button callback */
    GPIO_setCallback(CONFIG_GPIO_BUTTON_0, gpioButtonPress);

    /* Set initial states*/
    BUTTON_PRESS = SOS;
    CURRENT_MESSAGE = BUTTON_PRESS;

    /* Enable interrupts */
    GPIO_enableInt(CONFIG_GPIO_BUTTON_0);

    /*
     *  If more than one input pin is available for your device, interrupts
     *  will be enabled on CONFIG_GPIO_BUTTON1.
     */
    if (CONFIG_GPIO_BUTTON_0 != CONFIG_GPIO_BUTTON_1)
    {
        /* Configure BUTTON1 pin */
        GPIO_setConfig(CONFIG_GPIO_BUTTON_1, GPIO_CFG_IN_PU | GPIO_CFG_IN_INT_FALLING);

        /* Install Button callback */
        GPIO_setCallback(CONFIG_GPIO_BUTTON_1, gpioButtonPress);
        GPIO_enableInt(CONFIG_GPIO_BUTTON_1);
    }

    return (NULL);
}
Timer_Handle and Timer_Params are both red and I get this error when I try to build,

Errors(3 items) #20 identifier "Timer_Handle0" is undefined gmake: ***[gpiointerrupt.obj] Error 1 gmake: Target 'all' not remade because of errors.

Upvotes: 0

Views: 67

Answers (0)

Related Questions