<html> <head> <style> pre code { background-color: #eee; border: 1px solid #999; display: block; padding: 20px; } </style> </head> <body> <h1>ATSAM4S</h1> <figure> <img src='ring.png' height=50%> <figcaption>Ring oscillator with ATSAMS70</figcaption> </figure> <p>This ring oscillator runs on the ATSAMS70 MCU using a homebrew dev-board documented <a href='https://gitlab.cba.mit.edu/jakeread/tinynets/tree/master/embedded'>here</a>. The ATSAMS70 has an ARM Cortex-M7 running with a max speed of 300 MHz. C code for the oscillator is available <a href='atsams70_main.c'>here</a>, or visible below.</p> <pre> <code>#include <asf.h> int main (void) { /* Insert system clock initialization code here (sysclk_init()). */ board_init(); sysclk_init(); /* Insert application code here, after the board has been initialized. */ // startup the PIOA peripheral clock - only necessary for Inputs and Interrupts PMC->PMC_PCER0 = 1 << ID_PIOA; // Peripheral Enable Register // Set PER to 1 at the pin to enable the PIO peripheral, // set PDR (peripheral disable register) to 1 to clear that, opening the pin up for other peripherals (uart, etc) PIOA->PIO_PER |= PIO_PER_P28 | PIO_PER_P15; // Output Enable Register PIOA->PIO_OER = PIO_PER_P28; // Output Disable Register PIOA->PIO_ODR = PIO_PER_P15; // B1 pulls PA15 to GND while (1) { // Clear Output Data Register (open drain) if(PIOA->PIO_PDSR & PIO_PER_P15){ PIOA->PIO_CODR = PIO_PER_P28; } else { PIOA->PIO_SODR = PIO_PER_P28; } } } </code> </pre> <p>Oddly, the ring would bounce between 5.7MHz and 3.7MHz - I'm guessing that this is due to the GPIO peripheral occasionally sampling on a 'close' edge of it's 150MHz peripheral clock or on 'the next edge' ... if that makes any sense.</p> <p><a href='../../index.html'>Back</a></p> </body> </html>