Hi All
When I create a timer from the available products in the configurator I can see the code is added in the cfg.
I would like to run the timer as a one shot.
What I want to do is create a task that executes every so often then when the task executes it must start my one shot timer, When the timer expires it should then toggle a pin.
Now my question, Do I use hardware timer for this if so, how? Or do I use the Timer module from the products.... I struggle to find some documentation on this
Kind regards
Ben
Here my main, where can I get the handle for timer0 that was created in the cfg file?
/* * Copyright (c) 2015-2016, Texas Instruments Incorporated * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of Texas Instruments Incorporated nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * ======== empty.c ======== */ /* XDCtools Header files */ #include <xdc/std.h> #include <xdc/runtime/System.h> /* BIOS Header files */ #include <ti/sysbios/BIOS.h> #include <ti/sysbios/knl/Clock.h> #include <ti/sysbios/knl/Task.h> /* TI-RTOS Header files */ // #include <ti/drivers/I2C.h> #include <ti/drivers/PIN.h> // #include <ti/drivers/SPI.h> // #include <ti/drivers/UART.h> // #include <ti/drivers/Watchdog.h> /* Board Header files */ #include "Board.h" #define TASKSTACKSIZE 512 Task_Struct task0Struct; Char task0Stack[TASKSTACKSIZE]; Task_Struct task2Struct; Char task2Stack[TASKSTACKSIZE]; Task_Struct task1Struct; Char task1Stack[TASKSTACKSIZE]; /* Pin driver handle */ static PIN_Handle ledPinHandle; static PIN_State ledPinState; uint8_t g_configPinStatus=0; uint8_t g_currentState=0; /* * Application LED pin configuration table: * - All LEDs board LEDs are off. */ PIN_Config ledPinTable[] = { Board_LED0 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX, Board_LED1 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX, Board_LED2 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX, Board_LED3 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX, PIN_TERMINATE }; /* * ======== heartBeatFxn ======== * Toggle the Board_LED0. The Task_sleep is determined by arg0 which * is configured for the heartBeat Task instance. */ Void heartBeatFxn(UArg arg0, UArg arg1) { while (1) { Task_sleep((UInt)arg0); PIN_setOutputValue(ledPinHandle, Board_LED0, !PIN_getOutputValue(Board_LED0)); System_printf("Now In hearBeat"); } } /* * ======== LedOffTmr0 ======== * Switch off LED after time out */ Void LedOffTmr0(void) { PIN_setOutputValue(ledPinHandle, TeqconRadioLedState,0); } /* * ======== StatusLedOnTask ======== * Switch Status LED On */ Void LedOnTsk (UArg arg0, UArg arg1) { Task_sleep((UInt)arg0); PIN_setOutputValue(ledPinHandle, TeqconRadioLedState,1); Timer_start(timer0); } /* * ======== CheckCfgPin ======== * Check Cfg Pin */ Void checkCFGPin(UArg arg0, UArg arg1) { while (1) { Task_sleep((UInt)arg0); g_configPinStatus = PIN_getInputValue(EnableConfig); System_printf("Now in checkCfg"); if(g_configPinStatus&1 == 1) { PIN_setOutputValue(ledPinHandle, Board_LED2, !PIN_getOutputValue(Board_LED2)); } else { PIN_setOutputValue(ledPinHandle, Board_LED2,0); } } } /* * ======== main ======== */ int main(void) { Task_Params taskParams; Task_Params cfgChkTsk; Task_Params ledOffTsk; /* Call board init functions */ Board_initGeneral(); // Board_initI2C(); // Board_initSPI(); // Board_initUART(); // Board_initWatchdog(); /* Construct heartBeat Task thread */ Task_Params_init(&taskParams); taskParams.arg0 = 1000000 / Clock_tickPeriod; taskParams.stackSize = TASKSTACKSIZE; taskParams.stack = &task0Stack; Task_construct(&task0Struct, (Task_FuncPtr)heartBeatFxn, &taskParams, NULL); //task to check for cfg pin Task_Params_init(&cfgChkTsk); cfgChkTsk.arg0 = 5000000 / Clock_tickPeriod; cfgChkTsk.stackSize = TASKSTACKSIZE; cfgChkTsk.stack = &task1Stack; Task_construct(&task1Struct, (Task_FuncPtr)checkCFGPin, &cfgChkTsk, NULL); //task to check for status set pin Task_Params_init(&ledOffTsk); ledOffTsk.arg0 = 100000 / Clock_tickPeriod; ledOffTsk.stackSize = TASKSTACKSIZE; ledOffTsk.stack = &task2Stack; Task_construct(&task2Struct, (Task_FuncPtr)checkCFGPin, &cfgChkTsk, NULL); /* Open LED pins */ ledPinHandle = PIN_open(&ledPinState, ledPinTable); if(!ledPinHandle) { System_abort("Error initializing board LED pins\n"); } //PIN_setOutputValue(ledPinHandle, Board_LED1, 1); System_printf("Starting the example\nSystem provider is set to SysMin. " "Halt the target to view any SysMin contents in ROV.\n"); /* SysMin will only print to the console when you call flush or exit */ System_flush(); /* Start BIOS */ BIOS_start(); return (0); }