Benchmark Sute based on Arduino speed benchmark, adapted and modified for ARM Cortex-M7 ST Nucleo-144 STM32F767 and STM32F746 MCU's by Jovan Ivković 2017. https://hackaday.io/JovanE (Work based on Original Arduino Speed Test Benchmark Program by Dan Watson modified by Chester Lowrey)

Dependencies:   STM32F4_RNG mbed

Revision:
0:82d68abdb697
Child:
1:646b34df5819
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Mon Feb 20 02:59:17 2017 +0000
@@ -0,0 +1,1491 @@
+//********************************************************
+//**   Benchamrk Sute based on Arduino bench.       ******
+//**  for  ARM Cortex-M7 ST Nucleo-144 Stm32F746    ******
+//**            Stm32F767 MCU's by                  ******
+//**           Jovan Ivkovic 2016.                  ******
+//**         JovanEps (jovan.eps@gmail.com).        ******
+//********************************************************
+#include "mbed.h"
+#include "STM32F4_RNG.h"
+//DigitalOut myled(LED1);
+PwmOut PD13(PA_5);
+//AnalogIn analog_value(A0);
+AnalogIn analog_value(PA_3);
+AnalogOut DACout(PA_4);
+Serial pc(USBTX, USBRX);
+DigitalOut PD7(PF_13);  //introduce D7 pin-out *-Clear port it ping faster :)
+DigitalIn PD8(PF_12);
+DigitalInOut PD5(PE_11);
+Timer timer;            //Timer
+
+#include <math.h>
+#define delay   wait_ms
+#define delayMicroseconds   wait_us
+#define millis()  timer.read_ms()
+#define digitalWrite    DigitalOut
+#define HIGH    1
+#define LOW    0
+
+// Arduino Speed Test Benchmarking Program
+// Original Program Credit: Arduino.cc
+// Modified By: Dan Watson
+// synchannel.blogspot.com
+// 1-29-2015
+
+// Modified By: Chester Lowrey
+// easybotics.com hilo90mhz.com
+// 2016-12-1
+
+// This sketch is the speed test portion of the Arduino Show Info program
+// http://playground.arduino.cc/Main/ShowInfo
+
+// Certain tests may not compile/run for all boards. Comment them out as necessary:
+//  * analogReference()
+//  * dtostrf()
+//  * bitSet()
+//  * y |= (1<<x)
+
+// For the Arduino Zero, "Serial." needs to be "SerialUSB.". A find and replace is the easiest way
+// to fix this. The program may also run in forked IDEs (such as Mpide for the chipKIT boards).
+
+// All configuration options listed below for reference
+
+// PIN_1 is used for digitalRead
+// PIN_2 is used for digitalWrite / pinMode / analogWrite (PWM)
+// Analog read is hardcoded to 0/1
+
+#define noTitle        // define to remove titles - easier to paste results into comparison spreadsheet
+//#define noAnalog       // define to remove analog read/write for ICs without this function
+#define noAnalogRef    // define to remove analogRef test that some cores do not support 
+//#define noDtostrfTest  // define to remove the dtostrf test that some cores do not support
+//#define noBvTest       // define to remove bv test that some cores do not support
+//#define USBserialWait  // define to force the main sketch to wait for USB to Serial connection - needed on some native serial boards
+//#define noLtoaTest     // define to remove Itoa test that some cores do not support
+
+// Uncomment only one of the below configurations for your specifc board, or make a new one
+
+/*
+// Arduino ATMEGA328
+#define PIN_1 3
+#define PIN_2 4
+*/
+
+/*
+// Arduino Leonardo
+#define PIN_1 2
+#define PIN_2 3
+#define noBvTest
+#define USBserialWait
+*/
+
+
+// Nucleo STM32F103RB - not tested yet
+#define PIN_1 12
+#define PIN_2 13
+#define noAnalog
+#define noBvTest
+#define noLtoaTest
+
+/*
+// Arduino Due
+#define PIN_1 2
+#define PIN_2 3
+#define noDtostrfTest
+#define noBvTest
+#define USBserialWait
+*/
+
+/*
+// Arduino Zero Pins
+#define PIN_1 2
+#define PIN_2 3
+#define noBvTest
+#define noDtostrfTest
+#define USBserialWait
+*/
+
+/*
+// ESP8266 Pins
+#define PIN_1 4
+#define PIN_2 5
+#define PIN_3 12
+*/
+
+/*
+// ESP32 Pins
+#define PIN_1 25
+#define PIN_2 26
+#define PIN_3 27
+#define noAnalog
+*/
+
+/*
+// NRF52/51 Pins
+#define PIN_1 17
+#define PIN_2 18
+#define PIN_3 19
+#define noDtostrfTest
+#define noBvTest
+*/
+
+void setup()
+{
+    //Serial.begin(9600);
+    pc.baud(9600);
+
+    /*
+    #ifdef USBserialWait
+     while (!Serial) {
+       ; // wait for serial port to connect. Needed for native USB
+     }
+    #endif
+
+
+     pinMode(PIN_1, OUTPUT);
+     pinMode(PIN_2, INPUT);
+
+     pc.printfln("Speed Test will begin momentarily.");
+     pc.printfln("");
+
+     wait_ms(1000);
+
+     speedTest();
+     */
+}
+
+void speedTest(void)
+{
+    register int i,j;
+    volatile unsigned char c1,c2;
+    volatile int v;
+    volatile long l1,l2;
+    volatile float f1,f2;
+    int p,q;
+    long int r;
+    unsigned long m,n;
+    float d, overhead;
+    char buffer[30];
+    int digitalRead;
+    float meas; //Analog readings
+#define F_CPU 216000000
+#define DEC 10
+
+
+//#ifndef noTitle
+    pc.printf("\n\r");
+    pc.printf("Speed test \n\r");
+    pc.printf("---------- \n\r");
+    pc.printf("F_CPU = ");
+//#endif
+    pc.printf("%d",F_CPU/1000000);
+    pc.printf(" MHz \n\r");
+//#ifndef noTitle
+    pc.printf("1/F_CPU = ");
+//#endif
+    pc.printf("%.4f",(1000000.0/(float)F_CPU));
+    pc.printf("us \n\r");
+          
+    
+    wait(0.5);    // Allow the Serial text to be transmitted
+//#ifndef noTitle
+    pc.printf("\n\r Start benchmarks");
+    pc.printf("\n\r ------------------------------");
+    wait_ms(70);     // Allow the Serial text to be transmitted
+    pc.printf("\n\r\n\r  NOP                       : ");
+//#endif
+//*************************
+// Start timer
+//*************************
+    timer.start();
+//*************************
+//    wait_ms(70);     // Allow the Serial text to be transmitted
+    m = timer.read_ms();
+    for (i=0; i<100; i++) {
+        for (j=0; j<10000; j++) {
+            asm volatile ("nop");
+            asm volatile ("nop");
+            asm volatile ("nop");
+            asm volatile ("nop");
+            asm volatile ("nop");
+            asm volatile ("nop");
+            asm volatile ("nop");
+            asm volatile ("nop");
+            asm volatile ("nop");
+            asm volatile ("nop");
+            asm volatile ("nop");
+            asm volatile ("nop");
+            asm volatile ("nop");
+            asm volatile ("nop");
+            asm volatile ("nop");
+            asm volatile ("nop");
+            asm volatile ("nop");
+            asm volatile ("nop");
+            asm volatile ("nop");
+            asm volatile ("nop");
+        }
+    }
+    n = timer.read_ms();
+    d = ((float)n - (float)m) / ((float)i * (float)j);
+    d *= 1000.0;           // in micro seconds
+    // Calculate overhead with 'nop' instruction per loop in microseconds
+    overhead = d - (20.0 * (1000000.0/(float)F_CPU));
+    d -= overhead;
+    d /= 20.0;             // per instruction
+    pc.printf("%.3f us \n\r",d);
+    pc.printf("\n\r------------------------");
+
+//#ifndef noTitle
+    pc.printf("\n\r  digitalRead               : ");
+//#endif
+    wait_ms(70);     // Allow the Serial text to be transmitted
+    m = timer.read_ms();
+    for (i=0; i<2; i++) {
+        for (j=0; j<10000; j++) {
+
+            digitalRead = PD8;
+            digitalRead = PD8;
+
+            digitalRead = PD8;
+            digitalRead = PD8;
+
+            digitalRead = PD8;
+            digitalRead = PD8;
+
+            digitalRead = PD8;
+            digitalRead = PD8;
+
+            digitalRead = PD8;
+            digitalRead = PD8;
+
+            digitalRead = PD8;
+            digitalRead = PD8;
+
+            digitalRead = PD8;
+            digitalRead = PD8;
+
+            digitalRead = PD8;
+            digitalRead = PD8;
+
+            digitalRead = PD8;
+            digitalRead = PD8;
+
+            digitalRead = PD8;
+            digitalRead = PD8;
+
+            digitalRead = PD8;
+            digitalRead = PD8;
+        }
+    }
+    n = timer.read_ms();
+    d = ((float)n - (float)m) / ((float)i * (float)j);
+    d *= 1000.0;
+    d -= overhead;
+    d /= 20.0;
+    pc.printf("%.3f us \n\r",d);
+    pc.printf("\n\r");
+
+
+//#ifndef noTitle
+    pc.printf("\n\r  digitalWrite              : ");
+//#endif
+    wait_ms(70);     // Allow the Serial text to be transmitted
+    m = timer.read_ms();
+    for (i=0; i<2; i++) {
+        for (j=0; j<10000; j++) {
+            PD7 = HIGH;
+            PD7 = LOW;
+
+            PD7 = HIGH;
+            PD7 = LOW;
+
+            PD7 = HIGH;
+            PD7 = LOW;
+
+            PD7 = HIGH;
+            PD7 = LOW;
+
+            PD7 = HIGH;
+            PD7 = LOW;
+
+            PD7 = HIGH;
+            PD7 = LOW;
+
+            PD7 = HIGH;
+            PD7 = LOW;
+
+            PD7 = HIGH;
+            PD7 = LOW;
+
+            PD7 = HIGH;
+            PD7 = LOW;
+
+            PD7 = HIGH;
+            PD7 = LOW;
+        }
+    }
+    n = timer.read_ms();
+    d = ((float)n - (float)m) / ((float)i * (float)j);
+    d *= 1000.0;
+    d -= overhead;
+    d /= 20.0;
+    pc.printf("%.3f us \n\r",d);
+    pc.printf("\n\r");
+
+
+//#ifndef noTitle
+    pc.printf("\n\r  pinMode                   : ");
+//#endif
+    wait_ms(70);     // Allow the Serial text to be transmitted
+    m = timer.read_ms();
+    for (i=0; i<2; i++) {
+        for (j=0; j<10000; j++) {
+
+            digitalRead = PD5.read();
+            PD5.write(digitalRead);
+
+            digitalRead = PD5.read();
+            PD5.write(digitalRead);
+
+            digitalRead = PD5.read();
+            PD5.write(digitalRead);
+
+            digitalRead = PD5.read();
+            PD5.write(digitalRead);
+
+            digitalRead = PD5.read();
+            PD5.write(digitalRead);
+
+            digitalRead = PD5.read();
+            PD5.write(digitalRead);
+
+            digitalRead = PD5.read();
+            PD5.write(digitalRead);
+
+            digitalRead = PD5.read();
+            PD5.write(digitalRead);
+
+            digitalRead = PD5.read();
+            PD5.write(digitalRead);
+
+            digitalRead = PD5.read();
+            PD5.write(digitalRead);
+
+            digitalRead = PD5.read();
+            PD5.write(digitalRead);
+        }
+    }
+    n = timer.read_ms();
+    d = ((float)n - (float)m) / ((float)i * (float)j);
+    d *= 1000.0;
+    d -= overhead;
+    d /= 20.0;
+    pc.printf("%.3f us \n\r",d);
+    pc.printf("\n\r");
+
+
+
+//#ifndef noTitle
+    pc.printf("\n\r  multiply byte             : ");
+//#endif
+    c1 = 2;
+    c2 = 3;
+    wait_ms(70);     // Allow the Serial text to be transmitted
+    m = timer.read_ms();
+    for (i=0; i<20; i++) {
+        for (j=0; j<10000; j++) {
+            c1 *= c2;
+            c1 *= c2;
+            c1 *= c2;
+            c1 *= c2;
+            c1 *= c2;
+            c1 *= c2;
+            c1 *= c2;
+            c1 *= c2;
+            c1 *= c2;
+            c1 *= c2;
+            c1 *= c2;
+            c1 *= c2;
+            c1 *= c2;
+            c1 *= c2;
+            c1 *= c2;
+            c1 *= c2;
+            c1 *= c2;
+            c1 *= c2;
+            c1 *= c2;
+            c1 *= c2;
+        }
+    }
+    n = timer.read_ms();
+    d = ((float)n - (float)m) / ((float)i * (float)j);
+    d *= 1000.0;
+    d -= overhead;
+    d /= 20.0;
+    pc.printf("%.3f us \n\r",d);
+    pc.printf("\n\r");
+
+
+//#ifndef noTitle
+    pc.printf("\n\r  divide byte               : ");
+//#endif
+    c1 = 253;
+    c2 = 3;
+    wait_ms(70);     // Allow the Serial text to be transmitted
+    m = timer.read_ms();
+    for (i=0; i<2; i++) {
+        for (j=0; j<10000; j++) {
+            c1 /= c2;
+            c1 /= c2;
+            c1 /= c2;
+            c1 /= c2;
+            c1 /= c2;
+            c1 /= c2;
+            c1 /= c2;
+            c1 /= c2;
+            c1 /= c2;
+            c1 /= c2;
+            c1 /= c2;
+            c1 /= c2;
+            c1 /= c2;
+            c1 /= c2;
+            c1 /= c2;
+            c1 /= c2;
+            c1 /= c2;
+            c1 /= c2;
+            c1 /= c2;
+            c1 /= c2;
+        }
+    }
+    n = timer.read_ms();
+    d = ((float)n - (float)m) / ((float)i * (float)j);
+    d *= 1000.0;
+    d -= overhead;
+    d /= 20.0;
+    pc.printf("%.3f us \n\r",d);
+    pc.printf("\n\r");
+
+
+//#ifndef noTitle
+    pc.printf("\n\r  add byte                  : ");
+//#endif
+    c1 = 1;
+    c2 = 2;
+    wait_ms(70);     // Allow the Serial text to be transmitted
+    m = timer.read_ms();
+    for (i=0; i<20; i++) {
+        for (j=0; j<10000; j++) {
+            c1 += c2;
+            c1 += c2;
+            c1 += c2;
+            c1 += c2;
+            c1 += c2;
+            c1 += c2;
+            c1 += c2;
+            c1 += c2;
+            c1 += c2;
+            c1 += c2;
+            c1 += c2;
+            c1 += c2;
+            c1 += c2;
+            c1 += c2;
+            c1 += c2;
+            c1 += c2;
+            c1 += c2;
+            c1 += c2;
+            c1 += c2;
+            c1 += c2;
+        }
+    }
+    n = timer.read_ms();
+    d = ((float)n - (float)m) / ((float)i * (float)j);
+    d *= 1000.0;
+    d -= overhead;
+    d /= 20.0;
+    pc.printf("%.3f us \n\r",d);
+    pc.printf("\n\r");
+
+
+//#ifndef noTitle
+    pc.printf("\n\r  multiply integer          : ");
+//#endif
+    volatile int x,y;
+    x = 2;
+    y = 3;
+    wait_ms(70);     // Allow the Serial text to be transmitted
+    m = timer.read_ms();
+    for (i=0; i<10; i++) {
+        for (j=0; j<10000; j++) {
+            x *= y;
+            x *= y;
+            x *= y;
+            x *= y;
+            x *= y;
+            x *= y;
+            x *= y;
+            x *= y;
+            x *= y;
+            x *= y;
+            x *= y;
+            x *= y;
+            x *= y;
+            x *= y;
+            x *= y;
+            x *= y;
+            x *= y;
+            x *= y;
+            x *= y;
+            x *= y;
+        }
+    }
+    n = timer.read_ms();
+    d = ((float)n - (float)m) / ((float)i * (float)j);
+    d *= 1000.0;
+    d -= overhead;
+    d /= 20.0;
+    pc.printf("%.3f us \n\r",d);
+    pc.printf("\n\r");
+
+
+//#ifndef noTitle
+    pc.printf("\n\r  divide integer            : ");
+//#endif
+    x = 31415;
+    y = 3;
+    wait_ms(70);     // Allow the Serial text to be transmitted
+    m = timer.read_ms();
+    for (i=0; i<1; i++) {
+        for (j=0; j<10000; j++) {
+            x /= y;
+            x /= y;
+            x /= y;
+            x /= y;
+            x /= y;
+            x /= y;
+            x /= y;
+            x /= y;
+            x /= y;
+            x /= y;
+            x /= y;
+            x /= y;
+            x /= y;
+            x /= y;
+            x /= y;
+            x /= y;
+            x /= y;
+            x /= y;
+            x /= y;
+            x /= y;
+        }
+    }
+    n = timer.read_ms();
+    d = ((float)n - (float)m) / ((float)i * (float)j);
+    d *= 1000.0;
+    d -= overhead;
+    d /= 20.0;
+    pc.printf("%.3f us \n\r",d);
+    pc.printf("\n\r");
+
+
+//#ifndef noTitle
+    pc.printf("\n\r  add integer               : ");
+//#endif
+    x = 1;
+    y = 3;
+    wait_ms(70);     // Allow the Serial text to be transmitted
+    m = timer.read_ms();
+    for (i=0; i<10; i++) {
+        for (j=0; j<10000; j++) {
+            x += y;
+            x += y;
+            x += y;
+            x += y;
+            x += y;
+            x += y;
+            x += y;
+            x += y;
+            x += y;
+            x += y;
+            x += y;
+            x += y;
+            x += y;
+            x += y;
+            x += y;
+            x += y;
+            x += y;
+            x += y;
+            x += y;
+            x += y;
+        }
+    }
+    n = timer.read_ms();
+    d = ((float)n - (float)m) / ((float)i * (float)j);
+    d *= 1000.0;
+    d -= overhead;
+    d /= 20.0;
+    pc.printf("%.3f us \n\r",d);
+    pc.printf("\n\r");
+
+
+//#ifndef noTitle
+    pc.printf("\n\r  multiply long             : ");
+//#endif
+    l1 = 2;
+    l2 = 3;
+    wait_ms(70);     // Allow the Serial text to be transmitted
+    m = timer.read_ms();
+    for (i=0; i<2; i++) {
+        for (j=0; j<10000; j++) {
+            l1 *= l2;
+            l1 *= l2;
+            l1 *= l2;
+            l1 *= l2;
+            l1 *= l2;
+            l1 *= l2;
+            l1 *= l2;
+            l1 *= l2;
+            l1 *= l2;
+            l1 *= l2;
+            l1 *= l2;
+            l1 *= l2;
+            l1 *= l2;
+            l1 *= l2;
+            l1 *= l2;
+            l1 *= l2;
+            l1 *= l2;
+            l1 *= l2;
+            l1 *= l2;
+            l1 *= l2;
+        }
+    }
+    n = timer.read_ms();
+    d = ((float)n - (float)m) / ((float)i * (float)j);
+    d *= 1000.0;
+    d -= overhead;
+    d /= 20.0;
+    pc.printf("%.3f us \n\r",d);
+    pc.printf("\n\r");
+
+
+//#ifndef noTitle
+    pc.printf("\n\r  divide long               : ");
+//#endif
+    l1 = 2000000000L;
+    l2 = 3;
+    wait_ms(70);     // Allow the Serial text to be transmitted
+    m = timer.read_ms();
+    for (i=0; i<1; i++) {
+        for (j=0; j<2000; j++) {
+            l1 /= l2;
+            l1 /= l2;
+            l1 /= l2;
+            l1 /= l2;
+            l1 /= l2;
+            l1 /= l2;
+            l1 /= l2;
+            l1 /= l2;
+            l1 /= l2;
+            l1 /= l2;
+            l1 /= l2;
+            l1 /= l2;
+            l1 /= l2;
+            l1 /= l2;
+            l1 /= l2;
+            l1 /= l2;
+            l1 /= l2;
+            l1 /= l2;
+            l1 /= l2;
+            l1 /= l2;
+        }
+    }
+    n = timer.read_ms();
+    d = ((float)n - (float)m) / ((float)i * (float)j);
+    d *= 1000.0;
+    d -= overhead;
+    d /= 20.0;
+    pc.printf("%.3f us \n\r",d);
+    pc.printf("\n\r");
+
+
+//#ifndef noTitle
+    pc.printf("\n\r  add long                  : ");
+//#endif
+    l1 = 500000000L;
+    l2 = 123;
+    wait_ms(70);     // Allow the Serial text to be transmitted
+    m = timer.read_ms();
+    for (i=0; i<4; i++) {
+        for (j=0; j<10000; j++) {
+            l1 += l2;
+            l1 += l2;
+            l1 += l2;
+            l1 += l2;
+            l1 += l2;
+            l1 += l2;
+            l1 += l2;
+            l1 += l2;
+            l1 += l2;
+            l1 += l2;
+            l1 += l2;
+            l1 += l2;
+            l1 += l2;
+            l1 += l2;
+            l1 += l2;
+            l1 += l2;
+            l1 += l2;
+            l1 += l2;
+            l1 += l2;
+            l1 += l2;
+        }
+    }
+    n = timer.read_ms();
+    d = ((float)n - (float)m) / ((float)i * (float)j);
+    d *= 1000.0;
+    d -= overhead;
+    d /= 20.0;
+    pc.printf("%.3f us \n\r",d);
+    pc.printf("\n\r");
+
+
+//#ifndef noTitle
+    pc.printf("\n\r  multiply float            : ");
+//#endif
+    f1 = 3.24;
+    f2 = 1.25;
+    wait_ms(70);     // Allow the Serial text to be transmitted
+    m = timer.read_ms();
+    for (i=0; i<2; i++) {
+        for (j=0; j<10000; j++) {
+            f1 *= f2;
+            f1 *= f2;
+            f1 *= f2;
+            f1 *= f2;
+            f1 *= f2;
+            f1 *= f2;
+            f1 *= f2;
+            f1 *= f2;
+            f1 *= f2;
+            f1 *= f2;
+            f1 *= f2;
+            f1 *= f2;
+            f1 *= f2;
+            f1 *= f2;
+            f1 *= f2;
+            f1 *= f2;
+            f1 *= f2;
+            f1 *= f2;
+            f1 *= f2;
+            f1 *= f2;
+        }
+    }
+    n = timer.read_ms();
+    d = ((float)n - (float)m) / ((float)i * (float)j);
+    d *= 1000.0;
+    d -= overhead;
+    d /= 20.0;
+    pc.printf("%.3f us \n\r",d);
+    pc.printf("\n\r");
+
+
+//#ifndef noTitle
+    pc.printf("\n\r  divide float              : ");
+//#endif
+    f1 = 312645.24;
+    f2 = 1.21;
+    wait_ms(70);     // Allow the Serial text to be transmitted
+    m = timer.read_ms();
+    for (i=0; i<1; i++) {
+        for (j=0; j<2000; j++) {
+            f1 /= f2;
+            f1 /= f2;
+            f1 /= f2;
+            f1 /= f2;
+            f1 /= f2;
+            f1 /= f2;
+            f1 /= f2;
+            f1 /= f2;
+            f1 /= f2;
+            f1 /= f2;
+            f1 /= f2;
+            f1 /= f2;
+            f1 /= f2;
+            f1 /= f2;
+            f1 /= f2;
+            f1 /= f2;
+            f1 /= f2;
+            f1 /= f2;
+            f1 /= f2;
+            f1 /= f2;
+        }
+    }
+    n = timer.read_ms();
+    d = ((float)n - (float)m) / ((float)i * (float)j);
+    d *= 1000.0;
+    d -= overhead;
+    d /= 20.0;
+    pc.printf("%.3f us \n\r",d);
+    pc.printf("\n\r");
+
+
+//#ifndef noTitle
+    pc.printf("\n\r  add float                 : ");
+//#endif
+    f1 = 9876.54;
+    f2 = 1.23;
+    wait_ms(70);     // Allow the Serial text to be transmitted
+    m = timer.read_ms();
+    for (i=0; i<1; i++) {
+        for (j=0; j<10000; j++) {
+            f1 += f2;
+            f1 += f2;
+            f1 += f2;
+            f1 += f2;
+            f1 += f2;
+            f1 += f2;
+            f1 += f2;
+            f1 += f2;
+            f1 += f2;
+            f1 += f2;
+            f1 += f2;
+            f1 += f2;
+            f1 += f2;
+            f1 += f2;
+            f1 += f2;
+            f1 += f2;
+            f1 += f2;
+            f1 += f2;
+            f1 += f2;
+            f1 += f2;
+        }
+    }
+    n = timer.read_ms();
+    d = ((float)n - (float)m) / ((float)i * (float)j);
+    d *= 1000.0;
+    d -= overhead;
+    d /= 20.0;
+    pc.printf("%.3f us \n\r",d);
+    pc.printf("\n\r");
+
+
+    /*
+    //#ifndef noTitle
+        pc.printf("  itoa()                    : ");
+    //#endif
+        wait_ms(70);     // Allow the Serial text to be transmitted
+        m = timer.read_ms();
+        for (i=0; i<1; i++) {
+            for (j=0; j<10000; j++) {
+                itoa(i,buffer,10);
+                itoa(i,buffer,10);
+                itoa(i,buffer,10);
+                itoa(i,buffer,10);
+                itoa(i,buffer,10);
+                itoa(i,buffer,10);
+                itoa(i,buffer,10);
+                itoa(i,buffer,10);
+                itoa(i,buffer,10);
+                itoa(i,buffer,10);
+                itoa(i,buffer,10);
+                itoa(i,buffer,10);
+                itoa(i,buffer,10);
+                itoa(i,buffer,10);
+                itoa(i,buffer,10);
+                itoa(i,buffer,10);
+                itoa(i,buffer,10);
+                itoa(i,buffer,10);
+                itoa(i,buffer,10);
+                itoa(i,buffer,10);
+            }
+        }
+        n = timer.read_ms();
+        d = ((float)n - (float)m) / ((float)i * (float)j);
+        d *= 1000.0;
+        d -= overhead;
+        d /= 20.0;
+        pc.printf("%.3f",d);
+        pc.printf(" us");
+    */
+
+    /*
+    #ifndef noLtoaTest
+        long int l = 314159L;
+    //#ifndef noTitle
+        pc.printf("  ltoa()                    : ");
+    //#endif
+        wait_ms(70);     // Allow the Serial text to be transmitted
+        m = timer.read_ms();
+        for (i=0; i<1; i++) {
+            for (j=0; j<500; j++) {
+                ltoa(l,buffer,10);
+                ltoa(l,buffer,10);
+                ltoa(l,buffer,10);
+                ltoa(l,buffer,10);
+                ltoa(l,buffer,10);
+                ltoa(l,buffer,10);
+                ltoa(l,buffer,10);
+                ltoa(l,buffer,10);
+                ltoa(l,buffer,10);
+                ltoa(l,buffer,10);
+                ltoa(l,buffer,10);
+                ltoa(l,buffer,10);
+                ltoa(l,buffer,10);
+                ltoa(l,buffer,10);
+                ltoa(l,buffer,10);
+                ltoa(l,buffer,10);
+                ltoa(l,buffer,10);
+                ltoa(l,buffer,10);
+                ltoa(l,buffer,10);
+                ltoa(l,buffer,10);
+            }
+        }
+        n = timer.read_ms();
+        d = ((float)n - (float)m) / ((float)i * (float)j);
+        d *= 1000.0;
+        d -= overhead;
+        d /= 20.0;
+        pc.printf("%.3f",d);
+        pc.printf(" us");
+    //#endif
+    */
+
+    /*
+    #ifndef noDtostrfTest
+    //#ifndef noTitle
+        pc.printf("  dtostrf()                 : ");
+    //#endif
+        float d3;
+        d3 = 3.14159265;
+        wait_ms(70);     // Allow the Serial text to be transmitted
+        m = timer.read_ms();
+        for (i=0; i<2; i++) {
+            for (j=0; j<1000; j++) {
+                dtostrf (d3, 6, 2, buffer);
+                dtostrf (d3, 6, 2, buffer);
+                dtostrf (d3, 6, 2, buffer);
+                dtostrf (d3, 6, 2, buffer);
+                dtostrf (d3, 6, 2, buffer);
+                dtostrf (d3, 6, 2, buffer);
+                dtostrf (d3, 6, 2, buffer);
+                dtostrf (d3, 6, 2, buffer);
+                dtostrf (d3, 6, 2, buffer);
+                dtostrf (d3, 6, 2, buffer);
+                dtostrf (d3, 6, 2, buffer);
+                dtostrf (d3, 6, 2, buffer);
+                dtostrf (d3, 6, 2, buffer);
+                dtostrf (d3, 6, 2, buffer);
+                dtostrf (d3, 6, 2, buffer);
+                dtostrf (d3, 6, 2, buffer);
+                dtostrf (d3, 6, 2, buffer);
+                dtostrf (d3, 6, 2, buffer);
+                dtostrf (d3, 6, 2, buffer);
+                dtostrf (d3, 6, 2, buffer);
+            }
+        }
+        n = timer.read_ms();
+        d = ((float)n - (float)m) / ((float)i * (float)j);
+        d *= 1000.0;
+        d -= overhead;
+        d /= 20.0;
+        pc.printf("%.3f",d);
+        pc.printf(" us");
+    #endif
+    */
+
+//**************************
+//****      Randomize
+//**************************
+    STM32F4_RNG rnd;
+    unsigned long num;
+//#ifndef noTitle
+    pc.printf("\n\r  random()                  : ");
+//#endif
+    wait_ms(70);     // Allow the Serial text to be transmitted
+    m = timer.read_ms();
+    for (i=0; i<2; i++) {
+        for (j=0; j<1000; j++) {
+            //r=random(-2147483647,2147483647);
+            num = rnd.Get();
+            num = rnd.Get();
+            num = rnd.Get();
+            num = rnd.Get();
+            num = rnd.Get();
+            num = rnd.Get();
+            num = rnd.Get();
+            num = rnd.Get();
+            num = rnd.Get();
+            num = rnd.Get();
+            num = rnd.Get();
+            num = rnd.Get();
+            num = rnd.Get();
+            num = rnd.Get();
+            num = rnd.Get();
+            num = rnd.Get();
+            num = rnd.Get();
+            num = rnd.Get();
+            num = rnd.Get();
+            num = rnd.Get();
+
+        }
+    }
+    n = timer.read_ms();
+    d = ((float)n - (float)m) / ((float)i * (float)j);
+    d *= 1000.0;
+    d -= overhead;
+    d /= 20.0;
+    pc.printf("%.3f us \n\r",d);
+    pc.printf("\n\r");
+
+//#ifndef noBvTest
+//#ifndef noTitle
+    pc.printf("\n\r  y |= (1<<x)               : ");
+//#endif
+    wait_ms(70);     // Allow the Serial text to be transmitted
+    m = timer.read_ms();
+    for (i=0; i<20; i++) {
+        for (j=0; j<10000; j++) {
+            //v |= _BV(12);
+            v |= (1 << 12);
+            v |= (1 << 12);
+            v |= (1 << 12);
+            v |= (1 << 12);
+            v |= (1 << 12);
+            v |= (1 << 12);
+            v |= (1 << 12);
+            v |= (1 << 12);
+            v |= (1 << 12);
+            v |= (1 << 12);
+            v |= (1 << 12);
+            v |= (1 << 12);
+            v |= (1 << 12);
+            v |= (1 << 12);
+            v |= (1 << 12);
+            v |= (1 << 12);
+            v |= (1 << 12);
+            v |= (1 << 12);
+            v |= (1 << 12);
+            v |= (1 << 12);
+
+        }
+    }
+    n = timer.read_ms();
+    d = ((float)n - (float)m) / ((float)i * (float)j);
+    d *= 1000.0;
+    d -= overhead;
+    d /= 20.0;
+    pc.printf("%.3f us \n\r",d);
+    pc.printf("\n\r");
+    
+//#endif
+
+    /*
+    //#ifndef noTitle
+        pc.printf("  bitSet()                  : ");
+    //#endif
+        wait_ms(70);     // Allow the Serial text to be transmitted
+        m = timer.read_ms();
+        for (i=0; i<20; i++) {
+            for (j=0; j<10000; j++) {
+                bitSet (v, 12);
+                bitSet (v, 12);
+                bitSet (v, 12);
+                bitSet (v, 12);
+                bitSet (v, 12);
+                bitSet (v, 12);
+                bitSet (v, 12);
+                bitSet (v, 12);
+                bitSet (v, 12);
+                bitSet (v, 12);
+                bitSet (v, 12);
+                bitSet (v, 12);
+                bitSet (v, 12);
+                bitSet (v, 12);
+                bitSet (v, 12);
+                bitSet (v, 12);
+                bitSet (v, 12);
+                bitSet (v, 12);
+                bitSet (v, 12);
+                bitSet (v, 12);
+            }
+        }
+        n = timer.read_ms();
+        d = ((float)n - (float)m) / ((float)i * (float)j);
+        d *= 1000.0;
+        d -= overhead;
+        d /= 20.0;
+        pc.printf("%.3f",d);
+        pc.printf(" us");
+    */
+
+    /*
+    //#ifndef noAnalogRef
+    //#ifndef noTitle
+        pc.printf("  analogReference()         : ");
+    //#endif
+        wait_ms(70);     // Allow the Serial text to be transmitted
+        m = timer.read_ms();
+        for (i=0; i<20; i++) {
+            for (j=0; j<10000; j++) {
+                analogReference (EXTERNAL);
+                analogReference (DEFAULT);
+                analogReference (EXTERNAL);
+                analogReference (DEFAULT);
+                analogReference (EXTERNAL);
+                analogReference (DEFAULT);
+                analogReference (EXTERNAL);
+                analogReference (DEFAULT);
+                analogReference (EXTERNAL);
+                analogReference (DEFAULT);
+                analogReference (EXTERNAL);
+                analogReference (DEFAULT);
+                analogReference (EXTERNAL);
+                analogReference (DEFAULT);
+                analogReference (EXTERNAL);
+                analogReference (DEFAULT);
+                analogReference (EXTERNAL);
+                analogReference (DEFAULT);
+                analogReference (EXTERNAL);
+                analogReference (DEFAULT);
+            }
+        }
+        n = timer.read_ms();
+        d = ((float)n - (float)m) / ((float)i * (float)j);
+        d *= 1000.0;
+        d -= overhead;
+        d /= 20.0;
+        pc.printf("%.3f",d);
+        pc.printf(" us");
+    //#endif
+    */
+
+//#ifndef noAnalog
+//#ifndef noTitle
+    pc.printf("\n\r  analogRead()              : ");
+//#endif
+    wait_ms(70);     // Allow the Serial text to be transmitted
+    m = timer.read_ms();
+    for (i=0; i<1; i++) {
+        for (j=0; j<1000; j++) {
+            meas = analog_value.read();
+            meas = analog_value.read();
+            meas = analog_value.read();
+            meas = analog_value.read();
+            meas = analog_value.read();
+            meas = analog_value.read();
+            meas = analog_value.read();
+            meas = analog_value.read();
+            meas = analog_value.read();
+            meas = analog_value.read();
+            meas = analog_value.read();
+            meas = analog_value.read();
+            meas = analog_value.read();
+            meas = analog_value.read();
+            meas = analog_value.read();
+            meas = analog_value.read();
+            meas = analog_value.read();
+            meas = analog_value.read();
+            meas = analog_value.read();
+            meas = analog_value.read();
+
+        }
+    }
+    n = timer.read_ms();
+    d = ((float)n - (float)m) / ((float)i * (float)j);
+    d *= 1000.0;
+    d -= overhead;
+    d /= 20.0;
+    pc.printf("%.3f us \n\r",d);
+    pc.printf("\n\r");
+
+
+//#ifndef noTitle
+    pc.printf("\n\r  PWM analogWrite()         : ");
+//#endif
+    // Using pin 13 (system led) for output.
+    wait_ms(70);     // Allow the Serial text to be transmitted
+    m = timer.read_ms();
+    for (i=0; i<1; i++) {
+        for (j=0; j<10000; j++) {
+            PD13 = 0.5;
+            PD13 = 0.995;
+            PD13 = 0.005;
+            PD13 = 0.35;
+            PD13 = 0.85;
+            PD13 = 0.5;
+            PD13 = 0.995;
+            PD13 = 0.005;
+            PD13 = 0.35;
+            PD13 = 0.85;
+            PD13 = 0.5;
+            PD13 = 0.995;
+            PD13 = 0.005;
+            PD13 = 0.35;
+            PD13 = 0.85;
+            PD13 = 0.5;
+            PD13 = 0.995;
+            PD13 = 0.005;
+            PD13 = 0.35;
+            PD13 = 0.85;
+        }
+    }
+    n = timer.read_ms();
+    d = ((float)n - (float)m) / ((float)i * (float)j);
+    d *= 1000.0;
+    d -= overhead;
+    d /= 20.0;
+    pc.printf("%.3f us \n\r",d);
+    pc.printf("\n\r");
+//#endif
+
+
+//#ifndef noTitle
+    pc.printf("\n\r  DAC analogWrite()         : ");
+//#endif
+    // Using pin 13 (system led) for output.
+    wait_ms(70);     // Allow the Serial text to be transmitted
+    m = timer.read_ms();
+    for (i=0; i<1; i++) {
+        for (j=0; j<10000; j++) {
+            DACout = 0.5;
+            DACout = 0.995;
+            DACout = 0.005;
+            DACout = 0.35;
+            DACout = 0.85;
+            DACout = 0.5;
+            DACout = 0.995;
+            DACout = 0.005;
+            DACout = 0.35;
+            DACout = 0.85;
+            DACout = 0.5;
+            DACout = 0.995;
+            DACout = 0.005;
+            DACout = 0.35;
+            DACout = 0.85;
+            DACout = 0.5;
+            DACout = 0.995;
+            DACout = 0.005;
+            DACout = 0.35;
+            DACout = 0.85;
+        }
+    }
+    n = timer.read_ms();
+    d = ((float)n - (float)m) / ((float)i * (float)j);
+    d *= 1000.0;
+    d -= overhead;
+    d /= 20.0;
+    pc.printf("%.3f us \n\r",d);
+    pc.printf("\n\r");
+//#endif
+
+
+//#ifndef noTitle
+    pc.printf("\n\r  wait_ms(1)                  : ");
+//#endif
+    wait_ms(70);     // Allow the Serial text to be transmitted
+    m = timer.read_ms();
+    for (i=0; i<1; i++) {
+        for (j=0; j<100; j++) {
+            wait_ms(1);
+            wait_ms(1);
+            wait_ms(1);
+            wait_ms(1);
+            wait_ms(1);
+            wait_ms(1);
+            wait_ms(1);
+            wait_ms(1);
+            wait_ms(1);
+            wait_ms(1);
+            wait_ms(1);
+            wait_ms(1);
+            wait_ms(1);
+            wait_ms(1);
+            wait_ms(1);
+            wait_ms(1);
+            wait_ms(1);
+            wait_ms(1);
+            wait_ms(1);
+            wait_ms(1);
+        }
+    }
+    n = timer.read_ms();
+    d = ((float)n - (float)m) / ((float)i * (float)j);
+    d *= 1000.0;
+    d -= overhead;
+    d /= 20.0;
+    pc.printf("%.3f us \n\r",d);
+    pc.printf("\n\r");
+
+
+//#ifndef noTitle
+    pc.printf("\n\r  wait_ms(100)                : ");
+//#endif
+    wait_ms(70);     // Allow the Serial text to be transmitted
+    m = timer.read_ms();
+    for (i=0; i<1; i++) {
+        for (j=0; j<2; j++) {
+            wait_ms(100);
+            wait_ms(100);
+            wait_ms(100);
+            wait_ms(100);
+            wait_ms(100);
+            wait_ms(100);
+            wait_ms(100);
+            wait_ms(100);
+            wait_ms(100);
+            wait_ms(100);
+            wait_ms(100);
+            wait_ms(100);
+            wait_ms(100);
+            wait_ms(100);
+            wait_ms(100);
+            wait_ms(100);
+            wait_ms(100);
+            wait_ms(100);
+            wait_ms(100);
+            wait_ms(100);
+        }
+    }
+    n = timer.read_ms();
+    d = ((float)n - (float)m) / ((float)i * (float)j);
+    d *= 1000.0;
+    d -= overhead;
+    d /= 20.0;
+    pc.printf("%.3f us \n\r",d);
+    pc.printf("\n\r");
+
+
+//#ifndef noTitle
+    pc.printf("\n\r  wait_us(2)      : ");
+//#endif
+    wait_ms(70);     // Allow the Serial text to be transmitted
+    m = timer.read_ms();
+    for (i=0; i<30; i++) {
+        for (j=0; j<1000; j++) {
+            wait_us(2);
+            wait_us(2);
+            wait_us(2);
+            wait_us(2);
+            wait_us(2);
+            wait_us(2);
+            wait_us(2);
+            wait_us(2);
+            wait_us(2);
+            wait_us(2);
+            wait_us(2);
+            wait_us(2);
+            wait_us(2);
+            wait_us(2);
+            wait_us(2);
+            wait_us(2);
+            wait_us(2);
+            wait_us(2);
+            wait_us(2);
+            wait_us(2);
+        }
+    }
+    n = timer.read_ms();
+    d = ((float)n - (float)m) / ((float)i * (float)j);
+    d *= 1000.0;
+    d -= overhead;
+    d /= 20.0;
+    pc.printf("%.3f us \n\r",d);
+    pc.printf("\n\r");
+
+
+//#ifndef noTitle
+    pc.printf("\n\r  wait_us(5)      : ");
+//#endif
+    wait_ms(70);     // Allow the Serial text to be transmitted
+    m = timer.read_ms();
+    for (i=0; i<5; i++) {
+        for (j=0; j<1000; j++) {
+            //pc.printfln ("Working");
+            wait_us(5);
+            wait_us(5);
+            wait_us(5);
+            wait_us(5);
+            wait_us(5);
+            wait_us(5);
+            wait_us(5);
+            wait_us(5);
+            wait_us(5);
+            wait_us(5);
+            wait_us(5);
+            wait_us(5);
+            wait_us(5);
+            wait_us(5);
+            wait_us(5);
+            wait_us(5);
+            wait_us(5);
+            wait_us(5);
+            wait_us(5);
+            wait_us(5);
+        }
+    }
+    n = timer.read_ms();
+    d = ((float)n - (float)m) / ((float)i * (float)j);
+    d *= 1000.0;
+    d -= overhead;
+    d /= 20.0;
+    pc.printf("%.3f us \n\r",d);
+    pc.printf("\n\r");
+
+
+//#ifndef noTitle
+    pc.printf("\n\r  wait_us(100)    : ");
+//#endif
+    wait_ms(70);     // Allow the Serial text to be transmitted
+    m = timer.read_ms();
+    for (i=0; i<1; i++) {
+        for (j=0; j<1000; j++) {
+            wait_us(100);
+            wait_us(100);
+            wait_us(100);
+            wait_us(100);
+            wait_us(100);
+            wait_us(100);
+            wait_us(100);
+            wait_us(100);
+            wait_us(100);
+            wait_us(100);
+            wait_us(100);
+            wait_us(100);
+            wait_us(100);
+            wait_us(100);
+            wait_us(100);
+            wait_us(100);
+            wait_us(100);
+            wait_us(100);
+            wait_us(100);
+            wait_us(100);
+        }
+    }
+    n = timer.read_ms();
+    d = ((float)n - (float)m) / ((float)i * (float)j);
+    d *= 1000.0;
+    d -= overhead;
+    d /= 20.0;
+    pc.printf("%.3f us \n\r",d);
+    pc.printf("\n\r");
+
+    //*************************
+    //**    Stop timer      ***
+    //*************************
+    timer.stop();
+    //*************************
+    pc.printf("-----  END --------");
+    pc.printf("-------------------");
+    wait(0.3);
+}
+
+//*********************************
+//**         MAIN block          **
+//*********************************
+int main()
+{
+    setup();
+    do {
+        pc.printf("\n\r Speed Test will begin momentarily \n\r");
+        pc.printf("\n\r");
+        wait(0.3);
+        speedTest();
+        wait(3);
+    } while (true);
+}