123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284 |
- /*
- * @brief NXP LPCXpresso LPC824 board file
- *
- * @note
- * Copyright(C) NXP Semiconductors, 2013
- * All rights reserved.
- *
- * @par
- * Software that is described herein is for illustrative purposes only
- * which provides customers with programming information regarding the
- * LPC products. This software is supplied "AS IS" without any warranties of
- * any kind, and NXP Semiconductors and its licensor disclaim any and
- * all warranties, express or implied, including all implied warranties of
- * merchantability, fitness for a particular purpose and non-infringement of
- * intellectual property rights. NXP Semiconductors assumes no responsibility
- * or liability for the use of the software, conveys no license or rights under any
- * patent, copyright, mask work right, or any other intellectual property rights in
- * or to any products. NXP Semiconductors reserves the right to make changes
- * in the software without notification. NXP Semiconductors also makes no
- * representation or warranty that such application will be suitable for the
- * specified use without further testing or modification.
- *
- * @par
- * Permission to use, copy, modify, and distribute this software and its
- * documentation is hereby granted, under NXP Semiconductors' and its
- * licensor's relevant copyrights in the software, without fee, provided that it
- * is used in conjunction with NXP Semiconductors microcontrollers. This
- * copyright, permission, and disclaimer notice must appear in all copies of
- * this code.
- */
-
- // Must define _BOARD_C_ before ANY include
- #define _BOARD_C_
- #include "board_lpc.h"
- #include "string.h"
- #include <stdint.h>
- /*****************************************************************************
- * Private types/enumerations/variables
- ****************************************************************************/
- #define BOARD_LED_CNT 8
- /*****************************************************************************
- * Public types/enumerations/variables
- ****************************************************************************/
- /* System oscillator rate and clock rate on the CLKIN pin */
- const uint32_t OscRateIn = MAIN_OSC_XTAL_FREQ_HZ;
- const uint32_t ExtRateIn = EXT_CLOCK_IN_FREQ_HZ;
- /*****************************************************************************
- * Private functions
- ****************************************************************************/
- static void Board_Key_Init(void)
- {
- int i;
- LPC_IOCON_T *pIOCON = LPC_IOCON;
- for (i = 0; i < BOARD_KEY_CNT; i++) {
- Chip_GPIO_PinSetDIR(LPC_GPIO_PORT, 0, cs_keyBits[i], 0);
- pIOCON->PIO0[cs_keyIoConNdce[i]] = 0x80; // weak pUp
- }
- }
- /* Initialize the LEDs on the NXP LPC824 LPCXpresso Board */
- static void Board_LED_Init(void)
- {
- int i;
- for (i = 0; i < BOARD_LED_CNT; i++) {
- Chip_GPIO_PinSetDIR(LPC_GPIO_PORT, 0, ledBits[i], 1);
- Chip_GPIO_PinSetState(LPC_GPIO_PORT, 0, ledBits[i], true);
- }
- }
- uint32_t Board_Key_GetKeyDown(uint32_t keyNdx)
- {
- LPC_GPIO_T *pGP = LPC_GPIO_PORT;
- return pGP->W[0][cs_keyBits[keyNdx]] == 0 ? 1 : 0;
- }
- /* Board Debug UART Initialisation function */
- STATIC void Board_UART_Init(void)
- {
- /* Enable the clock to the Switch Matrix */
- Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_SWM);
- /* Connect the TXD_O and RXD_I signals to port pins(P0.4, P0.0) */
- //Chip_SWM_DisableFixedPin(SWM_FIXED_XTALIN);
- //Chip_SWM_DisableFixedPin(SWM_FIXED_XTALOUT);
-
- Chip_SWM_DisableFixedPin(SWM_FIXED_ACMP_I1);
- Chip_SWM_DisableFixedPin(SWM_FIXED_ADC11);
- /* Enable UART Divider clock, divided by 1 */
- Chip_Clock_SetUARTClockDiv(1);
- /* Divided by 1 */
- if (DEBUG_UART == LPC_USART0) {
- Chip_SWM_MovablePinAssign(SWM_U0_TXD_O, 4);
- Chip_SWM_MovablePinAssign(SWM_U0_RXD_I, 0);
- } else if (DEBUG_UART == LPC_USART1) {
- Chip_SWM_MovablePinAssign(SWM_U1_TXD_O, 4);
- Chip_SWM_MovablePinAssign(SWM_U1_RXD_I, 0);
- } else {
- Chip_SWM_MovablePinAssign(SWM_U2_TXD_O, 4);
- Chip_SWM_MovablePinAssign(SWM_U2_RXD_I, 0);
- }
- /* Disable the clock to the Switch Matrix to save power */
- Chip_Clock_DisablePeriphClock(SYSCTL_CLOCK_SWM);
- }
- /* Initializes pin muxing for SPI1 interface - note that SystemInit() may
- already setup your pin muxing at system startup */
- static void Init_SPI_PinMux(void)
- {
- Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_SWM);
- Chip_SWM_MovablePinAssign(SWM_SPI1_SSEL0_IO, 15);
- Chip_SWM_MovablePinAssign(SWM_SPI1_SCK_IO, 24);
- Chip_SWM_MovablePinAssign(SWM_SPI1_MISO_IO, 25);
- Chip_SWM_MovablePinAssign(SWM_SPI1_MOSI_IO, 26);
- Chip_Clock_DisablePeriphClock(SYSCTL_CLOCK_SWM);
- }
- /* Initializes pin muxing for I2C interface */
- static void Init_I2C_PinMux(void)
- {
- /* Enable the clock to the Switch Matrix */
- Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_SWM);
- Chip_SWM_EnableFixedPin(SWM_FIXED_I2C0_SDA);
- Chip_SWM_EnableFixedPin(SWM_FIXED_I2C0_SCL);
- /* Enable Fast Mode Plus for I2C pins */
- Chip_IOCON_PinSetI2CMode(LPC_IOCON, IOCON_PIO10, PIN_I2CMODE_FASTPLUS);
- Chip_IOCON_PinSetI2CMode(LPC_IOCON, IOCON_PIO11, PIN_I2CMODE_FASTPLUS);
- /* Disable the clock to the Switch Matrix to save power */
- Chip_Clock_DisablePeriphClock(SYSCTL_CLOCK_SWM);
- }
- /*****************************************************************************
- * Public functions
- ****************************************************************************/
- /* Set the LED to the state of "On" */
- void Board_LED_Set(uint8_t LEDNumber, bool On)
- {
- if (LEDNumber < BOARD_LED_CNT) {
- Chip_GPIO_PinSetState(LPC_GPIO_PORT, 0, ledBits[LEDNumber], (bool) !On);
- }
- }
- /* Return the state of LEDNumber */
- bool Board_LED_Test(uint8_t LEDNumber)
- {
- bool state = false;
- if (LEDNumber < BOARD_LED_CNT) {
- state = (bool) !Chip_GPIO_PinGetState(LPC_GPIO_PORT, 0, ledBits[LEDNumber]);
- }
- return state;
- }
- /* Toggles the current state of a board LED */
- void Board_LED_Toggle(uint8_t LEDNumber)
- {
- if (LEDNumber < BOARD_LED_CNT) {
- Chip_GPIO_PinToggleState(LPC_GPIO_PORT, 0, ledBits[LEDNumber]);
- }
- }
- /* Classic implementation of itoa -- integer to ASCII */
- char *Board_itoa(int value, char *result, int base)
- {
- char* ptr = result, *ptr1 = result, tmp_char;
- int tmp_value;
- if (base < 2 || base > 36) { *result = '\0'; return result; }
- do {
- tmp_value = value;
- value /= base;
- *ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz" [35 + (tmp_value - value * base)];
- } while ( value );
- if (tmp_value < 0) *ptr++ = '-';
- *ptr-- = '\0';
- while (ptr1 < ptr) {
- tmp_char = *ptr;
- *ptr--= *ptr1;
- *ptr1++ = tmp_char;
- }
- return result;
- }
- /* Sends a character on the UART */
- void Board_UARTPutChar(char ch)
- {
- #if defined(DEBUG_UART)
- Chip_UART_SendBlocking(DEBUG_UART, &ch, 1);
- #endif
- }
- void Board_UARTPutTextChar(char ch)
- {
- #if defined(DEBUG_UART)
- static char prevChar = 0;
- if (ch == '\n' && prevChar != '\r')
- {
- prevChar = '\r';
- Chip_UART_SendBlocking(DEBUG_UART, &prevChar, 1);
- Chip_UART_SendBlocking(DEBUG_UART, &ch, 1);
- } else {
- Chip_UART_SendBlocking(DEBUG_UART, &ch, 1);
- prevChar = ch;
- }
- #endif
- }
- /* Gets a character from the UART, returns EOF if no character is ready */
- int Board_UARTGetChar(void)
- {
- #if defined(DEBUG_UART)
- uint8_t data;
- if (Chip_UART_ReadBlocking(DEBUG_UART, &data, 1) == 1) {
- Board_UARTPutChar(data); // echo back the char
- return (int) data;
- }
- #endif
- return EOF;
- }
- /* Outputs a string on the debug UART */
- void Board_UARTPutSTR(const char *str)
- {
- #if defined(DEBUG_UART)
- while (*str != '\0') {
- Board_UARTPutTextChar(*str++);
- }
- #endif
- }
- /* Initialize debug output via UART for board */
- void Board_Debug_Init(void)
- {
- #if defined(DEBUG_UART)
- Board_UART_Init();
- Chip_UART_Init(DEBUG_UART);
- Chip_UART_ConfigData(DEBUG_UART, UART_CFG_DATALEN_8 | UART_CFG_PARITY_NONE | UART_CFG_STOPLEN_1);
- Chip_Clock_SetUSARTNBaseClockRate((115200 * 6 * 16), true);
- Chip_UART_SetBaud(DEBUG_UART, 115200);
- Chip_UART_Enable(DEBUG_UART);
- Chip_UART_TXEnable(DEBUG_UART);
- #endif
- }
- /* Set up and initialize all required blocks and functions related to the
- board hardware */
- void Board_Init(void)
- {
- LPC_SWM_T *pSWM = LPC_SWM;
- /* Sets up DEBUG UART */
- #if defined(DEBUG_ENABLE)
- DEBUGINIT();
- //pSWM->PINENABLE0 |= ~(1UL<<SWM_FIXED_SWCLK | 1UL<<SWM_FIXED_SWDIO | 1UL<<SWM_FIXED_RST);
- #ifdef USE_IRC_AS_ROOT_CLOCK
- pSWM->PINENABLE0 |= 1UL<<SWM_FIXED_XTALIN | 1UL<<SWM_FIXED_XTALOUT;
- #endif
- #endif
- /* Initialize GPIO */
- Chip_GPIO_Init(LPC_GPIO_PORT);
- /* Initialize the LEDs */
- Board_LED_Init();
- //Board_Key_Init();
- Init_SPI_PinMux();
- Init_I2C_PinMux();
- }
|