From 03ef25d2fd02098d1db275f4d655b14140cabe20 Mon Sep 17 00:00:00 2001
From: Jonathan BAUDIN <jonathan.baudin@atmel.com>
Date: Tue, 13 May 2014 11:07:05 +0200
Subject: [PATCH]  Refactoring UART functions

---
 cores/arduino/SERCOM.cpp | 50 +++++++++++-----------------------------
 cores/arduino/SERCOM.h   |  2 +-
 2 files changed, 15 insertions(+), 37 deletions(-)

diff --git a/cores/arduino/SERCOM.cpp b/cores/arduino/SERCOM.cpp
index 2d31c245..16670b8f 100644
--- a/cores/arduino/SERCOM.cpp
+++ b/cores/arduino/SERCOM.cpp
@@ -20,8 +20,7 @@ SERCOM::SERCOM(Sercom* s)
 void SERCOM::initUART(SercomUartMode mode, SercomUartSampleRate sampleRate, uint32_t baudrate)
 {		
 	resetUART();
-	initClock();
-	initNVIC();
+	initClockNvic();
 	
 	//Setting the CTRLA register
 	sercom->USART.CTRLA.reg =	SERCOM_USART_CTRLA_MODE(mode) |
@@ -154,6 +153,7 @@ int SERCOM::writeDataUART(uint8_t data)
 void SERCOM::initSPI(SercomSpiTXPad mosi, SercomRXPad miso, SercomSpiCharSize charSize, SercomDataOrder dataOrder)
 {
 	resetSPI();
+	initClockNvic();
 	
 	//Setting the CTRLA register
 	sercom->SPI.CTRLA.reg =	SERCOM_SPI_CTRLA_MODE(SPI_MASTER_OPERATION) |
@@ -493,35 +493,46 @@ uint8_t SERCOM::readDataWIRE()
 }
 
 
-void SERCOM::initClock()
+void SERCOM::initClockNvic()
 {
 	uint8_t clockId = 0;
+	IRQn_Type Id;
 	
 	if(sercom == SERCOM0)
 	{
 		clockId = GENERIC_CLOCK_SERCOM0;
+		Id = SERCOM0_IRQn;
 	}
 	else if(sercom == SERCOM1)
 	{
 		clockId = GENERIC_CLOCK_SERCOM1;
+		Id = SERCOM1_IRQn;
 	}
 	else if(sercom == SERCOM2)
 	{
 		clockId = GENERIC_CLOCK_SERCOM2;
+		Id = SERCOM2_IRQn;
 	}
 	else if(sercom == SERCOM3)
 	{
 		clockId = GENERIC_CLOCK_SERCOM3;
+		Id = SERCOM3_IRQn;
 	}
 	else if(sercom == SERCOM4)
 	{
 		clockId = GENERIC_CLOCK_SERCOM4;
+		Id = SERCOM4_IRQn;
 	}
 	else if(sercom == SERCOM5)
 	{
 		clockId = GENERIC_CLOCK_SERCOM5;
+		Id = SERCOM5_IRQn;
 	}
 	
+	//Setting NVIC
+	NVIC_EnableIRQ(Id);
+	NVIC_SetPriority (Id, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority */
+	
 	//Setting clock
 	GCLK->CLKCTRL.reg = GCLK_CLKCTRL_ID( clockId ) | // Generic Clock 0 (SERCOMx)
 	GCLK_CLKCTRL_GEN_GCLK0 | // Generic Clock Generator 0 is source
@@ -534,39 +545,6 @@ void SERCOM::initClock()
 	}
 }
 
-void SERCOM::initNVIC()
-{
-		IRQn_Type Id;
-		
-		if(sercom == SERCOM0)
-		{
-			Id = SERCOM0_IRQn;
-		}
-		else if(sercom == SERCOM1)
-		{
-			Id = SERCOM1_IRQn;
-		}
-		else if(sercom == SERCOM2)
-		{
-			Id = SERCOM2_IRQn;
-		}
-		else if(sercom == SERCOM3)
-		{
-			Id = SERCOM3_IRQn;
-		}
-		else if(sercom == SERCOM4)
-		{
-			Id = SERCOM4_IRQn;
-		}
-		else if(sercom == SERCOM5)
-		{
-			Id = SERCOM5_IRQn;
-		}
-		
-	NVIC_EnableIRQ(Id);
-	NVIC_SetPriority (Id, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority */
-}
-
 /*	=========================
  *	===== SERCOM DEFINITION
  *	=========================
diff --git a/cores/arduino/SERCOM.h b/cores/arduino/SERCOM.h
index 132e60fa..8a1f9bd5 100644
--- a/cores/arduino/SERCOM.h
+++ b/cores/arduino/SERCOM.h
@@ -198,7 +198,7 @@ class SERCOM
 		Sercom* sercom;
 		uint8_t calculateBaudrateSynchronous(uint32_t baudrate);
 		uint32_t division(uint32_t dividend, uint32_t divisor);
-		void initClock();
+		void initClockNvic();
 		void initNVIC();
 };
 
-- 
GitLab