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