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.

CC2652RSIP: CC2652RSIP DIO31 configuration

Part Number: CC2652RSIP

Hi Ti Team,

I tried to configure DIO31 as input, using the example project simple_peripheral with LP-CC2652RSIP.

it seem the PINCC26XX.c does not allow such configuration and the PIN_init() Failes.

we are using the CC2652RSIP, and in our design DIO31 is required.

Regards,

Adir.

  • I can add DIO_31 as GPIO using sysconfg in CCS.

    What do you mean "it seem the PINCC26XX.c does not allow such configuration and the PIN_init() Failes."?

  • Hi Yikai,

    thx for the response

    did you try to run this?

    This is the PIN_init(), when I add the DIO31 the PINCC26XX.c return PIN_NO_ACCESS and the program cannot run beyond the while(1).

  • I don't have LP-CC2652RSIP to test this but I don't see reason why DIO_31 would cause such issue. Can you attach your ti_drivers_config.c?

  • /*
     *  ======== ti_drivers_config.c ========
     *  Configured TI-Drivers module definitions
     *
     *  DO NOT EDIT - This file is generated for the LP_CC2652RSIP
     *  by the SysConfig tool.
     */
    
    #include <stddef.h>
    #include <stdint.h>
    
    #ifndef DeviceFamily_CC26X2
    #define DeviceFamily_CC26X2
    #endif
    
    #include <ti/devices/DeviceFamily.h>
    
    #include "ti_drivers_config.h"
    
    /*
     *  ============================= Display =============================
     */
    
    #include <ti/display/Display.h>
    #include <ti/display/DisplayUart.h>
    
    #define CONFIG_Display_COUNT 1
    
    #define Display_UARTBUFFERSIZE 128
    static char displayUARTBuffer[Display_UARTBUFFERSIZE];
    
    DisplayUart_Object displayUartObject;
    
    const DisplayUart_HWAttrs displayUartHWAttrs = {
        .uartIdx      = CONFIG_DISPLAY_UART,
        .baudRate     = 115200,
        .mutexTimeout = (unsigned int)(-1),
        .strBuf       = displayUARTBuffer,
        .strBufLen    = Display_UARTBUFFERSIZE
    };
    
    const Display_Config Display_config[CONFIG_Display_COUNT] = {
        /* CONFIG_Display_0 */
        /* XDS110 UART */
        {
            .fxnTablePtr = &DisplayUartAnsi_fxnTable,
            .object      = &displayUartObject,
            .hwAttrs     = &displayUartHWAttrs
        },
    };
    
    const uint_least8_t Display_count = CONFIG_Display_COUNT;
    
    /*
     *  =============================== AESCCM ===============================
     */
    
    #include <ti/drivers/AESCCM.h>
    #include <ti/drivers/aesccm/AESCCMCC26XX.h>
    
    #define CONFIG_AESCCM_COUNT 1
    AESCCMCC26XX_Object aesccmCC26XXObjects[CONFIG_AESCCM_COUNT];
    
    /*
     *  ======== aesccmCC26XXHWAttrs ========
     */
    const AESCCMCC26XX_HWAttrs aesccmCC26XXHWAttrs[CONFIG_AESCCM_COUNT] = {
        {
            .intPriority = (~0),
        },
    };
    
    const AESCCM_Config AESCCM_config[CONFIG_AESCCM_COUNT] = {
        {   /* CONFIG_AESCCM0 */
            .object  = &aesccmCC26XXObjects[CONFIG_AESCCM0],
            .hwAttrs = &aesccmCC26XXHWAttrs[CONFIG_AESCCM0]
        },
    };
    
    const uint_least8_t CONFIG_AESCCM0_CONST = CONFIG_AESCCM0;
    const uint_least8_t AESCCM_count = CONFIG_AESCCM_COUNT;
    
    /*
     *  =============================== AESCTR ===============================
     */
    
    #include <ti/drivers/AESCTR.h>
    #include <ti/drivers/aesctr/AESCTRCC26XX.h>
    
    #define CONFIG_AESCTR_COUNT 1
    AESCTRCC26XX_Object aesctrCC26XXObjects[CONFIG_AESCTR_COUNT];
    
    /*
     *  ======== aesctrCC26XXHWAttrs ========
     */
    const AESCTRCC26XX_HWAttrs aesctrCC26XXHWAttrs[CONFIG_AESCTR_COUNT] = {
        {
            .intPriority = (~0),
        },
    };
    
    const AESCTR_Config AESCTR_config[CONFIG_AESCTR_COUNT] = {
        {   /* CONFIG_AESCTR_0 */
            .object  = &aesctrCC26XXObjects[CONFIG_AESCTR_0],
            .hwAttrs = &aesctrCC26XXHWAttrs[CONFIG_AESCTR_0]
        },
    };
    
    const uint_least8_t CONFIG_AESCTR_0_CONST = CONFIG_AESCTR_0;
    const uint_least8_t AESCTR_count = CONFIG_AESCTR_COUNT;
    
    /*
     *  =============================== AESCTRDRBG ===============================
     */
    
    #include <ti/drivers/AESCTRDRBG.h>
    #include <ti/drivers/aesctrdrbg/AESCTRDRBGXX.h>
    
    #define CONFIG_AESCTRDRBG_COUNT 1
    
    /*
     *  ======== aesctrdrbgXXObjects ========
     */
    AESCTRDRBGXX_Object aesctrdrbgXXObjects[CONFIG_AESCTRDRBG_COUNT];
    
    /*
     *  ======== aesctrdrbgXXHWAttrs ========
     */
    const AESCTRDRBGXX_HWAttrs aesctrdrbgXXHWAttrs[CONFIG_AESCTRDRBG_COUNT] = {
        /* CONFIG_AESCTRDRBG_0 */
        {
            .aesctrIndex = CONFIG_AESCTR_0
        },
    };
    
    /*
     *  ======== AESCTRDRBG_config ========
     */
    const AESCTRDRBG_Config AESCTRDRBG_config[CONFIG_AESCTRDRBG_COUNT] = {
        /* CONFIG_AESCTRDRBG_0 */
        {
            .object = &aesctrdrbgXXObjects[CONFIG_AESCTRDRBG_0],
            .hwAttrs = &aesctrdrbgXXHWAttrs[CONFIG_AESCTRDRBG_0]
        },
    };
    
    const uint_least8_t CONFIG_AESCTRDRBG_0_CONST = CONFIG_AESCTRDRBG_0;
    const uint_least8_t AESCTRDRBG_count = CONFIG_AESCTRDRBG_COUNT;
    
    /*
     *  =============================== AESECB ===============================
     */
    
    #include <ti/drivers/AESECB.h>
    #include <ti/drivers/aesecb/AESECBCC26XX.h>
    
    #define CONFIG_AESECB_COUNT 1
    AESECBCC26XX_Object aesecbCC26XXObjects[CONFIG_AESECB_COUNT];
    
    /*
     *  ======== aesecbCC26XXHWAttrs ========
     */
    const AESECBCC26XX_HWAttrs aesecbCC26XXHWAttrs[CONFIG_AESECB_COUNT] = {
        {
            .intPriority = (~0),
        },
    };
    
    const AESECB_Config AESECB_config[CONFIG_AESECB_COUNT] = {
        {   /* CONFIG_AESECB0 */
            .object  = &aesecbCC26XXObjects[CONFIG_AESECB0],
            .hwAttrs = &aesecbCC26XXHWAttrs[CONFIG_AESECB0]
        },
    };
    
    
    const uint_least8_t CONFIG_AESECB0_CONST = CONFIG_AESECB0;
    const uint_least8_t AESECB_count = CONFIG_AESECB_COUNT;
    
    /*
     *  =============================== DMA ===============================
     */
    
    #include <ti/drivers/dma/UDMACC26XX.h>
    #include <ti/devices/cc13x2_cc26x2/driverlib/udma.h>
    #include <ti/devices/cc13x2_cc26x2/inc/hw_memmap.h>
    
    UDMACC26XX_Object udmaCC26XXObject;
    
    const UDMACC26XX_HWAttrs udmaCC26XXHWAttrs = {
        .baseAddr        = UDMA0_BASE,
        .powerMngrId     = PowerCC26XX_PERIPH_UDMA,
        .intNum          = INT_DMA_ERR,
        .intPriority     = (~0)
    };
    
    const UDMACC26XX_Config UDMACC26XX_config[1] = {
        {
            .object         = &udmaCC26XXObject,
            .hwAttrs        = &udmaCC26XXHWAttrs,
        },
    };
    
    /*
     *  =============================== ECDH ===============================
     */
    
    #include <ti/drivers/ECDH.h>
    #include <ti/drivers/ecdh/ECDHCC26X2.h>
    
    #define CONFIG_ECDH_COUNT 1
    
    ECDHCC26X2_Object ecdhCC26X2Objects[CONFIG_ECDH_COUNT];
    
    /*
     *  ======== ecdhCC26X2HWAttrs ========
     */
    const ECDHCC26X2_HWAttrs ecdhCC26X2HWAttrs[CONFIG_ECDH_COUNT] = {
        {
            .intPriority = (~0),
        },
    };
    
    const ECDH_Config ECDH_config[CONFIG_ECDH_COUNT] = {
        {   /* CONFIG_ECDH0 */
            .object         = &ecdhCC26X2Objects[CONFIG_ECDH0],
            .hwAttrs        = &ecdhCC26X2HWAttrs[CONFIG_ECDH0]
        },
    };
    
    const uint_least8_t CONFIG_ECDH0_CONST = CONFIG_ECDH0;
    const uint_least8_t ECDH_count = CONFIG_ECDH_COUNT;
    
    /*
     *  =============================== GPIO ===============================
     */
    
    #include <ti/drivers/GPIO.h>
    #include <ti/drivers/gpio/GPIOCC26XX.h>
    
    #define CONFIG_GPIO_COUNT 3
    
    /*
     *  ======== gpioPinConfigs ========
     *  Array of Pin configurations
     */
    GPIO_PinConfig gpioPinConfigs[] = {
        /* CONFIG_GPIO_BTN1 : LaunchPad Button BTN-1 (Left) */
        GPIOCC26XX_DIO_15 | GPIO_DO_NOT_CONFIG,
        /* CONFIG_GPIO_BTN2 : LaunchPad Button BTN-2 (Right) */
        GPIOCC26XX_DIO_14 | GPIO_DO_NOT_CONFIG,
        /* CONFIG_GPIO_0 */
        GPIOCC26XX_DIO_31 | GPIO_CFG_IN_NOPULL | GPIO_CFG_IN_INT_NONE,
    };
    
    /*
     *  ======== gpioCallbackFunctions ========
     *  Array of callback function pointers
     *
     *  NOTE: Unused callback entries can be omitted from the callbacks array to
     *  reduce memory usage by enabling callback table optimization
     *  (GPIO.optimizeCallbackTableSize = true)
     */
    GPIO_CallbackFxn gpioCallbackFunctions[] = {
        /* CONFIG_GPIO_BTN1 : LaunchPad Button BTN-1 (Left) */
        NULL,
        /* CONFIG_GPIO_BTN2 : LaunchPad Button BTN-2 (Right) */
        NULL,
        /* CONFIG_GPIO_0 */
        NULL,
    };
    
    const uint_least8_t CONFIG_GPIO_BTN1_CONST = CONFIG_GPIO_BTN1;
    const uint_least8_t CONFIG_GPIO_BTN2_CONST = CONFIG_GPIO_BTN2;
    const uint_least8_t CONFIG_GPIO_0_CONST = CONFIG_GPIO_0;
    
    /*
     *  ======== GPIOCC26XX_config ========
     */
    const GPIOCC26XX_Config GPIOCC26XX_config = {
        .pinConfigs = (GPIO_PinConfig *)gpioPinConfigs,
        .callbacks = (GPIO_CallbackFxn *)gpioCallbackFunctions,
        .numberOfPinConfigs = 3,
        .numberOfCallbacks = 3,
        .intPriority = (~0)
    };
    
    /*
     *  =============================== NVS ===============================
     */
    
    #include <ti/drivers/NVS.h>
    #include <ti/drivers/nvs/NVSCC26XX.h>
    
    /*
     *  NVSCC26XX Internal NVS flash region definitions
     *
     * Place uninitialized char arrays at addresses
     * corresponding to the 'regionBase' addresses defined in
     * the configured NVS regions. These arrays are used as
     * place holders so that the linker will not place other
     * content there.
     *
     * For GCC targets, the char arrays are each placed into
     * the shared ".nvs" section. The user must add content to
     * their GCC linker command file to place the .nvs section
     * at the lowest 'regionBase' address specified in their NVS
     * regions.
     */
    
    #if defined(__TI_COMPILER_VERSION__) || defined(__clang__)
    
    static char flashBuf0[0x4000] __attribute__ ((retain, noinit, location(0x48000)));
    
    #elif defined(__IAR_SYSTEMS_ICC__)
    
    __no_init static char flashBuf0[0x4000] @ 0x48000;
    
    #elif defined(__GNUC__)
    
    __attribute__ ((section (".nvs")))
    static char flashBuf0[0x4000];
    
    #endif
    
    NVSCC26XX_Object nvsCC26XXObjects[1];
    
    static const NVSCC26XX_HWAttrs nvsCC26XXHWAttrs[1] = {
        /* CONFIG_NVSINTERNAL */
        {
            .regionBase = (void *) flashBuf0,
            .regionSize = 0x4000
        },
    };
    
    #define CONFIG_NVS_COUNT 1
    
    const NVS_Config NVS_config[CONFIG_NVS_COUNT] = {
        /* CONFIG_NVSINTERNAL */
        {
            .fxnTablePtr = &NVSCC26XX_fxnTable,
            .object = &nvsCC26XXObjects[0],
            .hwAttrs = &nvsCC26XXHWAttrs[0],
        },
    };
    
    const uint_least8_t CONFIG_NVSINTERNAL_CONST = CONFIG_NVSINTERNAL;
    const uint_least8_t NVS_count = CONFIG_NVS_COUNT;
    
    /*
     *  =============================== PIN ===============================
     */
    #include <ti/drivers/PIN.h>
    #include <ti/drivers/pin/PINCC26XX.h>
    
    #define CONFIG_PIN_COUNT 5
    
    const PIN_Config BoardGpioInitTable[CONFIG_PIN_COUNT + 1] = {
        /* LaunchPad Button BTN-1 (Left), Parent Signal: CONFIG_GPIO_BTN1 GPIO Pin, (DIO15) */
        CONFIG_PIN_BTN1 | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_DIS,
        /* LaunchPad Button BTN-2 (Right), Parent Signal: CONFIG_GPIO_BTN2 GPIO Pin, (DIO14) */
        CONFIG_PIN_BTN2 | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_DIS,
        /* Parent Signal: CONFIG_GPIO_0 GPIO Pin, (DIO31) */
        CONFIG_PIN_0 | PIN_INPUT_EN | PIN_NOPULL | PIN_IRQ_DIS,
        /* XDS110 UART, Parent Signal: CONFIG_DISPLAY_UART TX, (DIO13) */
        CONFIG_PIN_UART_TX | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MED,
        /* XDS110 UART, Parent Signal: CONFIG_DISPLAY_UART RX, (DIO12) */
        CONFIG_PIN_UART_RX | PIN_INPUT_EN | PIN_PULLDOWN | PIN_IRQ_DIS,
    
        PIN_TERMINATE
    };
    
    const PINCC26XX_HWAttrs PINCC26XX_hwAttrs = {
        .intPriority = (~0),
        .swiPriority = 0
    };
    
    /*
     *  =============================== Power ===============================
     */
    #include <ti/drivers/Power.h>
    #include <ti/drivers/power/PowerCC26X2.h>
    #include "ti_drivers_config.h"
    
    extern void PowerCC26XX_standbyPolicy(void);
    extern bool PowerCC26XX_calibrate(unsigned int);
    
    const PowerCC26X2_Config PowerCC26X2_config = {
        .enablePolicy             = true,
        .policyInitFxn            = NULL,
        .policyFxn                = PowerCC26XX_standbyPolicy,
        .calibrateFxn             = PowerCC26XX_calibrate,
        .calibrateRCOSC_LF        = true,
        .calibrateRCOSC_HF        = true,
        .enableTCXOFxn            = NULL
    };
    
    
    /*
     *  =============================== RF Driver ===============================
     */
    #include <ti/drivers/rf/RF.h>
    
    /*
     * Platform-specific driver configuration
     */
    const RFCC26XX_HWAttrsV2 RFCC26XX_hwAttrs = {
        .hwiPriority        = (~0),
        .swiPriority        = (uint8_t)0,
        .xoscHfAlwaysNeeded = true,
        .globalCallback     = NULL,
        .globalEventMask    = 0
    };
    
    
    /*
     *  =============================== TRNG ===============================
     */
    
    #include <ti/drivers/TRNG.h>
    #include <ti/drivers/trng/TRNGCC26XX.h>
    
    #define CONFIG_TRNG_COUNT 1
    
    TRNGCC26XX_Object trngCC26XXObjects[CONFIG_TRNG_COUNT];
    
    /*
     *  ======== trngCC26XXHWAttrs ========
     */
    static const TRNGCC26XX_HWAttrs trngCC26XXHWAttrs[CONFIG_TRNG_COUNT] = {
        {
            .intPriority = (~0),
            .swiPriority = 0,
            .samplesPerCycle = 240000
        },
    };
    
    const TRNG_Config TRNG_config[CONFIG_TRNG_COUNT] = {
        {   /* CONFIG_TRNG_0 */
            .object         = &trngCC26XXObjects[CONFIG_TRNG_0],
            .hwAttrs        = &trngCC26XXHWAttrs[CONFIG_TRNG_0]
        },
    };
    
    const uint_least8_t CONFIG_TRNG_0_CONST = CONFIG_TRNG_0;
    const uint_least8_t TRNG_count = CONFIG_TRNG_COUNT;
    
    /*
     *  =============================== Temperature ===============================
     */
    #include <ti/drivers/Temperature.h>
    #include <ti/drivers/temperature/TemperatureCC26X2.h>
    
    const TemperatureCC26X2_Config TemperatureCC26X2_config = {
        .intPriority = (~0),
    };
    
    /*
     *  =============================== UART ===============================
     */
    
    #include <ti/drivers/UART.h>
    #include <ti/drivers/uart/UARTCC26XX.h>
    #include <ti/drivers/Power.h>
    #include <ti/drivers/power/PowerCC26X2.h>
    #include <ti/devices/cc13x2_cc26x2/inc/hw_memmap.h>
    #include <ti/devices/cc13x2_cc26x2/inc/hw_ints.h>
    
    #define CONFIG_UART_COUNT 1
    
    UARTCC26XX_Object uartCC26XXObjects[CONFIG_UART_COUNT];
    
    static unsigned char uartCC26XXRingBuffer0[32];
    
    static const UARTCC26XX_HWAttrsV2 uartCC26XXHWAttrs[CONFIG_UART_COUNT] = {
      {
        .baseAddr           = UART1_BASE,
        .intNum             = INT_UART1_COMB,
        .intPriority        = (~0),
        .swiPriority        = 0,
        .powerMngrId        = PowerCC26X2_PERIPH_UART1,
        .ringBufPtr         = uartCC26XXRingBuffer0,
        .ringBufSize        = sizeof(uartCC26XXRingBuffer0),
        .rxPin              = IOID_12,
        .txPin              = IOID_13,
        .ctsPin             = PIN_UNASSIGNED,
        .rtsPin             = PIN_UNASSIGNED,
        .txIntFifoThr       = UARTCC26XX_FIFO_THRESHOLD_1_8,
        .rxIntFifoThr       = UARTCC26XX_FIFO_THRESHOLD_4_8,
        .errorFxn           = NULL
      },
    };
    
    const UART_Config UART_config[CONFIG_UART_COUNT] = {
        {   /* CONFIG_DISPLAY_UART */
            .fxnTablePtr = &UARTCC26XX_fxnTable,
            .object      = &uartCC26XXObjects[CONFIG_DISPLAY_UART],
            .hwAttrs     = &uartCC26XXHWAttrs[CONFIG_DISPLAY_UART]
        },
    };
    
    const uint_least8_t CONFIG_DISPLAY_UART_CONST = CONFIG_DISPLAY_UART;
    const uint_least8_t UART_count = CONFIG_UART_COUNT;
    
    #include <stdbool.h>
    
    #include <ti/devices/cc13x2_cc26x2/driverlib/ioc.h>
    #include <ti/devices/cc13x2_cc26x2/driverlib/cpu.h>
    
    #include <ti/drivers/pin/PINCC26XX.h>
    
    /*
     *  ======== Board_sendExtFlashByte ========
     */
    void Board_sendExtFlashByte(PIN_Handle pinHandle, uint8_t byte)
    {
        uint8_t i;
    
        /* SPI Flash CS */
        PIN_setOutputValue(pinHandle, IOID_20, 0);
    
        for (i = 0; i < 8; i++) {
            PIN_setOutputValue(pinHandle, IOID_10, 0);  /* SPI Flash CLK */
    
            /* SPI Flash MOSI */
            PIN_setOutputValue(pinHandle, IOID_9, (byte >> (7 - i)) & 0x01);
            PIN_setOutputValue(pinHandle, IOID_10, 1);  /* SPI Flash CLK */
    
            /*
             * Waste a few cycles to keep the CLK high for at
             * least 45% of the period.
             * 3 cycles per loop: 8 loops @ 48 Mhz = 0.5 us.
             */
            CPUdelay(8);
        }
    
        PIN_setOutputValue(pinHandle, IOID_10, 0);  /* CLK */
        PIN_setOutputValue(pinHandle, IOID_20, 1);  /* CS */
    
        /*
         * Keep CS high at least 40 us
         * 3 cycles per loop: 700 loops @ 48 Mhz ~= 44 us
         */
        CPUdelay(700);
    }
    
    /*
     *  ======== Board_wakeUpExtFlash ========
     */
    void Board_wakeUpExtFlash(void)
    {
        PIN_Config extFlashPinTable[] = {
            /* SPI Flash CS */
            IOID_20 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL |
                    PIN_INPUT_DIS | PIN_DRVSTR_MED,
            PIN_TERMINATE
        };
        PIN_State extFlashPinState;
        PIN_Handle extFlashPinHandle = PIN_open(&extFlashPinState, extFlashPinTable);
    
        /*
         *  To wake up we need to toggle the chip select at
         *  least 20 ns and ten wait at least 35 us.
         */
    
        /* Toggle chip select for ~20ns to wake ext. flash */
        PIN_setOutputValue(extFlashPinHandle, IOID_20, 0);
        /* 3 cycles per loop: 1 loop @ 48 Mhz ~= 62 ns */
        CPUdelay(1);
        PIN_setOutputValue(extFlashPinHandle, IOID_20, 1);
        /* 3 cycles per loop: 560 loops @ 48 Mhz ~= 35 us */
        CPUdelay(560);
    
        PIN_close(extFlashPinHandle);
    }
    
    /*
     *  ======== Board_shutDownExtFlash ========
     */
    void Board_shutDownExtFlash(void)
    {
        /*
         *  To be sure we are putting the flash into sleep and not waking it,
         *  we first have to make a wake up call
         */
        Board_wakeUpExtFlash();
    
        PIN_Config extFlashPinTable[] = {
            /* SPI Flash CS*/
            IOID_20 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL |
                    PIN_INPUT_DIS | PIN_DRVSTR_MED,
            /* SPI Flash CLK */
            IOID_10 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL |
                    PIN_INPUT_DIS | PIN_DRVSTR_MED,
            /* SPI Flash MOSI */
            IOID_9 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL |
                    PIN_INPUT_DIS | PIN_DRVSTR_MED,
            /* SPI Flash MISO */
            IOID_8 | PIN_INPUT_EN | PIN_PULLDOWN,
            PIN_TERMINATE
        };
        PIN_State extFlashPinState;
        PIN_Handle extFlashPinHandle = PIN_open(&extFlashPinState, extFlashPinTable);
    
        uint8_t extFlashShutdown = 0xB9;
    
        Board_sendExtFlashByte(extFlashPinHandle, extFlashShutdown);
    
        PIN_close(extFlashPinHandle);
    }
    
    
    #include <ti/drivers/Board.h>
    
    /*
     *  ======== Board_initHook ========
     *  Perform any board-specific initialization needed at startup.  This
     *  function is declared weak to allow applications to override it if needed.
     */
    void __attribute__((weak)) Board_initHook(void)
    {
    }
    
    /*
     *  ======== Board_init ========
     *  Perform any initialization needed before using any board APIs
     */
    void Board_init(void)
    {
        /* ==== /ti/drivers/Power initialization ==== */
        Power_init();
    
        /* ==== /ti/devices/CCFGTemplate initialization ==== */
    
        /* ==== /ti/drivers/PIN initialization ==== */
        if (PIN_init(BoardGpioInitTable) != PIN_SUCCESS) {
            /* Error with PIN_init */
            while (1);
        }
        /* ==== /ti/drivers/RF initialization ==== */
    
    
        Board_shutDownExtFlash();
    
        Board_initHook();
    }