GPIO toggle test on NUCLEO F411RE DigitalOut 4.46MHz, 11210msec BSRRL/BSRRH register 20.8MHz, 2402msec Bit banding 15.6MHz, 3203msec
GPIO toggle test on NUCLEO F411RE
- DigitalOut 4.46MHz, 11210msec
- BSRRL/BSRRH register 20.8MHz, 2402msec
- Bit banding 15.6MHz, 3203msec
main.cpp@0:ab159002ec37, 2015-01-26 (annotated)
- 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?
User | Revision | Line number | New 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 | } |