diff --git a/gpio/m0/index.html b/gpio/m0/index.html index 5c644ac3baf5194494a61abd581d6a47af59e4ce..6b71358acc01965d4f58a7fd50d56a56a94babb8 100644 --- a/gpio/m0/index.html +++ b/gpio/m0/index.html @@ -16,8 +16,8 @@ pre code { <h1>M0 - ATSAMD21</h1> <figure> -<img src='m0-feather.jpg'> -<figcaption>Ring oscillator with M0.</figcaption> +<img src='m0-feather.jpg' height=50%> +<figcaption>Ring oscillator with M0 Feather.</figcaption> </figure> <p>This ring oscillator runs on the 'M0' ATSAMD21, which is a fairly popular microcontroller with an Arm Cortex M0 at it's heart. It has native USB functionality, and is supported with an Adafruit bootloader, making writing and running code fairly straightforward. I used Adafruit's Feather dev board for this test.</p> @@ -40,36 +40,32 @@ pre code { #define PIN_11_PORT 0 #define PIN_11_PIN 16 -#define LED_OUTSET PORT->Group[PIN_LED_PORT].OUTSET.reg -#define LED_OUTCLR PORT->Group[PIN_LED_PORT].OUTCLR.reg - -#define RING_PORT_OUTSET PORT->Group[PIN_10_PORT].OUTSET.reg -#define RING_PORT_OUTCLR PORT->Group[PIN_10_PORT].OUTCLR.reg -#define RING_PORT_OUT_MASK (1UL << PIN_10_PIN) - -#define RING_PORT_IN PORT->Group[PIN_11_PORT].IN.reg -#define RING_PORT_IN_MASK (1UL << PIN_11_PIN) +uint32_t ulPin = 11; void setup() { - // set a pin to in - PORT->Group[PIN_LED_PORT].PINCFG[PIN_LED_PIN].reg = (uint8_t)(PORT_PINCFG_INEN); - // setting same pin to out (arduino configures an output as both, so it can read its own state. handy - PORT->Group[PIN_LED_PORT].DIRSET.reg = (uint32_t)(1 << PIN_LED_PIN); + // set a pin to in / out ... starting + PORT->Group[g_APinDescription[ulPin].ulPort].PINCFG[g_APinDescription[ulPin].ulPin].reg = (uint8_t)(PORT_PINCFG_INEN) ; + PORT->Group[g_APinDescription[ulPin].ulPort].DIRSET.reg = (uint32_t)(1 << g_APinDescription[ulPin].ulPin) ; - // set 10 to output - PORT->Group[PIN_10_PORT].DIRSET.reg = (uint32_t)(1 << PIN_10_PIN); - - // set 11 to input - PORT->Group[PIN_11_PORT].PINCFG[PIN_11_PIN].reg = (uint8_t)(PORT_PINCFG_INEN); + //pinMode(10, OUTPUT); + //pinMode(11, INPUT); - // do loop - while (1) { // no loop just c - RING_PORT_IN & RING_PORT_IN_MASK ? RING_PORT_OUTCLR = RING_PORT_OUT_MASK : RING_PORT_OUTSET = RING_PORT_OUT_MASK; - } } void loop() { - + EPortType port = g_APinDescription[ulPin].ulPort; + uint32_t pin = g_APinDescription[ulPin].ulPin; + uint32_t pinMask = (1ul << pin); + + Serial.print("11, port: "); + Serial.print(port); + Serial.print(" pin: "); + Serial.print(pin); + Serial.println(""); + PORT->Group[port].OUTSET.reg = pinMask; + delay(100); + PORT->Group[port].OUTCLR.reg = pinMask; + delay(100); } </code> </pre> @@ -77,18 +73,12 @@ void loop() { <p>This enabled me to write the code that I ran during the test, where the M0 clocked at 1.45MHz. Scope traces and code below.</p> <figure> -<img src="m0-scope.jpg" height=25%> +<img src="m0-scope.jpg" height=50%> <figcaption>Adafruit Feather dev board used in this test.</figcaption> </figure> <pre> <code> -/* - I found most of these definitions in the arduino cores in - AppData/Local/Arduino15/packages/adafruit/hardware/samd/1.0.19/cores/arduino/wiring_digital.c & wiring_digital.h - also samd/1.0.19/variants/variant.h and variant.cpp and pins_arduino.h -*/ - #define PIN_10_PORT 0 #define PIN_10_PIN 18 @@ -125,7 +115,7 @@ void loop() { <p>With the Arduino digitalWrite and digitalRead calls, the ring is ~162khz</p> <figure> -<img src='m0-scope-arduino.jpg'> +<img src='m0-scope-arduino.jpg' height=50%> <figcaption>Ring oscillator with M0 using Arduino library calls.</figcaption> </figure> diff --git a/gpio/m0/m0_port/m0_port.ino b/gpio/m0/m0_port/m0_port.ino index 32643ad39078ed6e305f691b39639762370752ff..d33aecf5830cd19d265ea1bed23c9cdc108ca56e 100644 --- a/gpio/m0/m0_port/m0_port.ino +++ b/gpio/m0/m0_port/m0_port.ino @@ -1,41 +1,35 @@ /* I found most of these definitions in the arduino cores in AppData/Local/Arduino15/packages/adafruit/hardware/samd/1.0.19/cores/arduino/wiring_digital.c & wiring_digital.h + also samd/1.0.19/variants/variant.h and variant.cpp and pins_arduino.h */ -#define PIN_LED_PORT 0 -#define PIN_LED_PIN 17 - #define PIN_10_PORT 0 #define PIN_10_PIN 18 #define PIN_11_PORT 0 #define PIN_11_PIN 16 -uint32_t ulPin = 11; +#define RING_PORT_OUTSET PORT->Group[PIN_10_PORT].OUTSET.reg +#define RING_PORT_OUTCLR PORT->Group[PIN_10_PORT].OUTCLR.reg +#define RING_PORT_OUT_MASK (1UL << PIN_10_PIN) + +#define RING_PORT_IN PORT->Group[PIN_11_PORT].IN.reg +#define RING_PORT_IN_MASK (1UL << PIN_11_PIN) void setup() { - // set a pin to in / out ... starting - PORT->Group[g_APinDescription[ulPin].ulPort].PINCFG[g_APinDescription[ulPin].ulPin].reg = (uint8_t)(PORT_PINCFG_INEN) ; - PORT->Group[g_APinDescription[ulPin].ulPort].DIRSET.reg = (uint32_t)(1 << g_APinDescription[ulPin].ulPin) ; + // set 10 to output + PORT->Group[PIN_10_PORT].DIRSET.reg = (uint32_t)(1 << PIN_10_PIN); - //pinMode(10, OUTPUT); - //pinMode(11, INPUT); + // set 11 to input + PORT->Group[PIN_11_PORT].PINCFG[PIN_11_PIN].reg = (uint8_t)(PORT_PINCFG_INEN); + // do loop + while (1) { // no loop just c + RING_PORT_IN & RING_PORT_IN_MASK ? RING_PORT_OUTCLR = RING_PORT_OUT_MASK : RING_PORT_OUTSET = RING_PORT_OUT_MASK; + } } void loop() { - EPortType port = g_APinDescription[ulPin].ulPort; - uint32_t pin = g_APinDescription[ulPin].ulPin; - uint32_t pinMask = (1ul << pin); - - Serial.print("11, port: "); - Serial.print(port); - Serial.print(" pin: "); - Serial.print(pin); - Serial.println(""); - PORT->Group[port].OUTSET.reg = pinMask; - delay(100); - PORT->Group[port].OUTCLR.reg = pinMask; - delay(100); + } diff --git a/gpio/m0/m0_portSearch/m0_portSearch.ino b/gpio/m0/m0_portSearch/m0_portSearch.ino index d33aecf5830cd19d265ea1bed23c9cdc108ca56e..32643ad39078ed6e305f691b39639762370752ff 100644 --- a/gpio/m0/m0_portSearch/m0_portSearch.ino +++ b/gpio/m0/m0_portSearch/m0_portSearch.ino @@ -1,35 +1,41 @@ /* I found most of these definitions in the arduino cores in AppData/Local/Arduino15/packages/adafruit/hardware/samd/1.0.19/cores/arduino/wiring_digital.c & wiring_digital.h - also samd/1.0.19/variants/variant.h and variant.cpp and pins_arduino.h */ +#define PIN_LED_PORT 0 +#define PIN_LED_PIN 17 + #define PIN_10_PORT 0 #define PIN_10_PIN 18 #define PIN_11_PORT 0 #define PIN_11_PIN 16 -#define RING_PORT_OUTSET PORT->Group[PIN_10_PORT].OUTSET.reg -#define RING_PORT_OUTCLR PORT->Group[PIN_10_PORT].OUTCLR.reg -#define RING_PORT_OUT_MASK (1UL << PIN_10_PIN) - -#define RING_PORT_IN PORT->Group[PIN_11_PORT].IN.reg -#define RING_PORT_IN_MASK (1UL << PIN_11_PIN) +uint32_t ulPin = 11; void setup() { - // set 10 to output - PORT->Group[PIN_10_PORT].DIRSET.reg = (uint32_t)(1 << PIN_10_PIN); + // set a pin to in / out ... starting + PORT->Group[g_APinDescription[ulPin].ulPort].PINCFG[g_APinDescription[ulPin].ulPin].reg = (uint8_t)(PORT_PINCFG_INEN) ; + PORT->Group[g_APinDescription[ulPin].ulPort].DIRSET.reg = (uint32_t)(1 << g_APinDescription[ulPin].ulPin) ; - // set 11 to input - PORT->Group[PIN_11_PORT].PINCFG[PIN_11_PIN].reg = (uint8_t)(PORT_PINCFG_INEN); + //pinMode(10, OUTPUT); + //pinMode(11, INPUT); - // do loop - while (1) { // no loop just c - RING_PORT_IN & RING_PORT_IN_MASK ? RING_PORT_OUTCLR = RING_PORT_OUT_MASK : RING_PORT_OUTSET = RING_PORT_OUT_MASK; - } } void loop() { - + EPortType port = g_APinDescription[ulPin].ulPort; + uint32_t pin = g_APinDescription[ulPin].ulPin; + uint32_t pinMask = (1ul << pin); + + Serial.print("11, port: "); + Serial.print(port); + Serial.print(" pin: "); + Serial.print(pin); + Serial.println(""); + PORT->Group[port].OUTSET.reg = pinMask; + delay(100); + PORT->Group[port].OUTCLR.reg = pinMask; + delay(100); }