Tool/software:
Hello!
I am using this MCU to receive Ethernet-based commands, and then send out related, but different, UART data (this will eventually be an RS-485 bus with other embedded modules on this bus). To meet this end, I am combing the tcpEcho and uartEchoDma example projects together. I have gotten each of these to work individually.
The problem is when I have both sets of code included, the project will run for about 3 seconds, and the it jumps to abort. I have set the tcpTask to a priority of 1, and the uartTask to a priority of 2. No semaphores are being used, and I though this would be fine since the tcpTask seems to exit if there is not activity.
Do I need to coordinate between these two tasks using a semaphore, or event? The tcpTask should have the priority, but if there isn't any Ethernet activity, I want the uartTask to execute. I have provided my software files.
Thank you,
Noah
///////////////////////////////////////////////////////////////////////////////
/** @file "tcpEchoHooks.c"
* @brief Contains tcp task and worker functions
-----------------------------------------------------------
@b Details
Contains the NDK hooks for TI RTOS.
@b Target
- TM4C129ENCPDT (CORTEX_M4_0
- ARM Compiler
- ARM Linker
@b Author(s)
- NIM(LASP)
- last revision by ($Author$)
Copyright © 2024, LASP
-----------------------------------------------------------
<b>Revision History:</b>
- 1.0: 10 Dec. 2024 Original
- last revision ($Date$)
-----------------------------------------------------------
<b>Attention</b>
// Includes
*/
/* XDCtools Header files */
#include <xdc/std.h>
#include <xdc/runtime/Error.h>
#include <xdc/runtime/System.h>
/* BIOS Header files */
#include <ti/sysbios/BIOS.h>
#include <ti/sysbios/knl/Task.h>
/* TCP Application Specific Header file. */
#include "tcp_sys.h"
// Constants
// Modular Variables
/* Prototypes */
Void tcpHandler(UArg arg0, UArg arg1);
// ============================================================================
// Private Functions
// ============================================================================
// ============================================================================
// Public Functions
// ============================================================================
//=============================================================================
/**
@return
- void
NDK network open hook used to initialize IPv6
*/
void netOpenHook()
{
Task_Handle taskHandle;
Task_Params taskParams;
Error_Block eb;
/* Make sure Error_Block is initialized */
Error_init(&eb);
/*
* Create the Task that farms out incoming TCP connections.
* arg0 will be the port that this task listens to.
*/
Task_Params_init(&taskParams);
taskParams.stackSize = TCPHANDLERSTACK;
taskParams.priority = 1;
taskParams.arg0 = TCPPORT;
taskHandle = Task_create((Task_FuncPtr)tcpHandler, &taskParams, &eb);
if (taskHandle == NULL) {
System_printf("netOpenHook: Failed to create tcpHandler Task\n");
}
System_flush();
}
///////////////////////////////////////////////////////////////////////////////
/** @file "tcpEcho.c"
* @brief Contains tcp task and worker functions
-----------------------------------------------------------
@b Details
Inherited from tcpEcho example. Contains task and worker
functions.
@b Target
- TM4C129ENCPDT (CORTEX_M4_0
- ARM Compiler
- ARM Linker
@b Author(s)
- NIM(LASP)
- last revision by ($Author$)
Copyright © 2024, LASP
-----------------------------------------------------------
<b>Revision History:</b>
- 1.0: 10 Dec. 2024 Original
- last revision ($Date$)
-----------------------------------------------------------
<b>Attention</b>
*/
// Includes
#include <string.h>
#include <xdc/std.h>
#include <xdc/runtime/Error.h>
#include <xdc/runtime/System.h>
#include <ti/sysbios/BIOS.h>
#include <ti/sysbios/knl/Task.h>
#include <ti/drivers/GPIO.h>
/* NDK BSD support */
#include <sys/socket.h>
/* Example/Board Header file */
#include "Board.h"
/* TCP Application Specific Header file. */
#include "tcp_sys.h"
// Constants
// Modular Variables
// ============================================================================
// Private Functions
// ============================================================================
//=============================================================================
/**
@return
- void
Shuts down tcp task.
*/
static inline void ShutDown
(
int32_t server ///< server index being referenced
)
//-----------------------------------------------------------------------------
{
if (server > 0)
{
close(server);
}
} //ShutDown
// ============================================================================
// Public Functions
// ============================================================================
//=============================================================================
/**
@return
- Void
Task to handle TCP connection. Can be multiple Tasks running
this function.
*/
Void tcpWorker
(
UArg arg0, ///< task argument 0
UArg arg1 ///< task argument 1
)
{
int32_t clientfd = (int32_t)arg0;
int32_t bytesRcvd;
int32_t bytesSent;
char buffer[TCPPACKETSIZE];
System_printf("tcpWorker: start clientfd = 0x%x\n", clientfd);
while ((bytesRcvd = recv(clientfd, buffer, TCPPACKETSIZE, 0)) > 0) {
bytesSent = send(clientfd, buffer, bytesRcvd, 0);
if (bytesSent < 0 || bytesSent != bytesRcvd) {
System_printf("Error: send failed.\n");
break;
}
}
System_printf("tcpWorker stop clientfd = 0x%x\n", clientfd);
close(clientfd);
}
//=============================================================================
/**
@return
- Void
Creates new Task to handle new TCP connections.
*/
Void tcpHandler
(
UArg arg0, ///< task argument 0
UArg arg1 ///< task argument 1
)
{
int32_t status;
int32_t clientfd;
int32_t server;
struct sockaddr_in localAddr;
struct sockaddr_in clientAddr;
int32_t optval;
int32_t optlen = sizeof(optval);
socklen_t addrlen = sizeof(clientAddr);
Task_Handle taskHandle;
Task_Params taskParams;
Error_Block eb;
server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (server == -1) {
System_printf("Error: socket not created.\n");
ShutDown(server);//goto shutdown;
}
memset(&localAddr, 0, sizeof(localAddr));
localAddr.sin_family = AF_INET;
localAddr.sin_addr.s_addr = htonl(INADDR_ANY);
localAddr.sin_port = htons(arg0);
status = bind(server, (struct sockaddr *)&localAddr, sizeof(localAddr));
if (status == -1) {
System_printf("Error: bind failed.\n");
ShutDown(server);//goto shutdown;
}
status = listen(server, NUMTCPWORKERS);
if (status == -1) {
System_printf("Error: listen failed.\n");
ShutDown(server);//goto shutdown;
}
optval = 1;
if (setsockopt(server, SOL_SOCKET, SO_KEEPALIVE, &optval, optlen) < 0) {
System_printf("Error: setsockopt failed\n");
ShutDown(server);//goto shutdown;
}
while ((clientfd =
accept(server, (struct sockaddr *)&clientAddr, &addrlen)) != -1) {
System_printf("tcpHandler: Creating thread clientfd = %d\n", clientfd);
/* Init the Error_Block */
Error_init(&eb);
/* Initialize the defaults and set the parameters. */
Task_Params_init(&taskParams);
taskParams.arg0 = (UArg)clientfd;
taskParams.stackSize = 1280;
taskParams.priority = 1;
taskHandle = Task_create((Task_FuncPtr)tcpWorker, &taskParams, &eb);
if (taskHandle == NULL) {
System_printf("Error: Failed to create new Task\n");
close(clientfd);
}
/* addrlen is a value-result param, must reset for next accept call */
addrlen = sizeof(clientAddr);
}
System_printf("Error: accept failed.\n");
//shutdown:
//if (server > 0) {
//close(server);
//}
}
///////////////////////////////////////////////////////////////////////////////
/** @file "uartEcho.c"
* @brief Contains uart task and worker functions
-----------------------------------------------------------
@b Details
Inherited from tcpEcho example. Contains task and worker
functions.
@b Target
- TM4C129ENCPDT (CORTEX_M4_0
- ARM Compiler
- ARM Linker
@b Author(s)
- NIM(LASP)
- last revision by ($Author$)
Copyright © 2024, LASP
-----------------------------------------------------------
<b>Revision History:</b>
- 1.0: 11 Dec. 2024 Original
- last revision ($Date$)
-----------------------------------------------------------
<b>Attention</b>
*/
// Includes
#include <string.h>
#include <stdio.h>
#include <xdc/std.h>
#include <xdc/runtime/Error.h>
#include <xdc/runtime/System.h>
#include <ti/sysbios/BIOS.h>
#include <ti/sysbios/knl/Task.h>
#include <ti/drivers/GPIO.h>
#include <ti/drivers/UART.h>
/* NDK BSD support */
#include <sys/socket.h>
/* Example/Board Header file */
#include "Board.h"
/* TCP Application Specific Header file. */
#include "uart_sys.h"
// Constants
// Modular Variables
static UartSysType uartSys;
// ============================================================================
// Private Functions
// ============================================================================
//=============================================================================
/**
@return
- void
Clears modular variables.
*/
static void ClearModVars
(
UartSysType* modVarPtr ///< modular variable pointer
)
{
if (modVarPtr)
{
memset(modVarPtr, 0, sizeof(UartSysType));
}
}
//=============================================================================
/**
@return
- int32_t: positive value means success; negative value means failure
Initializes uart parameters.
*/
static int32_t InitUartParams
(
UART_Params* params
)
{
int32_t returnVal = -1;
if (params)
{
returnVal = 1;
/* Create a UART with data processing off. */
UART_Params_init(params);
params->writeDataMode = UART_DATA_BINARY;
params->readDataMode = UART_DATA_BINARY;
params->readReturnMode = UART_RETURN_FULL;
params->readEcho = UART_ECHO_OFF;
params->baudRate = 9600;
}
return returnVal;
}
// ============================================================================
// Public Functions
// ============================================================================
//=============================================================================
/**
@return
- Void
Task to handle TCP connection. Can be multiple Tasks running
this function.
*/
Void echoFxn
(
UArg arg0, ///< TI RTOS argument 0
UArg arg1 ///< TI RTOS argument 1
)
{
UART_Params uartParams;
const char echoPrompt[] = "\fEchoing characters:\r\n";
InitUartParams(&uartParams);
#ifdef MIKROE_DEV
UART_Handle uart2, uart4;
uint32_t count = 0;
uint32_t size = 0;
uint32_t delay = 0;
char outputString[16];
char inputString[16];
uart2 = UART_open(Board_UART2, &uartParams);
if (uart2 == NULL) {
System_abort("Error opening the UART");
}
InitUartParams(&uartParams);
uart4 = UART_open(Board_UART4, &uartParams);
if (uart4 == NULL) {
System_abort("Error opening the UART");
}
UART_write(uart2, echoPrompt, sizeof(echoPrompt));
/* Loop forever echoing */
while (1)
{
//if(++delay >= 10000)
{
//delay = 0;
//Task_sleep(1000);
snprintf(outputString, 16, "Count is: %u",count);
count++;
size = strlen(outputString);
UART_write(uart2, outputString, size);
UART_read(uart4, inputString, 16);
snprintf(outputString, 16, "%s",inputString);
System_printf("The string sent was: %s\r\n", outputString);
System_flush();
}
}
#else
char input;
UART_Handle uart0;
uart0 = UART_open(Board_UART0, &uartParams);
if (uart0 == NULL) {
System_abort("Error opening the UART");
}
UART_write(uart0, echoPrompt, sizeof(echoPrompt));
/* Loop forever echoing */
while (1) {
UART_read(uart0, &input, 1);
UART_write(uart0, &input, 1);
}
#endif
}
//=============================================================================
/**
@return
- void
Initializes the uart task.
*/
void initUartTask(void)
{
ClearModVars(&uartSys);
Task_Params_init(&uartSys.taskParams);
uartSys.taskParams.stackSize = TASKSTACKSIZE;
uartSys.taskParams.stack = &uartSys.task0Stack;
uartSys.taskParams.instance->name = "echo";
uartSys.taskParams.priority = 2;
Task_construct(&uartSys.task0Struct, (Task_FuncPtr)echoFxn, &uartSys.taskParams, NULL);
/* This example has logging and many other debug capabilities enabled */
System_printf("This example does not attempt to minimize code or data "
"footprint\n");
System_flush();
System_printf("Starting the UART Echo 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();
}
///////////////////////////////////////////////////////////////////////////////
/** @file "main.c"
* @brief main module for AVTS Host MCU
-----------------------------------------------------------
@b Details
This project is built upon TI RTOS. From within this function,
initialization calls are made and the BIOS is started.
@b Target
- TM4C129ENCPDT (CORTEX_M4_0
- ARM Compiler
- ARM Linker
@b Author(s)
- NIM(LASP)
- last revision by ($Author$)
Copyright © 2024, LASP
-----------------------------------------------------------
<b>Revision History:</b>
- 1.0: 10 Dec. 2024 Original
- last revision ($Date$)
-----------------------------------------------------------
<b>Attention</b>
*/
///////////////////////////////////////////////////////////////////////////////
// Includes
#include <string.h>
#include <xdc/std.h>
#include <xdc/runtime/Error.h>
#include <xdc/runtime/System.h>
#include <ti/sysbios/BIOS.h>
#include <ti/sysbios/knl/Task.h>
#include <ti/drivers/GPIO.h>
/* NDK BSD support */
#include <sys/socket.h>
/* Example/Board Header file */
#include "Board.h"
/* AVTS Host MCU Specific Header files */
#include "uart_sys.h"
// Constants
// Modular Variables
// ============================================================================
// Private Functions
// ============================================================================
// ============================================================================
// Public Functions
// ============================================================================
//=============================================================================
/**
@return
- int32_t
Main function and C starting point for the AVTS Host MCU software.
*/
int32_t main(void)
{
//static const uint8_t macArray[6] = {0xAC,0xDE,0x48,0x00,0x00,0x80};
/* Call board init functions */
Board_initGeneral();
Board_initGPIO();
//NM
//EMACAddrSet(EMAC0_BASE,INT_EMAC0, macArray);
Board_initEMAC();
System_printf("Starting the TCP Echo 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();
Board_initUART();
initUartTask();
/* Start BIOS */
BIOS_start();
return (0);
}
/*
* Copyright (c) 2015, 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.
*/
/*
* ======== EK_TM4C129EXL.c ========
* This file is responsible for setting up the board specific items for the
* EK_TM4C129EXL board.
*/
#include <stdint.h>
#include <stdbool.h>
#include <xdc/std.h>
#include <xdc/runtime/Error.h>
#include <xdc/runtime/System.h>
#include <ti/sysbios/family/arm/m3/Hwi.h>
#include <inc/hw_ints.h>
#include <inc/hw_memmap.h>
#include <inc/hw_types.h>
#include <inc/hw_gpio.h>
#include <driverlib/flash.h>
#include <driverlib/gpio.h>
#include <driverlib/i2c.h>
#include <driverlib/pin_map.h>
#include <driverlib/pwm.h>
#include <driverlib/ssi.h>
#include <driverlib/sysctl.h>
#include <driverlib/uart.h>
#include <driverlib/udma.h>
#include "EK_TM4C129EXL.h"
#define DEFAULT_MAC_ADDR 0xACDE48000080u
#include <inc/hw_flash.h>
#include <stdbool.h>
#ifndef TI_DRIVERS_UART_DMA
#define TI_DRIVERS_UART_DMA 0
#endif
#ifndef TI_EXAMPLES_PPP
#define TI_EXAMPLES_PPP 0
#else
/* prototype for NIMU init function */
extern int USBSerialPPP_NIMUInit();
#endif
/*
* =============================== DMA ===============================
*/
#if defined(__TI_COMPILER_VERSION__)
#pragma DATA_ALIGN(dmaControlTable, 1024)
#elif defined(__IAR_SYSTEMS_ICC__)
#pragma data_alignment=1024
#elif defined(__GNUC__)
__attribute__ ((aligned (1024)))
#endif
static tDMAControlTable dmaControlTable[32];
static bool dmaInitialized = false;
/* Hwi_Struct used in the initDMA Hwi_construct call */
static Hwi_Struct dmaHwiStruct;
/* Hwi_Struct used in the usbBusFault Hwi_construct call */
static Hwi_Struct usbBusFaultHwiStruct;
/*
* ======== dmaErrorHwi ========
*/
static Void dmaErrorHwi(UArg arg)
{
System_printf("DMA error code: %d\n", uDMAErrorStatusGet());
uDMAErrorStatusClear();
System_abort("DMA error!!");
}
/*
* ======== EK_TM4C129EXL_usbBusFaultHwi ========
*/
static Void EK_TM4C129EXL_usbBusFaultHwi(UArg arg)
{
/*
* This function should be modified to appropriately manage handle
* a USB bus fault.
*/
System_printf("USB bus fault detected.");
Hwi_clearInterrupt(INT_GPIOQ4);
System_abort("USB error!!");
}
/*
* ======== EK_TM4C129EXL_initDMA ========
*/
void EK_TM4C129EXL_initDMA(void)
{
Error_Block eb;
Hwi_Params hwiParams;
if (!dmaInitialized) {
Error_init(&eb);
Hwi_Params_init(&hwiParams);
Hwi_construct(&(dmaHwiStruct), INT_UDMAERR, dmaErrorHwi,
&hwiParams, &eb);
if (Error_check(&eb)) {
System_abort("Couldn't construct DMA error hwi");
}
SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA);
uDMAEnable();
uDMAControlBaseSet(dmaControlTable);
dmaInitialized = true;
}
}
/*
* =============================== General ===============================
*/
/*
* ======== EK_TM4C129EXL_initGeneral ========
*/
void EK_TM4C129EXL_initGeneral(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOH);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOJ);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOK);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOL);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOM);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPION);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOP);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOQ);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOR);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOS);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOT);
}
/*
* =============================== EMAC ===============================
*/
/* Place into subsections to allow the TI linker to remove items properly */
#if defined(__TI_COMPILER_VERSION__)
#pragma DATA_SECTION(EMAC_config, ".const:EMAC_config")
#pragma DATA_SECTION(emacHWAttrs, ".const:emacHWAttrs")
#pragma DATA_SECTION(NIMUDeviceTable, ".data:NIMUDeviceTable")
#endif
#include <ti/drivers/EMAC.h>
//#include <ti/drivers/emac/EMACSnow.h>
//NM
#include <stdbool.h>
#include <driverlib/emac.h>
#include "EMACSnow.h"
/*
* Required by the Networking Stack (NDK). This array must be NULL terminated.
* This can be removed if NDK is not used.
* Double curly braces are needed to avoid GCC bug #944572
* https://bugs.launchpad.net/gcc-linaro/+bug/944572
*/
NIMU_DEVICE_TABLE_ENTRY NIMUDeviceTable[2] = {
{
#if TI_EXAMPLES_PPP
/* Use PPP driver for PPP example only */
.init = USBSerialPPP_NIMUInit
#else
/* Default: use Ethernet driver */
.init = EMACSnow_NIMUInit
#endif
},
{NULL}
};
EMACSnow_Object emacObjects[EK_TM4C129EXL_EMACCOUNT];
/*
* EMAC configuration structure
* Set user/company specific MAC octates. The following sets the address
* to ff-ff-ff-ff-ff-ff. Users need to change this to make the label on
* their boards.
*/
unsigned char macAddress[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
const uint8_t defaultMacArray[6] = {0xAC,0xDE,0x48,0x00,0x00,0x80};
bool useDefaultMac = false;
const EMACSnow_HWAttrs emacHWAttrs[EK_TM4C129EXL_EMACCOUNT] = {
{
.baseAddr = EMAC0_BASE,
.intNum = INT_EMAC0,
.intPriority = (~0),
.macAddress = macAddress
}
};
const EMAC_Config EMAC_config[] = {
{
.fxnTablePtr = &EMACSnow_fxnTable,
.object = &emacObjects[0],
.hwAttrs = &emacHWAttrs[0]
},
{NULL, NULL, NULL}
};
/*
* ======== EK_TM4C129EXL_initEMAC ========
*/
void EK_TM4C129EXL_initEMAC(void)
{
//NM
union ulUnion
{
uint64_t full;
uint32_t halves[2];
uint16_t quarters[4];
uint8_t bytes[8];
};
//static const union ulUnion mac = {.full = DEFAULT_MAC_ADDR};
uint32_t ulUser0, ulUser1;//, ui32FlashConf;
//bool enablePrefetch = FALSE;
//uint32_t i = 0;
//union ulUnion ulUser0, ulUser1;
volatile uint32_t emacState = 0;
//NM
//emacState = EMACDMAStateGet(EMAC0_BASE);
//EMACAddrSet(EMAC0_BASE,INT_EMAC0, macArray);
//for (i = 0; i < 2; i++)
//{
/* Get the MAC address */
FlashUserGet(&ulUser0, &ulUser1);
// if ((ulUser0 == 0xffffffff) && (ulUser1 == 0xffffffff))
//{
/*
* This is a work-around for EMAC initialization issues found on
* the TM4C129 devices. The bug number is:
* SDOCM00107378: NDK examples for EK-TM4C1294XL do not work
*
* The following disables the flash pre-fetch (if it is not already disabled).
* It is enable within the in the EMACSnow_emacStart() function.
*/
//ui32FlashConf = HWREG(FLASH_CONF);
//if ((ui32FlashConf & (FLASH_CONF_FPFOFF)) == FALSE) {
// enablePrefetch = TRUE;
// ui32FlashConf &= ~(FLASH_CONF_FPFON);
// ui32FlashConf |= FLASH_CONF_FPFOFF;
// HWREG(FLASH_CONF) = ui32FlashConf;
// }
/* Program the MAC address into the Ethernet controller. */
//EMACAddrSet(EMAC0_BASE, 0, (uint8_t *)macArray);
//}
//}
//ulUser0 = mac.halves[1];
//ulUser1 = mac.halves[0];
if ((ulUser0 != 0xffffffff) && (ulUser1 != 0xffffffff)) {
System_printf("Using MAC address in flash\n");
/*
* Convert the 24/24 split MAC address from NV ram into a 32/16 split MAC
* address needed to program the hardware registers, then program the MAC
* address into the Ethernet Controller registers.
*/
macAddress[0] = ((ulUser0 >> 0) & 0xff);
macAddress[1] = ((ulUser0 >> 8) & 0xff);
macAddress[2] = ((ulUser0 >> 16) & 0xff);
macAddress[3] = ((ulUser1 >> 0) & 0xff);
macAddress[4] = ((ulUser1 >> 8) & 0xff);
macAddress[5] = ((ulUser1 >> 16) & 0xff);
}
else if (macAddress[0] == 0xff && macAddress[1] == 0xff &&
macAddress[2] == 0xff && macAddress[3] == 0xff &&
macAddress[4] == 0xff && macAddress[5] == 0xff) {
useDefaultMac = true;
//System_abort("Change the macAddress variable to match your boards MAC sticker");
}
//EMACSnow_NIMUInit(NULL);
#ifdef MIKROE_DEV
GPIOPinConfigure(GPIO_PK6_EN0LED1); /* EK_TM4C129EXL_USR_D3 */
GPIOPinConfigure(GPIO_PK5_EN0LED2); /* EK_TM4C129EXL_USR_D4 */
GPIOPinTypeEthernetLED(GPIO_PORTK_BASE, GPIO_PIN_5 | GPIO_PIN_6);
#else
GPIOPinConfigure(GPIO_PF0_EN0LED0); /* EK_TM4C129EXL_USR_D3 */
GPIOPinConfigure(GPIO_PF4_EN0LED1); /* EK_TM4C129EXL_USR_D4 */
GPIOPinTypeEthernetLED(GPIO_PORTF_BASE, GPIO_PIN_0 | GPIO_PIN_4);
#endif
/* Once EMAC_init is called, EMAC_config cannot be changed */
EMAC_init();
}
/*
* =============================== GPIO ===============================
*/
/* Place into subsections to allow the TI linker to remove items properly */
#if defined(__TI_COMPILER_VERSION__)
#pragma DATA_SECTION(GPIOTiva_config, ".const:GPIOTiva_config")
#endif
#include <ti/drivers/GPIO.h>
#include <ti/drivers/gpio/GPIOTiva.h>
/*
* Array of Pin configurations
* NOTE: The order of the pin configurations must coincide with what was
* defined in EK_TM4C129EXL.h
* NOTE: Pins not used for interrupts should be placed at the end of the
* array. Callback entries can be omitted from callbacks array to
* reduce memory usage.
*/
GPIO_PinConfig gpioPinConfigs[] =
#ifdef MIKROE_DEV
{
/* Input pins */
/* EK_TM4C129EXL_USR_SW1 */
GPIOTiva_PA_0 | GPIO_CFG_IN_NOPULL | GPIO_CFG_IN_INT_NONE,
/* EK_TM4C129EXL_USR_SW2 */
GPIOTiva_PA_1 | GPIO_CFG_IN_NOPULL | GPIO_CFG_IN_INT_NONE,
/* Output pins */
/* EK_TM4C129EXL_USR_D1 */
GPIOTiva_PB_0 | GPIO_CFG_OUT_STD | GPIO_CFG_OUT_STR_HIGH | GPIO_CFG_OUT_LOW,
/* EK_TM4C129EXL_USR_D2 */
GPIOTiva_PB_0 | GPIO_CFG_OUT_STD | GPIO_CFG_OUT_STR_HIGH | GPIO_CFG_OUT_LOW,
};
#else
{
/* Input pins */
/* EK_TM4C129EXL_USR_SW1 */
GPIOTiva_PJ_0 | GPIO_CFG_IN_PU | GPIO_CFG_IN_INT_RISING,
/* EK_TM4C129EXL_USR_SW2 */
GPIOTiva_PJ_1 | GPIO_CFG_IN_PU | GPIO_CFG_IN_INT_RISING,
/* Output pins */
/* EK_TM4C129EXL_USR_D1 */
GPIOTiva_PN_1 | GPIO_CFG_OUT_STD | GPIO_CFG_OUT_STR_HIGH | GPIO_CFG_OUT_LOW,
/* EK_TM4C129EXL_USR_D2 */
GPIOTiva_PN_0 | GPIO_CFG_OUT_STD | GPIO_CFG_OUT_STR_HIGH | GPIO_CFG_OUT_LOW,
};
#endif
/*
* Array of callback function pointers
* NOTE: The order of the pin configurations must coincide with what was
* defined in EK_TM4C129EXL.h
* NOTE: Pins not used for interrupts can be omitted from callbacks array to
* reduce memory usage (if placed at end of gpioPinConfigs array).
*/
GPIO_CallbackFxn gpioCallbackFunctions[] = {
NULL, /* EK_TM4C129EXL_USR_SW1 */
NULL /* EK_TM4C129EXL_USR_SW2 */
};
/* The device-specific GPIO_config structure */
const GPIOTiva_Config GPIOTiva_config = {
.pinConfigs = (GPIO_PinConfig *)gpioPinConfigs,
.callbacks = (GPIO_CallbackFxn *)gpioCallbackFunctions,
.numberOfPinConfigs = sizeof(gpioPinConfigs)/sizeof(GPIO_PinConfig),
.numberOfCallbacks = sizeof(gpioCallbackFunctions)/sizeof(GPIO_CallbackFxn),
.intPriority = (~0)
};
/*
* ======== EK_TM4C129EXL_initGPIO ========
*/
void EK_TM4C129EXL_initGPIO(void)
{
/* Initialize peripheral and pins */
GPIO_init();
}
/*
* =============================== I2C ===============================
*/
/* Place into subsections to allow the TI linker to remove items properly */
#if defined(__TI_COMPILER_VERSION__)
#pragma DATA_SECTION(I2C_config, ".const:I2C_config")
#pragma DATA_SECTION(i2cTivaHWAttrs, ".const:i2cTivaHWAttrs")
#endif
#include <ti/drivers/I2C.h>
#include <ti/drivers/i2c/I2CTiva.h>
I2CTiva_Object i2cTivaObjects[EK_TM4C129EXL_I2CCOUNT];
const I2CTiva_HWAttrs i2cTivaHWAttrs[EK_TM4C129EXL_I2CCOUNT] = {
{
.baseAddr = I2C7_BASE,
.intNum = INT_I2C7,
.intPriority = (~0)
},
{
.baseAddr = I2C8_BASE,
.intNum = INT_I2C8,
.intPriority = (~0)
},
};
const I2C_Config I2C_config[] = {
{
.fxnTablePtr = &I2CTiva_fxnTable,
.object = &i2cTivaObjects[0],
.hwAttrs = &i2cTivaHWAttrs[0]
},
{
.fxnTablePtr = &I2CTiva_fxnTable,
.object = &i2cTivaObjects[1],
.hwAttrs = &i2cTivaHWAttrs[1]
},
{NULL, NULL, NULL}
};
/*
* ======== EK_TM4C129EXL_initI2C ========
*/
void EK_TM4C129EXL_initI2C(void)
{
/* I2C7 Init */
/*
* NOTE: TI-RTOS examples configure pins PD0 & PD1 for SSI2 or I2C7. Thus,
* a conflict occurs when the I2C & SPI drivers are used simultaneously in
* an application. Modify the pin mux settings in this file and resolve the
* conflict before running your the application.
*/
/* Enable the peripheral */
SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C7);
/* Configure the appropriate pins to be I2C instead of GPIO. */
GPIOPinConfigure(GPIO_PD0_I2C7SCL);
GPIOPinConfigure(GPIO_PD1_I2C7SDA);
GPIOPinTypeI2CSCL(GPIO_PORTD_BASE, GPIO_PIN_0);
GPIOPinTypeI2C(GPIO_PORTD_BASE, GPIO_PIN_1);
/* I2C8 Init */
/* Enable the peripheral */
SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C8);
/* Configure the appropriate pins to be I2C instead of GPIO. */
GPIOPinConfigure(GPIO_PA2_I2C8SCL);
GPIOPinConfigure(GPIO_PA3_I2C8SDA);
GPIOPinTypeI2CSCL(GPIO_PORTA_BASE, GPIO_PIN_2);
GPIOPinTypeI2C(GPIO_PORTA_BASE, GPIO_PIN_3);
I2C_init();
}
/*
* =============================== PWM ===============================
*/
/* Place into subsections to allow the TI linker to remove items properly */
#if defined(__TI_COMPILER_VERSION__)
#pragma DATA_SECTION(PWM_config, ".const:PWM_config")
#pragma DATA_SECTION(pwmTivaHWAttrs, ".const:pwmTivaHWAttrs")
#endif
#include <ti/drivers/PWM.h>
#include <ti/drivers/pwm/PWMTiva.h>
PWMTiva_Object pwmTivaObjects[EK_TM4C129EXL_PWMCOUNT];
const PWMTiva_HWAttrs pwmTivaHWAttrs[EK_TM4C129EXL_PWMCOUNT] = {
{
.baseAddr = PWM0_BASE,
.pwmOutput = PWM_OUT_0,
.pwmGenOpts = PWM_GEN_MODE_DOWN | PWM_GEN_MODE_DBG_RUN
}
};
const PWM_Config PWM_config[] = {
{
.fxnTablePtr = &PWMTiva_fxnTable,
.object = &pwmTivaObjects[0],
.hwAttrs = &pwmTivaHWAttrs[0]
},
{NULL, NULL, NULL}
};
/*
* ======== EK_TM4C129EXL_initPWM ========
*/
void EK_TM4C129EXL_initPWM(void)
{
/* Enable PWM peripherals */
SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM0);
/*
* Enable PWM output on GPIO pins. PWM output is connected to an Ethernet
* LED on the development board (D4). The PWM configuration
* below will disable Ethernet functionality.
*/
GPIOPinConfigure(GPIO_PF0_M0PWM0);
GPIOPinTypePWM(GPIO_PORTF_BASE, GPIO_PIN_0);
PWM_init();
}
/*
* =============================== SDSPI ===============================
*/
/* Place into subsections to allow the TI linker to remove items properly */
#if defined(__TI_COMPILER_VERSION__)
#pragma DATA_SECTION(SDSPI_config, ".const:SDSPI_config")
#pragma DATA_SECTION(sdspiTivaHWattrs, ".const:sdspiTivaHWattrs")
#endif
#include <ti/drivers/SDSPI.h>
#include <ti/drivers/sdspi/SDSPITiva.h>
SDSPITiva_Object sdspiTivaObjects[EK_TM4C129EXL_SDSPICOUNT];
const SDSPITiva_HWAttrs sdspiTivaHWattrs[EK_TM4C129EXL_SDSPICOUNT] = {
{
.baseAddr = SSI2_BASE,
.portSCK = GPIO_PORTD_BASE,
.pinSCK = GPIO_PIN_3,
.portMISO = GPIO_PORTD_BASE,
.pinMISO = GPIO_PIN_0,
.portMOSI = GPIO_PORTD_BASE,
.pinMOSI = GPIO_PIN_1,
.portCS = GPIO_PORTC_BASE,
.pinCS = GPIO_PIN_7,
},
{
.baseAddr = SSI3_BASE,
.portSCK = GPIO_PORTQ_BASE,
.pinSCK = GPIO_PIN_0,
.portMISO = GPIO_PORTQ_BASE,
.pinMISO = GPIO_PIN_3,
.portMOSI = GPIO_PORTQ_BASE,
.pinMOSI = GPIO_PIN_2,
.portCS = GPIO_PORTP_BASE,
.pinCS = GPIO_PIN_4,
}
};
const SDSPI_Config SDSPI_config[] = {
{
.fxnTablePtr = &SDSPITiva_fxnTable,
.object = &sdspiTivaObjects[0],
.hwAttrs = &sdspiTivaHWattrs[0]
},
{
.fxnTablePtr = &SDSPITiva_fxnTable,
.object = &sdspiTivaObjects[1],
.hwAttrs = &sdspiTivaHWattrs[1]
},
{NULL, NULL, NULL}
};
/*
* ======== EK_TM4C129EXL_initSDSPI ========
*/
void EK_TM4C129EXL_initSDSPI(void)
{
/* SDSPI0 configuration */
/* Enable the peripherals used by the SD Card */
SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI2);
/* Configure pad settings */
GPIOPadConfigSet(GPIO_PORTD_BASE,
GPIO_PIN_3 | GPIO_PIN_1,
GPIO_STRENGTH_4MA, GPIO_PIN_TYPE_STD);
GPIOPadConfigSet(GPIO_PORTD_BASE,
GPIO_PIN_0,
GPIO_STRENGTH_4MA, GPIO_PIN_TYPE_STD_WPU);
GPIOPadConfigSet(GPIO_PORTC_BASE,
GPIO_PIN_7,
GPIO_STRENGTH_4MA, GPIO_PIN_TYPE_STD);
GPIOPinConfigure(GPIO_PD3_SSI2CLK);
GPIOPinConfigure(GPIO_PD0_SSI2XDAT1);
GPIOPinConfigure(GPIO_PD1_SSI2XDAT0);
/* SDSPI1 configuration */
/* Enable the peripherals used by the SD Card */
SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI3);
/* Configure pad settings */
GPIOPadConfigSet(GPIO_PORTQ_BASE,
GPIO_PIN_0 | GPIO_PIN_2,
GPIO_STRENGTH_4MA, GPIO_PIN_TYPE_STD);
GPIOPadConfigSet(GPIO_PORTQ_BASE,
GPIO_PIN_3,
GPIO_STRENGTH_4MA, GPIO_PIN_TYPE_STD_WPU);
GPIOPadConfigSet(GPIO_PORTP_BASE,
GPIO_PIN_4,
GPIO_STRENGTH_4MA, GPIO_PIN_TYPE_STD);
GPIOPinConfigure(GPIO_PQ0_SSI3CLK);
GPIOPinConfigure(GPIO_PQ3_SSI3XDAT1);
GPIOPinConfigure(GPIO_PQ2_SSI3XDAT0);
/*
* These GPIOs are connected to PA2 and PA3 and need to be brought into a
* GPIO input state so they don't interfere with SPI communications.
*/
GPIOPinTypeGPIOInput(GPIO_PORTA_BASE, GPIO_PIN_2);
GPIOPinTypeGPIOInput(GPIO_PORTA_BASE, GPIO_PIN_3);
SDSPI_init();
}
/*
* =============================== SPI ===============================
*/
/* Place into subsections to allow the TI linker to remove items properly */
#if defined(__TI_COMPILER_VERSION__)
#pragma DATA_SECTION(SPI_config, ".const:SPI_config")
#pragma DATA_SECTION(spiTivaDMAHWAttrs, ".const:spiTivaDMAHWAttrs")
#endif
#include <ti/drivers/SPI.h>
#include <ti/drivers/spi/SPITivaDMA.h>
SPITivaDMA_Object spiTivaDMAObjects[EK_TM4C129EXL_SPICOUNT];
#if defined(__TI_COMPILER_VERSION__)
#pragma DATA_ALIGN(spiTivaDMAscratchBuf, 32)
#elif defined(__IAR_SYSTEMS_ICC__)
#pragma data_alignment=32
#elif defined(__GNUC__)
__attribute__ ((aligned (32)))
#endif
uint32_t spiTivaDMAscratchBuf[EK_TM4C129EXL_SPICOUNT];
const SPITivaDMA_HWAttrs spiTivaDMAHWAttrs[EK_TM4C129EXL_SPICOUNT] = {
{
.baseAddr = SSI2_BASE,
.intNum = INT_SSI2,
.intPriority = (~0),
.scratchBufPtr = &spiTivaDMAscratchBuf[0],
.defaultTxBufValue = 0,
.rxChannelIndex = UDMA_SEC_CHANNEL_UART2RX_12,
.txChannelIndex = UDMA_SEC_CHANNEL_UART2TX_13,
.channelMappingFxn = uDMAChannelAssign,
.rxChannelMappingFxnArg = UDMA_CH12_SSI2RX,
.txChannelMappingFxnArg = UDMA_CH13_SSI2TX
},
{
.baseAddr = SSI3_BASE,
.intNum = INT_SSI3,
.intPriority = (~0),
.scratchBufPtr = &spiTivaDMAscratchBuf[1],
.defaultTxBufValue = 0,
.rxChannelIndex = UDMA_SEC_CHANNEL_TMR2A_14,
.txChannelIndex = UDMA_SEC_CHANNEL_TMR2B_15,
.channelMappingFxn = uDMAChannelAssign,
.rxChannelMappingFxnArg = UDMA_CH14_SSI3RX,
.txChannelMappingFxnArg = UDMA_CH15_SSI3TX
}
};
const SPI_Config SPI_config[] = {
{
.fxnTablePtr = &SPITivaDMA_fxnTable,
.object = &spiTivaDMAObjects[0],
.hwAttrs = &spiTivaDMAHWAttrs[0]
},
{
.fxnTablePtr = &SPITivaDMA_fxnTable,
.object = &spiTivaDMAObjects[1],
.hwAttrs = &spiTivaDMAHWAttrs[1]
},
{NULL, NULL, NULL}
};
/*
* ======== EK_TM4C129EXL_initSPI ========
*/
void EK_TM4C129EXL_initSPI(void)
{
/* SSI2 */
/*
* NOTE: TI-RTOS examples configure pins PD0 & PD1 for SSI2 or I2C7. Thus,
* a conflict occurs when the I2C & SPI drivers are used simultaneously in
* an application. Modify the pin mux settings in this file and resolve the
* conflict before running your the application.
*/
SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI2);
GPIOPinConfigure(GPIO_PD3_SSI2CLK);
GPIOPinConfigure(GPIO_PD2_SSI2FSS);
GPIOPinConfigure(GPIO_PD1_SSI2XDAT0);
GPIOPinConfigure(GPIO_PD0_SSI2XDAT1);
GPIOPinTypeSSI(GPIO_PORTD_BASE, GPIO_PIN_0 | GPIO_PIN_1 |
GPIO_PIN_2 | GPIO_PIN_3);
/* SSI3 */
SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI3);
GPIOPinConfigure(GPIO_PQ0_SSI3CLK);
GPIOPinConfigure(GPIO_PQ1_SSI3FSS);
GPIOPinConfigure(GPIO_PQ2_SSI3XDAT0);
GPIOPinConfigure(GPIO_PQ3_SSI3XDAT1);
GPIOPinTypeSSI(GPIO_PORTQ_BASE, GPIO_PIN_0 | GPIO_PIN_1 |
GPIO_PIN_2 | GPIO_PIN_3);
EK_TM4C129EXL_initDMA();
SPI_init();
}
/*
* =============================== UART ===============================
*/
/* Place into subsections to allow the TI linker to remove items properly */
#if defined(__TI_COMPILER_VERSION__)
#pragma DATA_SECTION(UART_config, ".const:UART_config")
#pragma DATA_SECTION(uartTivaHWAttrs, ".const:uartTivaHWAttrs")
#endif
#include <ti/drivers/UART.h>
#if TI_DRIVERS_UART_DMA
#include <ti/drivers/uart/UARTTivaDMA.h>
UARTTivaDMA_Object uartTivaObjects[EK_TM4C129EXL_UARTCOUNT];
const UARTTivaDMA_HWAttrs uartTivaHWAttrs[EK_TM4C129EXL_UARTCOUNT] = {
{
.baseAddr = UART0_BASE,
.intNum = INT_UART0,
.intPriority = (~0),
.rxChannelIndex = UDMA_CH8_UART0RX,
.txChannelIndex = UDMA_CH9_UART0TX,
}
#ifdef MIKROE_DEV
,
{
.baseAddr = UART1_BASE,
.intNum = INT_UART1,
.intPriority = (~0),
.rxChannelIndex = UDMA_CH8_UART1RX,
.txChannelIndex = UDMA_CH9_UART1TX,
},
{
.baseAddr = UART2_BASE,
.intNum = INT_UART2,
.intPriority = (~0),
.rxChannelIndex = UDMA_CH12_UART2RX,
.txChannelIndex = UDMA_CH13_UART2TX,
},
{
.baseAddr = UART3_BASE,
.intNum = INT_UART3,
.intPriority = (~0),
.rxChannelIndex = UDMA_CH16_UART3RX,
.txChannelIndex = UDMA_CH17_UART3TX,
},
{
.baseAddr = UART4_BASE,
.intNum = INT_UART4,
.intPriority = (~0),
.rxChannelIndex = UDMA_CH18_UART4RX,
.txChannelIndex = UDMA_CH19_UART4TX,
}
#endif
};
const UART_Config UART_config[] = {
{
.fxnTablePtr = &UARTTivaDMA_fxnTable,
.object = &uartTivaObjects[0],
.hwAttrs = &uartTivaHWAttrs[0]
},
#ifdef MIKROE_DEV
{
.fxnTablePtr = &UARTTivaDMA_fxnTable,
.object = &uartTivaObjects[1],
.hwAttrs = &uartTivaHWAttrs[1]
},
{
.fxnTablePtr = &UARTTivaDMA_fxnTable,
.object = &uartTivaObjects[2],
.hwAttrs = &uartTivaHWAttrs[2]
},
{
.fxnTablePtr = &UARTTivaDMA_fxnTable,
.object = &uartTivaObjects[3],
.hwAttrs = &uartTivaHWAttrs[3]
},
{
.fxnTablePtr = &UARTTivaDMA_fxnTable,
.object = &uartTivaObjects[4],
.hwAttrs = &uartTivaHWAttrs[4]
},
#endif
{NULL, NULL, NULL}
};
#else
#include <ti/drivers/uart/UARTTiva.h>
UARTTiva_Object uartTivaObjects[EK_TM4C129EXL_UARTCOUNT];
unsigned char uartTivaRingBuffer[EK_TM4C129EXL_UARTCOUNT][32];
/* UART configuration structure */
const UARTTiva_HWAttrs uartTivaHWAttrs[EK_TM4C129EXL_UARTCOUNT] =
{
{
.baseAddr = UART0_BASE,
.intNum = INT_UART0,
.intPriority = (~0),
.flowControl = UART_FLOWCONTROL_NONE,
.ringBufPtr = uartTivaRingBuffer[0],
.ringBufSize = sizeof(uartTivaRingBuffer[0])
}
#ifdef MIKROE_DEV
,
{
.baseAddr = UART1_BASE,
.intNum = INT_UART1,
.intPriority = (~0),
.flowControl = UART_FLOWCONTROL_NONE,
.ringBufPtr = uartTivaRingBuffer[1],
.ringBufSize = sizeof(uartTivaRingBuffer[1])
},
{
.baseAddr = UART2_BASE,
.intNum = INT_UART2,
.intPriority = (~0),
.flowControl = UART_FLOWCONTROL_NONE,
.ringBufPtr = uartTivaRingBuffer[2],
.ringBufSize = sizeof(uartTivaRingBuffer[2])
},
{
.baseAddr = UART3_BASE,
.intNum = INT_UART3,
.intPriority = (~0),
.flowControl = UART_FLOWCONTROL_NONE,
.ringBufPtr = uartTivaRingBuffer[3],
.ringBufSize = sizeof(uartTivaRingBuffer[3])
},
{
.baseAddr = UART4_BASE,
.intNum = INT_UART4,
.intPriority = (~0),
.flowControl = UART_FLOWCONTROL_NONE,
.ringBufPtr = uartTivaRingBuffer[4],
.ringBufSize = sizeof(uartTivaRingBuffer[4])
}
#endif
};
const UART_Config UART_config[EK_TM4C129EXL_UARTCOUNT] = {
{
.fxnTablePtr = &UARTTiva_fxnTable,
.object = &uartTivaObjects[0],
.hwAttrs = &uartTivaHWAttrs[0]
}
#ifndef MIKROE_DEV
,
{NULL, NULL, NULL}
#else
,
{
.fxnTablePtr = &UARTTiva_fxnTable,
.object = &uartTivaObjects[1],
.hwAttrs = &uartTivaHWAttrs[1]
},
{
.fxnTablePtr = &UARTTiva_fxnTable,
.object = &uartTivaObjects[2],
.hwAttrs = &uartTivaHWAttrs[2]
},
{
.fxnTablePtr = &UARTTiva_fxnTable,
.object = &uartTivaObjects[3],
.hwAttrs = &uartTivaHWAttrs[3]
},
{
.fxnTablePtr = &UARTTiva_fxnTable,
.object = &uartTivaObjects[4],
.hwAttrs = &uartTivaHWAttrs[4]
}
#endif
};
#endif /* TI_DRIVERS_UART_DMA */
/*
* ======== EK_TM4C129EXL_initUART ========
*/
void EK_TM4C129EXL_initUART(void)
{
#ifdef MIKROE_DEV
/* Using the mikroBUs 1 port */
/* Enable and configure the peripherals used by the uart. */
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART4);
GPIOPinConfigure(GPIO_PK0_U4RX);
GPIOPinConfigure(GPIO_PK1_U4TX);
GPIOPinTypeUART(GPIO_PORTK_BASE, GPIO_PIN_0 | GPIO_PIN_1);
/* Using the mikroBUs 5 port */
/* Enable and configure the peripherals used by the uart. */
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART2);
GPIOPinConfigure(GPIO_PD4_U2RX);
GPIOPinConfigure(GPIO_PD5_U2TX);
GPIOPinTypeUART(GPIO_PORTD_BASE, GPIO_PIN_4 | GPIO_PIN_5);
#else
/* Enable and configure the peripherals used by the uart. */
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
GPIOPinConfigure(GPIO_PA0_U0RX);
GPIOPinConfigure(GPIO_PA1_U0TX);
GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
#endif
/* Initialize the UART driver */
#if TI_DRIVERS_UART_DMA
EK_TM4C129EXL_initDMA();
#endif
UART_init();
}
/*
* =============================== USB ===============================
*/
/*
* ======== EK_TM4C129EXL_initUSB ========
* This function just turns on the USB
*/
void EK_TM4C129EXL_initUSB(EK_TM4C129EXL_USBMode usbMode)
{
Error_Block eb;
Hwi_Params hwiParams;
/* Enable the USB peripheral and PLL */
SysCtlPeripheralEnable(SYSCTL_PERIPH_USB0);
SysCtlUSBPLLEnable();
/* Setup pins for USB operation */
GPIOPinTypeUSBAnalog(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1);
GPIOPinTypeUSBAnalog(GPIO_PORTL_BASE, GPIO_PIN_6 | GPIO_PIN_7);
/* Additional configurations for Host mode */
if (usbMode == EK_TM4C129EXL_USBHOST) {
/* Configure the pins needed */
HWREG(GPIO_PORTD_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY;
HWREG(GPIO_PORTD_BASE + GPIO_O_CR) = 0xff;
GPIOPinConfigure(GPIO_PD6_USB0EPEN);
GPIOPinTypeUSBDigital(GPIO_PORTD_BASE, GPIO_PIN_6 | GPIO_PIN_7);
/*
* USB bus fault is routed to pin PQ4. We create a Hwi to allow us
* to detect power faults and recover gracefully or terminate the
* program. PQ4 is active low; set the pin as input with a weak
* pull-up.
*/
GPIOPadConfigSet(GPIO_PORTQ_BASE, GPIO_PIN_4,
GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);
GPIOIntTypeSet(GPIO_PORTQ_BASE, GPIO_PIN_4, GPIO_FALLING_EDGE);
GPIOIntClear(GPIO_PORTQ_BASE, GPIO_PIN_4);
/* Create a Hwi for PQ4 pin. */
Error_init(&eb);
Hwi_Params_init(&hwiParams);
Hwi_construct(&(usbBusFaultHwiStruct), INT_GPIOQ4,
EK_TM4C129EXL_usbBusFaultHwi, &hwiParams, &eb);
if (Error_check(&eb)) {
System_abort("Couldn't construct USB bus fault hwi");
}
}
}
/*
* =============================== USBMSCHFatFs ===============================
*/
/* Place into subsections to allow the TI linker to remove items properly */
#if defined(__TI_COMPILER_VERSION__)
#pragma DATA_SECTION(USBMSCHFatFs_config, ".const:USBMSCHFatFs_config")
#pragma DATA_SECTION(usbmschfatfstivaHWAttrs, ".const:usbmschfatfstivaHWAttrs")
#endif
#include <ti/drivers/USBMSCHFatFs.h>
#include <ti/drivers/usbmschfatfs/USBMSCHFatFsTiva.h>
USBMSCHFatFsTiva_Object usbmschfatfstivaObjects[EK_TM4C129EXL_USBMSCHFatFsCOUNT];
const USBMSCHFatFsTiva_HWAttrs usbmschfatfstivaHWAttrs[EK_TM4C129EXL_USBMSCHFatFsCOUNT] = {
{
.intNum = INT_USB0,
.intPriority = (~0)
}
};
const USBMSCHFatFs_Config USBMSCHFatFs_config[] = {
{
.fxnTablePtr = &USBMSCHFatFsTiva_fxnTable,
.object = &usbmschfatfstivaObjects[0],
.hwAttrs = &usbmschfatfstivaHWAttrs[0]
},
{NULL, NULL, NULL}
};
/*
* ======== EK_TM4C129EXL_initUSBMSCHFatFs ========
*/
void EK_TM4C129EXL_initUSBMSCHFatFs(void)
{
/* Initialize the DMA control table */
EK_TM4C129EXL_initDMA();
/* Call the USB initialization function for the USB Reference modules */
EK_TM4C129EXL_initUSB(EK_TM4C129EXL_USBHOST);
USBMSCHFatFs_init();
}
/*
* =============================== Watchdog ===============================
*/
/* Place into subsections to allow the TI linker to remove items properly */
#if defined(__TI_COMPILER_VERSION__)
#pragma DATA_SECTION(Watchdog_config, ".const:Watchdog_config")
#pragma DATA_SECTION(watchdogTivaHWAttrs, ".const:watchdogTivaHWAttrs")
#endif
#include <ti/drivers/Watchdog.h>
#include <ti/drivers/watchdog/WatchdogTiva.h>
WatchdogTiva_Object watchdogTivaObjects[EK_TM4C129EXL_WATCHDOGCOUNT];
const WatchdogTiva_HWAttrs watchdogTivaHWAttrs[EK_TM4C129EXL_WATCHDOGCOUNT] = {
{
.baseAddr = WATCHDOG0_BASE,
.intNum = INT_WATCHDOG,
.intPriority = (~0),
.reloadValue = 80000000 // 1 second period at default CPU clock freq
},
};
const Watchdog_Config Watchdog_config[] = {
{
.fxnTablePtr = &WatchdogTiva_fxnTable,
.object = &watchdogTivaObjects[0],
.hwAttrs = &watchdogTivaHWAttrs[0]
},
{NULL, NULL, NULL},
};
/*
* ======== EK_TM4C129EXL_initWatchdog ========
*
* NOTE: To use the other watchdog timer with base address WATCHDOG1_BASE,
* an additional function call may need be made to enable PIOSC. Enabling
* WDOG1 does not do this. Enabling another peripheral that uses PIOSC
* such as ADC0 or SSI0, however, will do so. Example:
*
* SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);
* SysCtlPeripheralEnable(SYSCTL_PERIPH_WDOG1);
*
* See the following forum post for more information:
* http://e2e.ti.com/support/microcontrollers/stellaris_arm_cortex-m3_microcontroller/f/471/p/176487/654390.aspx#654390
*/
void EK_TM4C129EXL_initWatchdog(void)
{
/* Enable peripherals used by Watchdog */
SysCtlPeripheralEnable(SYSCTL_PERIPH_WDOG0);
Watchdog_init();
}
/*
* =============================== WiFi ===============================
*/
/* Place into subsections to allow the TI linker to remove items properly */
#if defined(__TI_COMPILER_VERSION__)
#pragma DATA_SECTION(WiFi_config, ".const:WiFi_config")
#pragma DATA_SECTION(wiFiCC3100HWAttrs, ".const:wiFiCC3100HWAttrs")
#endif
#include <ti/drivers/WiFi.h>
#include <ti/drivers/wifi/WiFiCC3100.h>
WiFiCC3100_Object wiFiCC3100Objects[EK_TM4C129EXL_WIFICOUNT];
const WiFiCC3100_HWAttrs wiFiCC3100HWAttrs[EK_TM4C129EXL_WIFICOUNT] = {
{
.irqPort = GPIO_PORTM_BASE,
.irqPin = GPIO_PIN_3,
.irqIntNum = INT_GPIOM,
.csPort = GPIO_PORTH_BASE,
.csPin = GPIO_PIN_2,
.enPort = GPIO_PORTC_BASE,
.enPin = GPIO_PIN_6
}
};
const WiFi_Config WiFi_config[] = {
{
.fxnTablePtr = &WiFiCC3100_fxnTable,
.object = &wiFiCC3100Objects[0],
.hwAttrs = &wiFiCC3100HWAttrs[0]
},
{NULL,NULL, NULL},
};
/*
* ======== EK_TM4C129EXL_initWiFi ========
*/
void EK_TM4C129EXL_initWiFi(void)
{
/* Configure EN & CS pins to disable CC3100 */
GPIOPinTypeGPIOOutput(GPIO_PORTH_BASE, GPIO_PIN_2);
GPIOPinTypeGPIOOutput(GPIO_PORTC_BASE, GPIO_PIN_6);
GPIOPinWrite(GPIO_PORTH_BASE, GPIO_PIN_2, GPIO_PIN_2);
GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_6, 0);
/* Configure SSI2 for CC3100 */
SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI2);
GPIOPinConfigure(GPIO_PD3_SSI2CLK);
GPIOPinConfigure(GPIO_PD1_SSI2XDAT0);
GPIOPinConfigure(GPIO_PD0_SSI2XDAT1);
GPIOPinTypeSSI(GPIO_PORTD_BASE, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_3);
/* Configure IRQ pin */
GPIOPinTypeGPIOInput(GPIO_PORTM_BASE, GPIO_PIN_3);
GPIOPadConfigSet(GPIO_PORTM_BASE, GPIO_PIN_3, GPIO_STRENGTH_2MA,
GPIO_PIN_TYPE_STD_WPD);
GPIOIntTypeSet(GPIO_PORTM_BASE, GPIO_PIN_3, GPIO_RISING_EDGE);
SPI_init();
EK_TM4C129EXL_initDMA();
WiFi_init();
}
