Reputation: 51
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(¶ms);
params.periodUnits = Timer_PERIOD_HZ;
params.period = 1000;
params.timerMode = Timer_CONTINUOUS_CALLBACK;
params.timerCallback = UserCallbackFunction;
handle = Timer_open(Board_TIMER0, ¶ms);
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(¶ms);
params.period = 500000;
params.periodUnits = Timer_PERIOD_US;
params.timerMode = Timer_CONTINUOUS_CALLBACK;
params.timerCallback = timerCallback;
timer0 = Timer_open(CONFIG_TIMER_0, ¶ms);
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