From 1a5a1136559aa8a78ec42cd49e3a7c28e55b711c Mon Sep 17 00:00:00 2001 From: Jean Gressmann Date: Sun, 21 Mar 2021 09:43:29 +0100 Subject: [PATCH] SAM54 Xplained Pro: reduce board setup code for maintenance The board now runs off the internal oscillator at 48 MHz. This is sufficient to run the TinyUSB examples. A better performing clock setup is keep in the file as init_clock_xtal() as an example. --- hw/bsp/same54xplainedpro/board.mk | 2 +- hw/bsp/same54xplainedpro/same54xplainedpro.c | 22 ++++++++++++++++---- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/hw/bsp/same54xplainedpro/board.mk b/hw/bsp/same54xplainedpro/board.mk index 046ebbf6..89d6ce01 100644 --- a/hw/bsp/same54xplainedpro/board.mk +++ b/hw/bsp/same54xplainedpro/board.mk @@ -1,6 +1,6 @@ DEPS_SUBMODULES = hw/mcu/microchip -CONF_CPU_FREQUENCY ?= 120000000 +CONF_CPU_FREQUENCY ?= 48000000 CFLAGS += \ -mthumb \ diff --git a/hw/bsp/same54xplainedpro/same54xplainedpro.c b/hw/bsp/same54xplainedpro/same54xplainedpro.c index 70ea7d43..52e1b25f 100644 --- a/hw/bsp/same54xplainedpro/same54xplainedpro.c +++ b/hw/bsp/same54xplainedpro/same54xplainedpro.c @@ -59,7 +59,19 @@ void USB_3_Handler(void) #define BUTTON_PIN PIN_PB31 #define BOARD_SERCOM SERCOM2 -static inline void init_clock(void) +/** Initializes the clocks from the external 12 MHz crystal + * + * The goal of this setup is to preserve the second PLL + * for the application code while still having a reasonable + * 48 MHz clock for USB / UART. + * + * GCLK0: CONF_CPU_FREQUENCY (default 120 MHz) from PLL0 + * GCLK1: unused + * GCLK2: 12 MHz from XOSC1 + * DFLL48M: closed loop from GLCK2 + * GCLK3: 48 MHz + */ +static inline void init_clock_xtal(void) { /* configure for a 12MHz crystal connected to XIN1/XOUT1 */ OSCCTRL->XOSCCTRL[1].reg = @@ -118,13 +130,14 @@ static inline void init_clock(void) while(1 == GCLK->SYNCBUSY.bit.GENCTRL3); } +/* Initialize SERCOM2 for 115200 bps 8N1 using a 48 MHz clock */ static inline void uart_init(void) { gpio_set_pin_function(PIN_PB24, PINMUX_PB24D_SERCOM2_PAD1); gpio_set_pin_function(PIN_PB25, PINMUX_PB25D_SERCOM2_PAD0); MCLK->APBBMASK.bit.SERCOM2_ = 1; - GCLK->PCHCTRL[SERCOM2_GCLK_ID_CORE].reg = GCLK_PCHCTRL_GEN_GCLK3 | GCLK_PCHCTRL_CHEN; + GCLK->PCHCTRL[SERCOM2_GCLK_ID_CORE].reg = GCLK_PCHCTRL_GEN_GCLK0 | GCLK_PCHCTRL_CHEN; BOARD_SERCOM->USART.CTRLA.bit.SWRST = 1; /* reset and disable SERCOM -> enable configuration */ while (BOARD_SERCOM->USART.SYNCBUSY.bit.SWRST); @@ -167,7 +180,8 @@ static inline void uart_send_str(const char* text) void board_init(void) { - init_clock(); + // Uncomment this line to run off the XTAL + // init_clock_xtal(); SystemCoreClock = CONF_CPU_FREQUENCY; @@ -218,7 +232,7 @@ void board_init(void) * The USB module requires a GCLK_USB of 48 MHz ~ 0.25% clock * for low speed and full speed operation. */ - hri_gclk_write_PCHCTRL_reg(GCLK, USB_GCLK_ID, GCLK_PCHCTRL_GEN_GCLK3_Val | GCLK_PCHCTRL_CHEN); + hri_gclk_write_PCHCTRL_reg(GCLK, USB_GCLK_ID, GCLK_PCHCTRL_GEN_GCLK0_Val | GCLK_PCHCTRL_CHEN); hri_mclk_set_AHBMASK_USB_bit(MCLK); hri_mclk_set_APBBMASK_USB_bit(MCLK);