From 35333900cb7950451d0edee2a5fb90a49f3f0d64 Mon Sep 17 00:00:00 2001 From: Kevin Townsend Date: Fri, 4 Nov 2011 22:27:22 +0100 Subject: [PATCH] See changelog --- ChangeLog.txt | 6 + Makefile | 17 ++- build/codelite/LPC1343 Workspace.tags | Bin 438272 -> 0 bytes .../LPC1343 Workspace.workspace.session | 20 +-- build/codelite/LPC1343_CodeBase.project | 38 ++++- build/crossworks/LPC1343_CodeBase.hzs | 20 ++- drivers/lcd/bitmap/sharpmem/sharpmem.c | 2 +- drivers/spiflash/spiflash.h | 59 ++++++++ drivers/spiflash/w25q16bv/w25q16bv.c | 106 +++++++++++++ main.c | 35 +---- projectconfig.h | 141 +++++++++++++++++- sysinit.c | 23 +-- 12 files changed, 395 insertions(+), 72 deletions(-) delete mode 100644 build/codelite/LPC1343 Workspace.tags diff --git a/ChangeLog.txt b/ChangeLog.txt index 73bb2e2..2eb8825 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -6,6 +6,12 @@ v0.9.8 - Ongoing /tools/examples/spiflash/* - Added write function to SPI Flash driver /drivers/spiflash/* +- Added CFG_BRD_LPC1343_REFDESIGN_MINIMAL as a board + option in projectconfig.h. Tries to keep the flash + use as small as possible by initialising less + peripherals in systemInit(). +- Changed CodeLite project files to support real + debugging with a Segger J-Link and GDB Server. v0.9.5 - 3 August 2011 ====================== diff --git a/Makefile b/Makefile index 3f71b77..78bfbf7 100644 --- a/Makefile +++ b/Makefile @@ -15,6 +15,14 @@ SRAM_USB = 384 VPATH = OBJS = main.o +########################################################################## +# Debug settings +########################################################################## + +# Set DEBUGBUILD to 'TRUE' for full debugging (larger, slower binaries), +# or to 'FALSE' for release builds (smallest, fastest binaries) +DEBUGBUILD = FALSE + ########################################################################## # Project-specific files ########################################################################## @@ -157,9 +165,14 @@ OBJS += $(TARGET)_handlers.o LPC1xxx_startup.o ########################################################################## # Compiler settings, parameters and flags ########################################################################## +ifeq (TRUE,$(DEBUGBUILD)) + CFLAGS = -c -g -O0 $(INCLUDE_PATHS) -Wall -mthumb -ffunction-sections -fdata-sections -fmessage-length=0 -mcpu=$(CPU_TYPE) -DTARGET=$(TARGET) -fno-builtin + ASFLAGS = -c -g -O0 $(INCLUDE_PATHS) -Wall -mthumb -ffunction-sections -fdata-sections -fmessage-length=0 -mcpu=$(CPU_TYPE) -D__ASSEMBLY__ -x assembler-with-cpp +else + CFLAGS = -c -g -Os $(INCLUDE_PATHS) -Wall -mthumb -ffunction-sections -fdata-sections -fmessage-length=0 -mcpu=$(CPU_TYPE) -DTARGET=$(TARGET) -fno-builtin + ASFLAGS = -c -g -Os $(INCLUDE_PATHS) -Wall -mthumb -ffunction-sections -fdata-sections -fmessage-length=0 -mcpu=$(CPU_TYPE) -D__ASSEMBLY__ -x assembler-with-cpp +endif -CFLAGS = -c -g -Os $(INCLUDE_PATHS) -Wall -mthumb -ffunction-sections -fdata-sections -fmessage-length=0 -mcpu=$(CPU_TYPE) -DTARGET=$(TARGET) -fno-builtin -ASFLAGS = -c -g -Os $(INCLUDE_PATHS) -Wall -mthumb -ffunction-sections -fdata-sections -fmessage-length=0 -mcpu=$(CPU_TYPE) -D__ASSEMBLY__ -x assembler-with-cpp LDFLAGS = -nostartfiles -mthumb -mcpu=$(CPU_TYPE) -Wl,--gc-sections LDLIBS = -lm OCFLAGS = --strip-unneeded diff --git a/build/codelite/LPC1343 Workspace.tags b/build/codelite/LPC1343 Workspace.tags deleted file mode 100644 index d64d744330c8e70f8b1a1bf6f6abecc960095337..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 438272 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

FC{pr`tc*#2dc-v-Lkkk0SC1{4D%=-Ty{U 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 diff --git a/build/codelite/LPC1343 Workspace.workspace.session b/build/codelite/LPC1343 Workspace.workspace.session index df01b19..3eb326e 100644 --- a/build/codelite/LPC1343 Workspace.workspace.session +++ b/build/codelite/LPC1343 Workspace.workspace.session @@ -1,24 +1,18 @@ - + - + - - - - - - - - + + - - - + + + diff --git a/build/codelite/LPC1343_CodeBase.project b/build/codelite/LPC1343_CodeBase.project index 96405f8..655a180 100644 --- a/build/codelite/LPC1343_CodeBase.project +++ b/build/codelite/LPC1343_CodeBase.project @@ -302,33 +302,43 @@ - + - - + + + + - # Make sure that we are using SWD + + # Make sure that we are using SWD monitor interface SWD + # Set monitor to little endian monitor endian little + # Set monitor speed monitor speed 1000 + # Reset device monitor reset + # Set device ID to LPC1343 monitor flash device = LPC1343 + # Enable flash download monitor flash download = 1 + # Transfer the firmware to the device load "../../firmware.elf" + # Initializing PC and stack pointer monitor reg r13 = (0x00000000) monitor reg pc = (0x00000004) - - + +monitor reset @@ -346,15 +356,22 @@ monitor reg pc = (0x00000004) + + + + + - + - + + + @@ -375,6 +392,11 @@ monitor reg pc = (0x00000004) + + + + + diff --git a/build/crossworks/LPC1343_CodeBase.hzs b/build/crossworks/LPC1343_CodeBase.hzs index f4373df..d377204 100644 --- a/build/crossworks/LPC1343_CodeBase.hzs +++ b/build/crossworks/LPC1343_CodeBase.hzs @@ -33,6 +33,18 @@ + + + + + + + + + + + + @@ -52,10 +64,10 @@ - - - + + + @@ -68,7 +80,7 @@ - + diff --git a/drivers/lcd/bitmap/sharpmem/sharpmem.c b/drivers/lcd/bitmap/sharpmem/sharpmem.c index dd829e2..545e643 100644 --- a/drivers/lcd/bitmap/sharpmem/sharpmem.c +++ b/drivers/lcd/bitmap/sharpmem/sharpmem.c @@ -328,7 +328,7 @@ void sharpmemRefresh(void) { // Send end of line and address bytes sharpmemSendByte(0x00); - if (currentline < SHARPMEM_LCDHEIGHT) + if (currentline <= SHARPMEM_LCDHEIGHT) { sharpmemSendByte(sharpmemSwap(currentline)); } diff --git a/drivers/spiflash/spiflash.h b/drivers/spiflash/spiflash.h index 0f7e253..f970cdd 100644 --- a/drivers/spiflash/spiflash.h +++ b/drivers/spiflash/spiflash.h @@ -277,4 +277,63 @@ spiflashError_e spiflashEraseChip (void); /**************************************************************************/ spiflashError_e spiflashWritePage (uint32_t address, uint8_t *buffer, uint32_t len); +/**************************************************************************/ +/*! + @brief Writes a continuous stream of data that will automatically + cross page boundaries. + + @note Before writing data, make sure that the appropriate sectors + have been erased, otherwise the data will be meaningless. + + @param[in] address + The 24-bit address where the write will start. + @param[out] *buffer + Pointer to the buffer that will store the read results + @param[in] len + Length of the buffer, within the limits of the starting + address and size of the flash device. + + @section EXAMPLE + + @code + spiflashError_e error; + uint8_t buffer[256]; + + buffer[0] = 0x12; + buffer[1] = 0x34; + buffer[2] = 0x56; + buffer[3] = 0x78; + buffer[4] = 0xDE; + buffer[5] = 0xAD; + buffer[6] = 0xC0; + buffer[7] = 0xDE; + + error = spiflashWrite (0, buffer, 8); + if (error) + { + // Check what went wrong + switch (error) + { + case SPIFLASH_ERROR_ADDROUTOFRANGE: + // Specified starting address is out of range + break; + case SPIFLASH_ERROR_DATAEXCEEDSPAGESIZE: + // Supplied data exceeds max page size + break; + case SPIFLASH_ERROR_PAGEWRITEOVERFLOW: + // The data length plus the start address offset exceeeds page limits + break; + case SPIFLASH_ERROR_TIMEOUT_READY: + // Timeout waiting for ready status (can be pre or post write) + break; + case SPIFLASH_ERROR_PROTECTIONERR: + // Unable to set write latch + break; + } + } + @endcode +*/ +/**************************************************************************/ +spiflashError_e spiflashWrite (uint32_t address, uint8_t *buffer, uint32_t len); + #endif diff --git a/drivers/spiflash/w25q16bv/w25q16bv.c b/drivers/spiflash/w25q16bv/w25q16bv.c index 7146938..c99e1dc 100644 --- a/drivers/spiflash/w25q16bv/w25q16bv.c +++ b/drivers/spiflash/w25q16bv/w25q16bv.c @@ -589,3 +589,109 @@ spiflashError_e spiflashWritePage (uint32_t address, uint8_t *buffer, uint32_t l return SPIFLASH_ERROR_OK; } +/**************************************************************************/ +/*! + @brief Writes a continuous stream of data that will automatically + cross page boundaries. + + @note Before writing data, make sure that the appropriate sectors + have been erased, otherwise the data will be meaningless. + + @param[in] address + The 24-bit address where the write will start. + @param[out] *buffer + Pointer to the buffer that will store the read results + @param[in] len + Length of the buffer, within the limits of the starting + address and size of the flash device. + + @section EXAMPLE + + @code + spiflashError_e error; + uint8_t buffer[256]; + + buffer[0] = 0x12; + buffer[1] = 0x34; + buffer[2] = 0x56; + buffer[3] = 0x78; + buffer[4] = 0xDE; + buffer[5] = 0xAD; + buffer[6] = 0xC0; + buffer[7] = 0xDE; + + error = spiflashWrite (0, buffer, 8); + if (error) + { + // Check what went wrong + switch (error) + { + case SPIFLASH_ERROR_ADDROUTOFRANGE: + // Specified starting address is out of range + break; + case SPIFLASH_ERROR_DATAEXCEEDSPAGESIZE: + // Supplied data exceeds max page size + break; + case SPIFLASH_ERROR_PAGEWRITEOVERFLOW: + // The data length plus the start address offset exceeeds page limits + break; + case SPIFLASH_ERROR_TIMEOUT_READY: + // Timeout waiting for ready status (can be pre or post write) + break; + case SPIFLASH_ERROR_PROTECTIONERR: + // Unable to set write latch + break; + } + } + @endcode +*/ +/**************************************************************************/ +spiflashError_e spiflashWrite (uint32_t address, uint8_t *buffer, uint32_t len) +{ + uint32_t bytestowrite; + uint32_t bufferoffset; + spiflashError_e error; + + // There's no point duplicating most error checks here since they will all be + // done in the underlying call to spiflashWritePage + + // If the data is only on one page we can take a shortcut + if ((address % W25Q16BV_PAGESIZE) + len <= W25Q16BV_PAGESIZE) + { + // Only one page ... write and be done with it + return spiflashWritePage(address, buffer, len); + } + + // Block spans multiple pages + bufferoffset = 0; + while(len) + { + // Figure out how many bytes need to be written to this page + bytestowrite = W25Q16BV_PAGESIZE - (address % W25Q16BV_PAGESIZE); + // Write the current page + error = spiflashWritePage(address, buffer+bufferoffset, bytestowrite); + // Abort if we returned an error + if (error) + return error; + // Adjust address and len, and buffer offset + address += bytestowrite; + len -= bytestowrite; + bufferoffset+=bytestowrite; + // If the next page is the last one, write it and exit + // otherwise stay in the the loop and keep writing + if (len <= W25Q16BV_PAGESIZE) + { + // Write the last frame and then quit + error = spiflashWritePage(address, buffer+bufferoffset, len); + // Abort if we returned an error + if (error) + return error; + // set len to zero to gracefully exit loop + len = 0; + } + } + + return SPIFLASH_ERROR_OK; +} + + diff --git a/main.c b/main.c index 8b75435..1ab3bf2 100644 --- a/main.c +++ b/main.c @@ -47,28 +47,6 @@ #include "core/cmd/cmd.h" #endif -/**************************************************************************/ -/*! - Approximates a 1 millisecond delay using "nop". This is less - accurate than a dedicated timer, but is useful in certain situations. - - The number of ticks to delay depends on the optimisation level set - when compiling (-O). Depending on the compiler settings, one of the - two defined values for 'delay' should be used. -*/ -/**************************************************************************/ -void delayms(uint32_t ms) -{ - uint32_t delay = ms * ((CFG_CPU_CCLK / 100) / 45); // Release Mode (-Os) - // uint32_t delay = ms * ((CFG_CPU_CCLK / 100) / 120); // Debug Mode (No optimisations) - - while (delay > 0) - { - __asm volatile ("nop"); - delay--; - } -} - /**************************************************************************/ /*! Main program entry point. After reset, normal code execution will @@ -82,22 +60,15 @@ int main(void) uint32_t currentSecond, lastSecond; currentSecond = lastSecond = 0; - + while (1) { - // Toggle LED once per second ... rollover = 136 years :) + // Toggle LED once per second currentSecond = systickGetSecondsActive(); if (currentSecond != lastSecond) { lastSecond = currentSecond; - if (gpioGetValue(CFG_LED_PORT, CFG_LED_PIN) == CFG_LED_OFF) - { - gpioSetValue (CFG_LED_PORT, CFG_LED_PIN, CFG_LED_ON); - } - else - { - gpioSetValue (CFG_LED_PORT, CFG_LED_PIN, CFG_LED_OFF); - } + gpioSetValue(CFG_LED_PORT, CFG_LED_PIN, ~(gpioGetValue(CFG_LED_PORT, CFG_LED_PIN))); } // Poll for CLI input if CFG_INTERFACE is enabled in projectconfig.h diff --git a/projectconfig.h b/projectconfig.h index 90259ae..e59629a 100644 --- a/projectconfig.h +++ b/projectconfig.h @@ -47,8 +47,72 @@ different pin configuration, you will need to specify which board you are using by enabling one of the following definitions. The code base will then try to configure itself accordingly for that board. + + CFG_BRD_LPC1343_REFDESIGN + ========================= + + microBuilder.eu LPC1343 Reference Design base board with + on-board peripherals initialised (EEPROM, USB or UART CLI, etc.) + + This is the recommended starting point for new development + since it makes it easy to send printf output to USB CDC, access + the on-board EEPROM, etc. + + CFG_BRD_LPC1343_REFDESIGN_MINIMAL + ================================= + + microBuilder.eu LPC1343 Reference Design base board with + only the most common peripherals initialised by default. + + Results in smallest code since EEPROM, USB, etc., are not + initialised on startup. By default, only the following + peripherals are initialised by systemInit(): + + - CPU (Configures the PLL, etc.) + - GPIO + - SysTick Timer + - UART (with printf support) * + + * Can be removed to save 0.8kb in debug and 0.3 kb in + release. Comment out 'CFG_PRINTF_UART' to disable it. + + The code size can be further reduced by several KB by removing + any IRQ Handlers that are not used. The I2C IRQHandler, for + example, uses ~1KB of flash in debug and ~400KB in release mode, + but because it is referenced in the startup code it is always + included even if I2C is never used in the project. + + Other IRQ Handlers that you might be able to comment out + to save some space are: + + IRQ Handler Debug Release + ------------------------- ------ ------- + I2C_IRQHandler 1160 b 400 b + SSP_IRQHandler 160 b 76 b + UART_IRQHandler 246 b 116 b + WAKEUP_IRQHandler 160 b 100 b + WDT_IRQHandler 50 b 28 b + + CFG_BRD_LPC1343_TFTLCDSTANDALONE_USB + ==================================== + + microBuilder.eu/Adafruit Stand-Alone "Smart LCD" with USB enabled + for the CLI interface. + + CFG_BRD_LPC1343_TFTLCDSTANDALONE_UART + ===================================== + + microBuilder.eu/Adafruit Stand-Alone "Smart LCD" with UART enabled + for the CLI interface. + + CFG_BRD_LPC1343_802154USBSTICK + ============================== + + microBuilder.eu USB stick 802.15.4 868/915MHz RF transceiver + -----------------------------------------------------------------------*/ #define CFG_BRD_LPC1343_REFDESIGN + // #define CFG_BRD_LPC1343_REFDESIGN_MINIMAL // #define CFG_BRD_LPC1343_TFTLCDSTANDALONE_USB // #define CFG_BRD_LPC1343_TFTLCDSTANDALONE_UART // #define CFG_BRD_LPC1343_802154USBSTICK @@ -199,6 +263,11 @@ #define CFG_UART_BUFSIZE (512) #endif + #ifdef CFG_BRD_LPC1343_REFDESIGN_MINIMAL + #define CFG_UART_BAUDRATE (115200) + #define CFG_UART_BUFSIZE (512) + #endif + #ifdef CFG_BRD_LPC1343_TFTLCDSTANDALONE_USB #define CFG_UART_BAUDRATE (115200) #define CFG_UART_BUFSIZE (512) @@ -229,6 +298,11 @@ // #define CFG_SSP0_SCKPIN_0_6 #endif + #ifdef CFG_BRD_LPC1343_REFDESIGN_MINIMAL + #define CFG_SSP0_SCKPIN_2_11 + // #define CFG_SSP0_SCKPIN_0_6 + #endif + #if defined CFG_BRD_LPC1343_TFTLCDSTANDALONE_USB || defined CFG_BRD_LPC1343_TFTLCDSTANDALONE_UART #define CFG_SSP0_SCKPIN_2_11 // #define CFG_SSP0_SCKPIN_0_6 @@ -258,6 +332,13 @@ #define CFG_LED_OFF (1) #endif + #ifdef CFG_BRD_LPC1343_REFDESIGN_MINIMAL + #define CFG_LED_PORT (2) + #define CFG_LED_PIN (10) + #define CFG_LED_ON (0) + #define CFG_LED_OFF (1) + #endif + #if defined CFG_BRD_LPC1343_TFTLCDSTANDALONE_USB || defined CFG_BRD_LPC1343_TFTLCDSTANDALONE_UART #define CFG_LED_PORT (2) #define CFG_LED_PIN (10) @@ -305,6 +386,13 @@ #define CFG_SDCARD_CDPIN (0) #endif + #ifdef CFG_BRD_LPC1343_REFDESIGN_MINIMAL + // #define CFG_SDCARD + #define CFG_SDCARD_READONLY (1) // Must be 0 or 1 + #define CFG_SDCARD_CDPORT (3) + #define CFG_SDCARD_CDPIN (0) + #endif + #if defined CFG_BRD_LPC1343_TFTLCDSTANDALONE_USB || defined CFG_BRD_LPC1343_TFTLCDSTANDALONE_UART #define CFG_SDCARD #define CFG_SDCARD_READONLY (1) // Must be 0 or 1 @@ -353,6 +441,14 @@ #define CFG_USBCDC_BUFFERSIZE (256) #endif + #ifdef CFG_BRD_LPC1343_REFDESIGN_MINIMAL + // #define CFG_USBHID + // #define CFG_USBCDC + #define CFG_USBCDC_BAUDRATE (115200) + #define CFG_USBCDC_INITTIMEOUT (5000) + #define CFG_USBCDC_BUFFERSIZE (256) + #endif + #ifdef CFG_BRD_LPC1343_TFTLCDSTANDALONE_USB // #define CFG_USBHID #define CFG_USBCDC @@ -399,6 +495,12 @@ #define CFG_PRINTF_NEWLINE "\r\n" #endif + #ifdef CFG_BRD_LPC1343_REFDESIGN_MINIMAL + #define CFG_PRINTF_UART + // #define CFG_PRINTF_USBCDC + #define CFG_PRINTF_NEWLINE "\r\n" + #endif + #ifdef CFG_BRD_LPC1343_TFTLCDSTANDALONE_USB // #define CFG_PRINTF_UART #define CFG_PRINTF_USBCDC @@ -478,6 +580,19 @@ #define CFG_INTERFACE_CONFIRMREADY (0) #endif + #ifdef CFG_BRD_LPC1343_REFDESIGN_MINIMAL + // #define CFG_INTERFACE + #define CFG_INTERFACE_MAXMSGSIZE (256) + #define CFG_INTERFACE_PROMPT "LPC1343 >> " + #define CFG_INTERFACE_SILENTMODE (0) + #define CFG_INTERFACE_DROPCR (0) + #define CFG_INTERFACE_ENABLEIRQ (0) + #define CFG_INTERFACE_IRQPORT (0) + #define CFG_INTERFACE_IRQPIN (7) + #define CFG_INTERFACE_SHORTERRORS (0) + #define CFG_INTERFACE_CONFIRMREADY (0) + #endif + #ifdef CFG_BRD_LPC1343_TFTLCDSTANDALONE_USB #define CFG_INTERFACE #define CFG_INTERFACE_MAXMSGSIZE (256) @@ -580,6 +695,11 @@ #define CFG_I2CEEPROM_SIZE (3072) #endif + #ifdef CFG_BRD_LPC1343_REFDESIGN_MINIMAL + // #define CFG_I2CEEPROM + #define CFG_I2CEEPROM_SIZE (3072) + #endif + #if defined CFG_BRD_LPC1343_TFTLCDSTANDALONE_USB || defined CFG_BRD_LPC1343_TFTLCDSTANDALONE_UART #define CFG_I2CEEPROM #define CFG_I2CEEPROM_SIZE (3072) @@ -689,6 +809,16 @@ #define CFG_CHIBI_BUFFERSIZE (128) #endif + #ifdef CFG_BRD_LPC1343_REFDESIGN_MINIMAL + // #define CFG_CHIBI + #define CFG_CHIBI_MODE (0) // OQPSK_868MHZ + #define CFG_CHIBI_POWER (0xE9) // CHB_PWR_EU2_3DBM + #define CFG_CHIBI_CHANNEL (0) // 868-868.6 MHz + #define CFG_CHIBI_PANID (0x1234) + #define CFG_CHIBI_PROMISCUOUS (0) + #define CFG_CHIBI_BUFFERSIZE (128) + #endif + #if defined CFG_BRD_LPC1343_TFTLCDSTANDALONE_USB || defined CFG_BRD_LPC1343_TFTLCDSTANDALONE_UART // #define CFG_CHIBI #define CFG_CHIBI_MODE (0) // OQPSK_868MHZ @@ -751,6 +881,13 @@ #define CFG_TFTLCD_TS_KEYPADDELAY (100) #endif + #ifdef CFG_BRD_LPC1343_REFDESIGN_MINIMAL + // #define CFG_TFTLCD + #define CFG_TFTLCD_INCLUDESMALLFONTS (0) + #define CFG_TFTLCD_TS_DEFAULTTHRESHOLD (50) + #define CFG_TFTLCD_TS_KEYPADDELAY (100) + #endif + #if defined CFG_BRD_LPC1343_TFTLCDSTANDALONE_USB || defined CFG_BRD_LPC1343_TFTLCDSTANDALONE_UART #define CFG_TFTLCD #define CFG_TFTLCD_INCLUDESMALLFONTS (0) @@ -821,8 +958,8 @@ =========================================================================*/ -#if !defined CFG_BRD_LPC1343_REFDESIGN && !defined CFG_BRD_LPC1343_TFTLCDSTANDALONE_USB && !defined CFG_BRD_LPC1343_TFTLCDSTANDALONE_UART && !defined CFG_BRD_LPC1343_802154USBSTICK - #error "You must defined a target board (CFG_BRD_LPC1343_REFDESIGN or CFG_BRD_LPC1343_TFTLCDSTANDALONE or CFG_BRD_LPC1343_TFTLCDSTANDALONE_UART or CFG_BRD_LPC1343_802154USBSTICK)" +#if !defined CFG_BRD_LPC1343_REFDESIGN && !defined CFG_BRD_LPC1343_REFDESIGN_MINIMAL && !defined CFG_BRD_LPC1343_TFTLCDSTANDALONE_USB && !defined CFG_BRD_LPC1343_TFTLCDSTANDALONE_UART && !defined CFG_BRD_LPC1343_802154USBSTICK + #error "You must defined a target board (CFG_BRD_LPC1343_REFDESIGN or CFG_BRD_LPC1343_REFDESIGN_MINIMAL or CFG_BRD_LPC1343_TFTLCDSTANDALONE or CFG_BRD_LPC1343_TFTLCDSTANDALONE_UART or CFG_BRD_LPC1343_802154USBSTICK)" #endif #if defined CFG_PRINTF_USBCDC && defined CFG_PRINTF_UART diff --git a/sysinit.c b/sysinit.c index 80d2f5c..4ce74dd 100644 --- a/sysinit.c +++ b/sysinit.c @@ -124,7 +124,6 @@ void systemInit() systickInit(CFG_SYSTICK_DELAY_IN_MS); // Start systick timer gpioInit(); // Enable GPIO pmuInit(); // Configure power management - adcInit(); // Config adc pins to save power // Set LED pin as output and turn LED off gpioSetDir(CFG_LED_PORT, CFG_LED_PIN, 1); @@ -144,15 +143,19 @@ void systemInit() // Initialise UART with the default baud rate #ifdef CFG_PRINTF_UART - uint32_t uart = eepromReadU32(CFG_EEPROM_UART_SPEED); - if ((uart == 0xFFFFFFFF) || (uart > 115200)) - { - uartInit(CFG_UART_BAUDRATE); // Use default baud rate - } - else - { - uartInit(uart); // Use baud rate from EEPROM - } + #ifdef CFG_I2CEEPROM + uint32_t uart = eepromReadU32(CFG_EEPROM_UART_SPEED); + if ((uart == 0xFFFFFFFF) || (uart > 115200)) + { + uartInit(CFG_UART_BAUDRATE); // Use default baud rate + } + else + { + uartInit(uart); // Use baud rate from EEPROM + } + #else + uartInit(CFG_UART_BAUDRATE); + #endif #endif // Initialise PWM (requires 16-bit Timer 1 and P1.9) -- 2.20.1