GPIO toggle test on NUCLEO F411RE DigitalOut 4.46MHz, 11210msec BSRRL/BSRRH register 20.8MHz, 2402msec Bit banding 15.6MHz, 3203msec

Dependencies:   mbed

GPIO toggle test on NUCLEO F411RE

  • DigitalOut 4.46MHz, 11210msec
  • BSRRL/BSRRH register 20.8MHz, 2402msec
  • Bit banding 15.6MHz, 3203msec
Revision:
0:ab159002ec37
Child:
1:02a561139720
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Mon Jan 26 10:31:24 2015 +0000
@@ -0,0 +1,122 @@
+#include "mbed.h"
+
+/**
+ * GPIO toggle test on ST Nucleo F411RE
+ *
+ * Resuts:
+ * 1. DigitalOut            4.46MHz, 11210msec
+ * 2. BSRRL/BSRRH register  20.8MHz,  2402msec
+ * 3. bit banding           15.6MHz,  3203msec
+ *
+ * @author masuda, Masuda Naika
+ */
+
+#define BITBAND_PERIPH(addr, bit) \
+    (volatile uint32_t*)(PERIPH_BB_BASE+((uint32_t)addr-PERIPH_BASE)*32+(bit*4))
+    
+#define LOOP_COUNT 10000001
+
+PinName pinName = D10;
+DigitalOut dout(pinName, 0);
+Timer t;
+Serial pc(SERIAL_TX, SERIAL_RX);
+
+GPIO_TypeDef *gpio_port_reg;
+volatile uint32_t gpio_reg_mask;
+volatile uint32_t *bb_gpio_port;
+
+void digitalOutTest();
+void bsrrTest();
+void bitbandTest();
+
+
+int main() {
+    
+    //set gpio port addresses and masks
+    uint32_t port_index = (uint32_t) pinName >> 4;
+    gpio_port_reg = (GPIO_TypeDef *) (GPIOA_BASE + (port_index << 10));
+    gpio_reg_mask = 1 << ((uint32_t) pinName & 0xf);
+
+    // set bit band addresses
+    uint8_t port_bit = (uint32_t) pinName & 0xf;
+    bb_gpio_port = BITBAND_PERIPH(&gpio_port_reg->ODR, port_bit);
+    
+    dout = 0;
+    wait_ms(2000);
+    t.start();
+    
+    while(true) {
+        digitalOutTest();
+        bsrrTest();
+        bitbandTest();
+    }
+}
+
+void digitalOutTest() {
+    
+    uint32_t l = LOOP_COUNT;
+    int t1 = t.read_ms();
+    
+    while(--l) {
+        dout = 1;
+        dout = 0;
+        dout = 1;
+        dout = 0;
+        dout = 1;
+        dout = 0;
+        dout = 1;
+        dout = 0;
+        dout = 1;
+        dout = 0;
+    }
+    
+    int t2 = t.read_ms();
+    pc.printf("DigitalOut: %d msec\n", t2 - t1);
+    wait_ms(1000);
+}
+
+void bsrrTest() {
+    
+    uint32_t l = LOOP_COUNT;
+    int t1 = t.read_ms();
+
+    while(--l) {
+        gpio_port_reg->BSRRL = gpio_reg_mask;
+        gpio_port_reg->BSRRH = gpio_reg_mask;
+        gpio_port_reg->BSRRL = gpio_reg_mask;
+        gpio_port_reg->BSRRH = gpio_reg_mask;
+        gpio_port_reg->BSRRL = gpio_reg_mask;
+        gpio_port_reg->BSRRH = gpio_reg_mask;
+        gpio_port_reg->BSRRL = gpio_reg_mask;
+        gpio_port_reg->BSRRH = gpio_reg_mask;
+        gpio_port_reg->BSRRL = gpio_reg_mask;
+        gpio_port_reg->BSRRH = gpio_reg_mask;
+    }
+    
+    int t2 = t.read_ms();
+    pc.printf("BSRR: %d msec\n", t2 - t1);
+    wait_ms(1000);
+}
+
+void bitbandTest() {
+
+    uint32_t l = LOOP_COUNT;
+    int t1 = t.read_ms();
+    
+    while(--l) {
+        *bb_gpio_port = 1;
+        *bb_gpio_port = 0;
+        *bb_gpio_port = 1;
+        *bb_gpio_port = 0;
+        *bb_gpio_port = 1;
+        *bb_gpio_port = 0;
+        *bb_gpio_port = 1;
+        *bb_gpio_port = 0;
+        *bb_gpio_port = 1;
+        *bb_gpio_port = 0;
+    }
+    
+    int t2 = t.read_ms();
+    pc.printf("Bit band: %d msec\n", t2 - t1);
+    wait_ms(1000);
+}