From e018ceebed74b8223482bc9d1ed0b31c938381da Mon Sep 17 00:00:00 2001 From: Yuval Adam Date: Mon, 29 Oct 2012 23:04:19 +0200 Subject: New example files --- boards/ek-lm4f120xl-boost-olimex-8x8/faces/faces.c | 328 +++++++++++++++++++++ 1 file changed, 328 insertions(+) create mode 100644 boards/ek-lm4f120xl-boost-olimex-8x8/faces/faces.c (limited to 'boards/ek-lm4f120xl-boost-olimex-8x8/faces/faces.c') diff --git a/boards/ek-lm4f120xl-boost-olimex-8x8/faces/faces.c b/boards/ek-lm4f120xl-boost-olimex-8x8/faces/faces.c new file mode 100644 index 0000000..1ff3596 --- /dev/null +++ b/boards/ek-lm4f120xl-boost-olimex-8x8/faces/faces.c @@ -0,0 +1,328 @@ +//***************************************************************************** +// +// olimex_led.c - Simple olimex_led world example. +// +// Copyright (c) 2012 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 9453 of the EK-LM4F120XL Firmware Package. +// +//***************************************************************************** + +#include +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "driverlib/debug.h" +#include "driverlib/fpu.h" +#include "driverlib/gpio.h" +#include "driverlib/pin_map.h" +#include "driverlib/rom.h" +#include "driverlib/sysctl.h" +#include "driverlib/systick.h" +#include "utils/softssi.h" +#include "utils/uartstdio.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

olimex_led World (olimex_led)

+//! +//! A very simple ``hello world'' example. It simply displays ``Hello World!'' +//! on the UART and is a starting point for more complicated applications. +//! +//! UART0, connected to the Stellaris Virtual Serial Port and running at +//! 115,200, 8-N-1, is used to display messages from this application. +//! +//! Displays a series of faces on the LED matrix. +// +//***************************************************************************** + + +//***************************************************************************** +// +// The error routine that is called if the driver library encounters an error. +// +//***************************************************************************** +#ifdef DEBUG +void +__error__(char *pcFilename, unsigned long ulLine) +{ +} +#endif + +//***************************************************************************** +// +// Number of bytes to send and receive. +// +//***************************************************************************** +#define NUM_SSI_DATA 8 + +//***************************************************************************** +// +// The persistent state of the SoftSSI peripheral. +// +//***************************************************************************** +tSoftSSI g_sSoftSSI; + +//***************************************************************************** +// +// The data buffer that is used as the transmit FIFO. The size of this buffer +// can be increased or decreased as required to match the transmit buffering +// requirements of your application. +// +//***************************************************************************** +unsigned short g_pusTxBuffer[16]; + +//***************************************************************************** +// +// The data buffer that is used as the receive FIFO. The size of this buffer +// can be increased or decreased as required to match the receive buffering +// requirements of your application. +// +//***************************************************************************** +unsigned short g_pusRxBuffer[16]; + +//***************************************************************************** +// +// Index control variable to cycle through faces. +// +//***************************************************************************** +volatile unsigned long g_ulFaceIndex; + +//***************************************************************************** +// +// Matrices that correspond to faces on the LED display. +// +//***************************************************************************** +#define NONE 0 +#define LAUGH 1 +#define HAPPY 2 +#define SMILE 3 +#define ANGRY 4 +#define NUM_FACES 5 + +const unsigned char g_ucFaces[NUM_FACES][8] = + { + {0x03, 0x03, 0x40, 0x4E, 0x4E, 0x40, 0x03, 0x03}, + {0x43, 0xC3, 0xC0, 0xCE, 0xCE, 0xC0, 0xC3, 0x43}, + {0x66, 0x86, 0x80, 0x9C, 0x9C, 0x80, 0x86, 0x66}, + {0x46, 0x86, 0x80, 0x9C, 0x9C, 0x80, 0x86, 0x46}, + {0x86, 0x46, 0x40, 0x5C, 0x5C, 0x40, 0x46, 0x86} + }; + +//***************************************************************************** +// +// Bit-wise reverses a number. +// +//***************************************************************************** +unsigned char +Reverse(unsigned char ucNumber) +{ + unsigned short ucIndex; + unsigned short ucReversedNumber = 0; + for(ucIndex=0; ucIndex<8; ucIndex++) + { + ucReversedNumber = ucReversedNumber << 1; + ucReversedNumber |= ((1 << ucIndex) & ucNumber) >> ucIndex; + } + return ucReversedNumber; +} + +//***************************************************************************** +// +// The interrupt handler for the SysTick interrupt. +// +//***************************************************************************** +void +SysTickIntHandler(void) +{ + static unsigned long ulTickCounter; + // + // Call the SoftSSI timer tick. + // + SoftSSITimerTick(&g_sSoftSSI); + + // + // Keep track of ticks and scroll through the faces in the array + // + ulTickCounter++; + if(ulTickCounter > 10000) + { + ulTickCounter = 0; + g_ulFaceIndex++; + if(g_ulFaceIndex >= NUM_FACES) + { + g_ulFaceIndex = 0; + } + } +} + +//***************************************************************************** +// +// Print a graphic on the 8x8 LED screen. +// +//***************************************************************************** +void +PrintByteArray(const unsigned char * pucBytes) +{ + unsigned long ulIndex; + unsigned long ulData; + + // + // Display indication that the SoftSSI is transmitting data. + // + UARTprintf("\n\nSent:\n "); + + // + // Send the 8 bytes of data. + // + for(ulIndex = 0; ulIndex < NUM_SSI_DATA; ulIndex++) + { + ulData = (Reverse(pucBytes[ulIndex]) << 8) + (1 << ulIndex); + + // + // Display the data that SSI is transferring. + // + UARTprintf("'%x' ", ulData); + + // + // Send the data using the "blocking" put function. This function + // will wait until there is room in the send FIFO before returning. + // This allows you to assure that all the data you send makes it + // into the send FIFO. + // + SoftSSIDataPut(&g_sSoftSSI, ulData); + + // + // Wait until SoftSSI is done transferring all the data in the + // transmit FIFO. + // + while(SoftSSIBusy(&g_sSoftSSI)) + { + } + + // + // Raise the clear signal to show the new value. + // + GPIOPinWrite(GPIO_PORTE_BASE, GPIO_PIN_5, GPIO_PIN_5); + SysCtlDelay(100); + // + // Clear the Shift Register + // + GPIOPinWrite(GPIO_PORTE_BASE, GPIO_PIN_5, 0); + + } +} + + +//***************************************************************************** +// +// Print "Hello World!" to the UART on the Stellaris evaluation board. +// +//***************************************************************************** +int +main(void) +{ + + // Enable lazy stacking for interrupt handlers. This allows floating-point + // instructions to be used within interrupt handlers, but at the expense of + // extra stack usage. + // + ROM_FPUEnable(); + ROM_FPULazyStackingEnable(); + + // + // Set the clocking to run directly from the crystal. + // + ROM_SysCtlClockSet(SYSCTL_SYSDIV_5 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ | + SYSCTL_OSC_MAIN); + + // + // Initialize the UART. + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + ROM_GPIOPinConfigure(GPIO_PA0_U0RX); + ROM_GPIOPinConfigure(GPIO_PA1_U0TX); + ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); + UARTStdioInit(0); + + // + // Hello! + // + UARTprintf("Hello, world!\n"); + + // + // Initialize the GPIOs we will need for communication with the LED Matrix + // + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE); + + // + // Initialize the clear signal + // + GPIOPinTypeGPIOOutput(GPIO_PORTE_BASE, GPIO_PIN_5); + GPIOPinWrite(GPIO_PORTE_BASE, GPIO_PIN_5, 0); + + // + // Configure the SoftSSI module. The size of the FIFO buffers can be + // changed to accommodate the requirements of your application. The GPIO + // pins utilized can also be changed. + // The pins are assigned as follows: + // PB4 - SoftSSICLK + // PB6 - SoftSSITx + // + memset(&g_sSoftSSI, 0, sizeof(g_sSoftSSI)); + SoftSSIClkGPIOSet(&g_sSoftSSI, GPIO_PORTB_BASE, GPIO_PIN_4); + SoftSSITxGPIOSet(&g_sSoftSSI, GPIO_PORTB_BASE, GPIO_PIN_6); + SoftSSIRxBufferSet(&g_sSoftSSI, g_pusRxBuffer, + sizeof(g_pusRxBuffer) / sizeof(g_pusRxBuffer[0])); + SoftSSITxBufferSet(&g_sSoftSSI, g_pusTxBuffer, + sizeof(g_pusTxBuffer) / sizeof(g_pusTxBuffer[0])); + + // + // Configure the SoftSSI module. Use idle clock level low and active low + // clock (mode 0) and 8-bit data. You can set the polarity of the SoftSSI + // clock when the SoftSSI module is idle. You can also configure what + // clock edge you want to capture data on. Please reference the datasheet + // for more information on the different SPI modes. + // + SoftSSIConfigSet(&g_sSoftSSI, SOFTSSI_FRF_MOTO_MODE_0, 16); + + // + // Enable the SoftSSI module. + // + SoftSSIEnable(&g_sSoftSSI); + + // + // Configure SysTick to provide an interrupt at a 10 KHz rate. This is + // used to control the clock rate of the SoftSSI module; the clock rate of + // the SoftSSI Clk signal will be 1/2 the interrupt rate. + // + SysTickPeriodSet(SysCtlClockGet() / 20000); + SysTickIntEnable(); + SysTickEnable(); + + while(1) + { + // + // Cycle through all available faces... + // Face index updated inside the SysTickIntHandler. + // + PrintByteArray(g_ucFaces[g_ulFaceIndex]); + + } + +} -- cgit v1.3.1