From da1e62091bd14546bfddc80d5dfe4e77bd323bdf Mon Sep 17 00:00:00 2001
From: Sam Calisch <s.calisch@gmail.com>
Date: Thu, 12 Oct 2017 18:11:31 -0400
Subject: [PATCH] added atsam4s code and scope traces

---
 gpio/atsam4s/atsam4s_main.c |  58 ++++++++++++++++++++++++++++++++
 gpio/atsam4s/index.html     |  65 ++++++++++++++++++++++++++++++++++--
 gpio/atsam4s/ring.png       | Bin 0 -> 6477 bytes
 3 files changed, 121 insertions(+), 2 deletions(-)
 create mode 100755 gpio/atsam4s/atsam4s_main.c
 create mode 100755 gpio/atsam4s/ring.png

diff --git a/gpio/atsam4s/atsam4s_main.c b/gpio/atsam4s/atsam4s_main.c
new file mode 100755
index 0000000..41b6a29
--- /dev/null
+++ b/gpio/atsam4s/atsam4s_main.c
@@ -0,0 +1,58 @@
+#include <asf.h>
+
+int main (void)
+{
+	PMC->PMC_PCER0 = 1 << ID_PIOA; //enable PIOA peripheral clock
+
+	//MAINCK OPTIONS: A) External, B) Internal
+	/*
+	//with 12 MHz external crystal for MAINCK
+	REG_CKGR_MOR |= CKGR_MOR_KEY_PASSWD | CKGR_MOR_MOSCXTEN;
+	//wait for crystal to become ready
+	while (!(REG_PMC_SR & PMC_SR_MOSCXTS));
+	//select crystal for main clock
+	REG_CKGR_MOR |= CKGR_MOR_KEY_PASSWD | CKGR_MOR_MOSCSEL;
+	//master clock source selection - choose main clock
+	REG_PMC_MCKR |= PMC_MCKR_CSS_MAIN_CLK;
+	//wait until main clock ready
+	while (!(REG_PMC_SR & PMC_SR_MCKRDY));
+	//select processer prescaler (0 - no divisor, 12 MHz)
+	REG_PMC_MCKR |= PMC_MCKR_PRES_CLK_1;
+	//select processer prescaler (div 4) 12mhz/4 = 3mhz
+	//REG_PMC_MCKR |= PMC_MCKR_PRES_CLK_4;
+	//wait until main clock ready
+	while (!(REG_PMC_SR & PMC_SR_MCKRDY));
+
+	//configure PLLB for 114MHz = (12 MHz / 4) * ( 37+1 )
+	//all faster speeds result in a slower ring oscillator
+	//REG_CKGR_PLLBR |= CKGR_PLLBR_MULB(37) | CKGR_PLLBR_DIVB(4);
+	//REG_CKGR_PLLBR |= CKGR_PLLBR_MULB(82) | CKGR_PLLBR_DIVB(2);
+	*/
+
+	//or use 4 MHz internal oscillator for MAINCK
+	// 106 MHz = ( 4 MHz / 2 ) * (52 + 1)
+	//strange that any faster produced a slower ring...
+	REG_CKGR_PLLBR |= CKGR_PLLBR_MULB(52) | CKGR_PLLBR_DIVB(2);
+
+
+	REG_PMC_MCKR |= PMC_MCKR_CSS_PLLB_CLK; //choose PLLB for master clock source
+
+	REG_PIOA_PER |= PIO_PER_P24 | PIO_PER_P25; //enable PIO controller on PA25 and PA26, PIO_PER_P25 = 1<<25,  PIO_PER_P26 = 1<<26
+	REG_PIOA_OER = PIO_PER_P24; //set PA25 as output
+	REG_PIOA_ODR = PIO_PER_P25; //set PA26 as input
+	
+	//v1 with asf
+	//ioport_set_pin_dir(EXT1_PIN_5, IOPORT_DIR_INPUT);
+	//ioport_set_pin_dir(EXT1_PIN_6, IOPORT_DIR_OUTPUT);
+
+	while (1) {
+		//v1 with asf
+		//ioport_set_pin_level(EXT1_PIN_6, !ioport_get_pin_level(EXT1_PIN_5)); //ring
+		
+		if (REG_PIOA_PDSR & PIO_PDSR_P25){
+			REG_PIOA_CODR = PIO_PER_P24; //if pin26 is high, set pin 25 low
+		} else {
+			REG_PIOA_SODR = PIO_PER_P24; //if pin26 is low, set pin 25 high
+		}
+	}
+}
diff --git a/gpio/atsam4s/index.html b/gpio/atsam4s/index.html
index c422d08..e29d083 100644
--- a/gpio/atsam4s/index.html
+++ b/gpio/atsam4s/index.html
@@ -16,17 +16,78 @@ pre code {
 <h1>ATSAM4S</h1>
 
 <figure>
-<img src='4s-pic.jpg' height=50%>
+<img src='ring.png' height=50%>
 <figcaption>Ring oscillator with ATSAM4S</figcaption>
 </figure>
 
+<p>This ring oscillator runs on the ATSAM4S MCU using the XPlained Pro Dev Kit.  The ATSAM4S has an ARM Cortex-M4 running with a max speed of 120 MHz.  C code for the oscillator is available <a href='atsam4s_main.c'>here</a>, or visible below.</p>
+
 <pre>
 <code>
-code
+#include <asf.h>
+
+int main (void)
+{
+	PMC->PMC_PCER0 = 1 << ID_PIOA; //enable PIOA peripheral clock
+
+	//MAINCK OPTIONS: A) External, B) Internal
+	/*
+	//with 12 MHz external crystal for MAINCK
+	REG_CKGR_MOR |= CKGR_MOR_KEY_PASSWD | CKGR_MOR_MOSCXTEN;
+	//wait for crystal to become ready
+	while (!(REG_PMC_SR & PMC_SR_MOSCXTS));
+	//select crystal for main clock
+	REG_CKGR_MOR |= CKGR_MOR_KEY_PASSWD | CKGR_MOR_MOSCSEL;
+	//master clock source selection - choose main clock
+	REG_PMC_MCKR |= PMC_MCKR_CSS_MAIN_CLK;
+	//wait until main clock ready
+	while (!(REG_PMC_SR & PMC_SR_MCKRDY));
+	//select processer prescaler (0 - no divisor, 12 MHz)
+	REG_PMC_MCKR |= PMC_MCKR_PRES_CLK_1;
+	//select processer prescaler (div 4) 12mhz/4 = 3mhz
+	//REG_PMC_MCKR |= PMC_MCKR_PRES_CLK_4;
+	//wait until main clock ready
+	while (!(REG_PMC_SR & PMC_SR_MCKRDY));
+
+	//configure PLLB for 114MHz = (12 MHz / 4) * ( 37+1 )
+	//all faster speeds result in a slower ring oscillator
+	//REG_CKGR_PLLBR |= CKGR_PLLBR_MULB(37) | CKGR_PLLBR_DIVB(4);
+	//REG_CKGR_PLLBR |= CKGR_PLLBR_MULB(82) | CKGR_PLLBR_DIVB(2);
+	*/
+
+	//or use 4 MHz internal oscillator for MAINCK
+	// 106 MHz = ( 4 MHz / 2 ) * (52 + 1)
+	//strange that any faster produced a slower ring...
+	REG_CKGR_PLLBR |= CKGR_PLLBR_MULB(52) | CKGR_PLLBR_DIVB(2);
+
+
+	REG_PMC_MCKR |= PMC_MCKR_CSS_PLLB_CLK; //choose PLLB for master clock source
+
+	REG_PIOA_PER |= PIO_PER_P24 | PIO_PER_P25; //enable PIO controller on PA25 and PA26, PIO_PER_P25 = 1<<25,  PIO_PER_P26 = 1<<26
+	REG_PIOA_OER = PIO_PER_P24; //set PA25 as output
+	REG_PIOA_ODR = PIO_PER_P25; //set PA26 as input
+	
+	//v1 with asf
+	//ioport_set_pin_dir(EXT1_PIN_5, IOPORT_DIR_INPUT);
+	//ioport_set_pin_dir(EXT1_PIN_6, IOPORT_DIR_OUTPUT);
+
+	while (1) {
+		//v1 with asf
+		//ioport_set_pin_level(EXT1_PIN_6, !ioport_get_pin_level(EXT1_PIN_5)); //ring
+		
+		if (REG_PIOA_PDSR & PIO_PDSR_P25){
+			REG_PIOA_CODR = PIO_PER_P24; //if pin26 is high, set pin 25 low
+		} else {
+			REG_PIOA_SODR = PIO_PER_P24; //if pin26 is low, set pin 25 high
+		}
+	}
+}
 </code>
 </pre>
 
+<p>The system clock is sensitive near its maximum with the ring frequency decreasing dramatically if a threshold is exceeded for the system clock.  Strangely enough, the fastest ring oscillators occured for system clocks of less than 120 MHz.  The code above shows how to use both the internal oscillator to feed the PLL, as well as a 12 MHz external oscillator.</p>
 
+<p>The code also shows how to use the Atmel software framework calls.  This runs roughly half as fast as the direct port manipulation.</p>
 
 <p><a href='../../index.html'>Back</a></p>
 
diff --git a/gpio/atsam4s/ring.png b/gpio/atsam4s/ring.png
new file mode 100755
index 0000000000000000000000000000000000000000..067d117db466536263d5b79e3bd3836c3365f3f6
GIT binary patch
literal 6477
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
JtaD0e0sx?o<+}g?

literal 0
HcmV?d00001

-- 
GitLab