EmbeddedArtists AB
/
lpc812_exp_solution_uart
Solutions for the UART experiments for LPC812 MAX
Diff: main.cpp
- Revision:
- 0:0ad38420d207
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Fri Nov 22 08:40:56 2013 +0000 @@ -0,0 +1,157 @@ +#include "mbed.h" + +Serial pc(USBTX, USBRX); // tx, rx + +DigitalIn button(D0); + +Timer timer; + +static void experiment1() +{ + unsigned int variableToHoldValue; //declare a 32-bit variable + unsigned char *pBytePointer; //declare a byte-pointer + + pc.printf("\nThis is a first test...\n"); + pc.printf("that printf() works - and it does!"); + + //store value in 32-bit variable + variableToHoldValue = 0x0AC0FFEE; + + //set the byte-pointer to the beginning (first byte) of the 32-bit variable + pBytePointer = (unsigned char *)&variableToHoldValue; + + //Test if big-endian + if ((*pBytePointer == 0x0A) && + (*(pBytePointer+1) == 0xC0) && + (*(pBytePointer+2) == 0xFF) && + (*(pBytePointer+3) == 0xEE)) { + pc.printf("\nThe CPU is a Big-endian system\n"); + } + + //Test if little-endian instead + else if ((*pBytePointer == 0xEE) && + (*(pBytePointer+1) == 0xFF) && + (*(pBytePointer+2) == 0xC0) && + (*(pBytePointer+3) == 0x0A)) { + pc.printf("\nThe CPU is a Little-endian system\n"); + } + //Neither if the tests was correct – something is VERY wrong here!!! + else { + pc.printf("\nSomething is VERY wrong here!!!\n"); + } + + while(1) + ; +} + +static void experiment2() +{ + // Enable button + button.mode(PullUp); + + // Enter forever loop + while(1) { + // Wait for button to be pressed and then released + while(button) { + } + pc.printf("Button was pressed...\n"); + while(!button) { + } + pc.printf("and released\n"); + } +} + +static void experiment3_alt1() +{ + pc.printf("This is a test of getc()...\n"); + + // Enter forever loop + while(1) { + int rxChar = pc.getc(); + pc.printf("Got %c\n", rxChar); + } +} + +static void experiment3_alt2() +{ + int val = 0; + int numChars = 0; + pc.printf("This is a test of getc() and converts to a number...\n"); + + // Enter forever loop + while(1) { + int rxChar = pc.getc(); + numChars++; + if ((rxChar == '\r') || (rxChar == '\n') || (rxChar == ' ')) { + // Found a separator character, print number and start over + if (numChars > 1) { + pc.printf("Found %d\n", val); + } + numChars = 0; + val = 0; + } + else if ((rxChar < '0') || (rxChar > '9')) { + // Not a number, reset and start looking again + pc.printf("Not a number: '%c'\n", rxChar); + numChars = 0; + val = 0; + } + else { + // A valid number was found + val = (val * 10) + (rxChar - '0'); + if (numChars == 9) { + // Almost reached maximum size, print and continue + pc.printf("Found %d\n", val); + numChars = 0; + val = 0; + } + } + } +} + +static void experiment4() +{ +#define BYTES_IN_BUFF 512 +#define NUM_BUFFS_TO_SEND 10 + + // Change baudrate here to see what difference it makes. Don't forget + // to change to the same value on the Host PC + //pc.baud(115200); + + pc.printf("This is a performance test...\n"); + + char buff[BYTES_IN_BUFF + 1]; + + // initialize the buffer with some characters to print + for (int i = 0; i < BYTES_IN_BUFF; i+=10) { + for (int c = 0; c < 10; c++) { + buff[i+c] = '0' + c; + } + } + + // puts expects the string to be null terminated + buff[BYTES_IN_BUFF] = '\0'; + + timer.start(); + int begin = timer.read_ms(); + for (int num = 0; num < NUM_BUFFS_TO_SEND; num++) { + pc.puts(buff); + } + int end = timer.read_ms(); + timer.stop(); + + // print information about how much time passed and the bitrate + printf("\n--- Sent %d bytes in %dms\n", BYTES_IN_BUFF * NUM_BUFFS_TO_SEND, end-begin); + + while(1) + ; +} + +int main() +{ + //experiment1(); // Detects endian + //experiment2(); // Button + //experiment3_alt1(); // getc + //experiment3_alt2(); // getc with digits + experiment4(); // performance +} \ No newline at end of file