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
Committer:
peu605
Date:
Mon Jan 26 10:31:24 2015 +0000
Revision:
0:ab159002ec37
Child:
1:02a561139720
GPIO toggle test

Who changed what in which revision?

UserRevisionLine numberNew contents of line
peu605 0:ab159002ec37 1 #include "mbed.h"
peu605 0:ab159002ec37 2
peu605 0:ab159002ec37 3 /**
peu605 0:ab159002ec37 4 * GPIO toggle test on ST Nucleo F411RE
peu605 0:ab159002ec37 5 *
peu605 0:ab159002ec37 6 * Resuts:
peu605 0:ab159002ec37 7 * 1. DigitalOut 4.46MHz, 11210msec
peu605 0:ab159002ec37 8 * 2. BSRRL/BSRRH register 20.8MHz, 2402msec
peu605 0:ab159002ec37 9 * 3. bit banding 15.6MHz, 3203msec
peu605 0:ab159002ec37 10 *
peu605 0:ab159002ec37 11 * @author masuda, Masuda Naika
peu605 0:ab159002ec37 12 */
peu605 0:ab159002ec37 13
peu605 0:ab159002ec37 14 #define BITBAND_PERIPH(addr, bit) \
peu605 0:ab159002ec37 15 (volatile uint32_t*)(PERIPH_BB_BASE+((uint32_t)addr-PERIPH_BASE)*32+(bit*4))
peu605 0:ab159002ec37 16
peu605 0:ab159002ec37 17 #define LOOP_COUNT 10000001
peu605 0:ab159002ec37 18
peu605 0:ab159002ec37 19 PinName pinName = D10;
peu605 0:ab159002ec37 20 DigitalOut dout(pinName, 0);
peu605 0:ab159002ec37 21 Timer t;
peu605 0:ab159002ec37 22 Serial pc(SERIAL_TX, SERIAL_RX);
peu605 0:ab159002ec37 23
peu605 0:ab159002ec37 24 GPIO_TypeDef *gpio_port_reg;
peu605 0:ab159002ec37 25 volatile uint32_t gpio_reg_mask;
peu605 0:ab159002ec37 26 volatile uint32_t *bb_gpio_port;
peu605 0:ab159002ec37 27
peu605 0:ab159002ec37 28 void digitalOutTest();
peu605 0:ab159002ec37 29 void bsrrTest();
peu605 0:ab159002ec37 30 void bitbandTest();
peu605 0:ab159002ec37 31
peu605 0:ab159002ec37 32
peu605 0:ab159002ec37 33 int main() {
peu605 0:ab159002ec37 34
peu605 0:ab159002ec37 35 //set gpio port addresses and masks
peu605 0:ab159002ec37 36 uint32_t port_index = (uint32_t) pinName >> 4;
peu605 0:ab159002ec37 37 gpio_port_reg = (GPIO_TypeDef *) (GPIOA_BASE + (port_index << 10));
peu605 0:ab159002ec37 38 gpio_reg_mask = 1 << ((uint32_t) pinName & 0xf);
peu605 0:ab159002ec37 39
peu605 0:ab159002ec37 40 // set bit band addresses
peu605 0:ab159002ec37 41 uint8_t port_bit = (uint32_t) pinName & 0xf;
peu605 0:ab159002ec37 42 bb_gpio_port = BITBAND_PERIPH(&gpio_port_reg->ODR, port_bit);
peu605 0:ab159002ec37 43
peu605 0:ab159002ec37 44 dout = 0;
peu605 0:ab159002ec37 45 wait_ms(2000);
peu605 0:ab159002ec37 46 t.start();
peu605 0:ab159002ec37 47
peu605 0:ab159002ec37 48 while(true) {
peu605 0:ab159002ec37 49 digitalOutTest();
peu605 0:ab159002ec37 50 bsrrTest();
peu605 0:ab159002ec37 51 bitbandTest();
peu605 0:ab159002ec37 52 }
peu605 0:ab159002ec37 53 }
peu605 0:ab159002ec37 54
peu605 0:ab159002ec37 55 void digitalOutTest() {
peu605 0:ab159002ec37 56
peu605 0:ab159002ec37 57 uint32_t l = LOOP_COUNT;
peu605 0:ab159002ec37 58 int t1 = t.read_ms();
peu605 0:ab159002ec37 59
peu605 0:ab159002ec37 60 while(--l) {
peu605 0:ab159002ec37 61 dout = 1;
peu605 0:ab159002ec37 62 dout = 0;
peu605 0:ab159002ec37 63 dout = 1;
peu605 0:ab159002ec37 64 dout = 0;
peu605 0:ab159002ec37 65 dout = 1;
peu605 0:ab159002ec37 66 dout = 0;
peu605 0:ab159002ec37 67 dout = 1;
peu605 0:ab159002ec37 68 dout = 0;
peu605 0:ab159002ec37 69 dout = 1;
peu605 0:ab159002ec37 70 dout = 0;
peu605 0:ab159002ec37 71 }
peu605 0:ab159002ec37 72
peu605 0:ab159002ec37 73 int t2 = t.read_ms();
peu605 0:ab159002ec37 74 pc.printf("DigitalOut: %d msec\n", t2 - t1);
peu605 0:ab159002ec37 75 wait_ms(1000);
peu605 0:ab159002ec37 76 }
peu605 0:ab159002ec37 77
peu605 0:ab159002ec37 78 void bsrrTest() {
peu605 0:ab159002ec37 79
peu605 0:ab159002ec37 80 uint32_t l = LOOP_COUNT;
peu605 0:ab159002ec37 81 int t1 = t.read_ms();
peu605 0:ab159002ec37 82
peu605 0:ab159002ec37 83 while(--l) {
peu605 0:ab159002ec37 84 gpio_port_reg->BSRRL = gpio_reg_mask;
peu605 0:ab159002ec37 85 gpio_port_reg->BSRRH = gpio_reg_mask;
peu605 0:ab159002ec37 86 gpio_port_reg->BSRRL = gpio_reg_mask;
peu605 0:ab159002ec37 87 gpio_port_reg->BSRRH = gpio_reg_mask;
peu605 0:ab159002ec37 88 gpio_port_reg->BSRRL = gpio_reg_mask;
peu605 0:ab159002ec37 89 gpio_port_reg->BSRRH = gpio_reg_mask;
peu605 0:ab159002ec37 90 gpio_port_reg->BSRRL = gpio_reg_mask;
peu605 0:ab159002ec37 91 gpio_port_reg->BSRRH = gpio_reg_mask;
peu605 0:ab159002ec37 92 gpio_port_reg->BSRRL = gpio_reg_mask;
peu605 0:ab159002ec37 93 gpio_port_reg->BSRRH = gpio_reg_mask;
peu605 0:ab159002ec37 94 }
peu605 0:ab159002ec37 95
peu605 0:ab159002ec37 96 int t2 = t.read_ms();
peu605 0:ab159002ec37 97 pc.printf("BSRR: %d msec\n", t2 - t1);
peu605 0:ab159002ec37 98 wait_ms(1000);
peu605 0:ab159002ec37 99 }
peu605 0:ab159002ec37 100
peu605 0:ab159002ec37 101 void bitbandTest() {
peu605 0:ab159002ec37 102
peu605 0:ab159002ec37 103 uint32_t l = LOOP_COUNT;
peu605 0:ab159002ec37 104 int t1 = t.read_ms();
peu605 0:ab159002ec37 105
peu605 0:ab159002ec37 106 while(--l) {
peu605 0:ab159002ec37 107 *bb_gpio_port = 1;
peu605 0:ab159002ec37 108 *bb_gpio_port = 0;
peu605 0:ab159002ec37 109 *bb_gpio_port = 1;
peu605 0:ab159002ec37 110 *bb_gpio_port = 0;
peu605 0:ab159002ec37 111 *bb_gpio_port = 1;
peu605 0:ab159002ec37 112 *bb_gpio_port = 0;
peu605 0:ab159002ec37 113 *bb_gpio_port = 1;
peu605 0:ab159002ec37 114 *bb_gpio_port = 0;
peu605 0:ab159002ec37 115 *bb_gpio_port = 1;
peu605 0:ab159002ec37 116 *bb_gpio_port = 0;
peu605 0:ab159002ec37 117 }
peu605 0:ab159002ec37 118
peu605 0:ab159002ec37 119 int t2 = t.read_ms();
peu605 0:ab159002ec37 120 pc.printf("Bit band: %d msec\n", t2 - t1);
peu605 0:ab159002ec37 121 wait_ms(1000);
peu605 0:ab159002ec37 122 }