Skip to content
Snippets Groups Projects
Commit a87d16a3 authored by Thibaut VIARD's avatar Thibaut VIARD
Browse files

Merge pull request #20 from LeGeek/zero

Fix UART baudrate and EDBG.
parents a48627b3 07e782b2
No related branches found
No related tags found
No related merge requests found
...@@ -17,12 +17,11 @@ SERCOM::SERCOM(Sercom* s) ...@@ -17,12 +17,11 @@ SERCOM::SERCOM(Sercom* s)
* ===== Sercom UART * ===== Sercom UART
* ========================= * =========================
*/ */
void SERCOM::initUART(SercomUartMode mode, SercomUartSampleRate sampleRate, uint32_t baudrate) void SERCOM::initUART(SercomUartMode mode, SercomUartSampleRate sampleRate, uint32_t baudrate)
{ {
resetUART(); resetUART();
initClock(); initClock();
initNVIC();
//Setting the CTRLA register //Setting the CTRLA register
sercom->USART.CTRLA.reg = SERCOM_USART_CTRLA_MODE(mode) | sercom->USART.CTRLA.reg = SERCOM_USART_CTRLA_MODE(mode) |
...@@ -32,12 +31,10 @@ void SERCOM::initUART(SercomUartMode mode, SercomUartSampleRate sampleRate, uint ...@@ -32,12 +31,10 @@ void SERCOM::initUART(SercomUartMode mode, SercomUartSampleRate sampleRate, uint
sercom->USART.INTENSET.reg = SERCOM_USART_INTENSET_RXC | //Received complete sercom->USART.INTENSET.reg = SERCOM_USART_INTENSET_RXC | //Received complete
SERCOM_USART_INTENSET_ERROR; //All others errors SERCOM_USART_INTENSET_ERROR; //All others errors
NVIC_EnableIRQ(SERCOM0_IRQn);
NVIC_SetPriority (SERCOM0_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Systick Interrupt */
if(mode == UART_INT_CLOCK) if(mode == UART_INT_CLOCK)
{ {
uint32_t sampleRateValue; uint16_t sampleRateValue;
if(sampleRate == SAMPLE_RATE_x16) if(sampleRate == SAMPLE_RATE_x16)
sampleRateValue = 16; sampleRateValue = 16;
...@@ -47,13 +44,9 @@ void SERCOM::initUART(SercomUartMode mode, SercomUartSampleRate sampleRate, uint ...@@ -47,13 +44,9 @@ void SERCOM::initUART(SercomUartMode mode, SercomUartSampleRate sampleRate, uint
sampleRateValue = 3; sampleRateValue = 3;
//Asynchronous arithmetic mode //Asynchronous arithmetic mode
//sercom->USART.BAUD.reg = 65535 * ( 1 - sampleRateValue * division(baudrate,SERCOM_FREQ_REF)); //65535 * ( 1 - sampleRateValue * baudrate / SERCOM_FREQ_REF);
uint16_t tmpBaud = (baudrate / SERCOM_FREQ_REF); sercom->USART.BAUD.reg = 65535.0 * ( 1.0 - (float)(sampleRateValue) * (float)(baudrate) / (float)(SERCOM_FREQ_REF));
tmpBaud = ( 1 - sampleRateValue * tmpBaud);
tmpBaud = (65535ul) * tmpBaud;
tmpBaud = 63019;
sercom->USART.BAUD.reg = tmpBaud;
} }
} }
void SERCOM::initFrame(SercomUartCharSize charSize, SercomDataOrder dataOrder, SercomParityMode parityMode, SercomNumberStopBit nbStopBits) void SERCOM::initFrame(SercomUartCharSize charSize, SercomDataOrder dataOrder, SercomParityMode parityMode, SercomNumberStopBit nbStopBits)
...@@ -303,42 +296,7 @@ bool SERCOM::isReceiveCompleteSPI() ...@@ -303,42 +296,7 @@ bool SERCOM::isReceiveCompleteSPI()
uint8_t SERCOM::calculateBaudrateSynchronous(uint32_t baudrate) uint8_t SERCOM::calculateBaudrateSynchronous(uint32_t baudrate)
{ {
return division(SERCOM_FREQ_REF, (2 * baudrate)) - 1; return SERCOM_FREQ_REF / (2 * baudrate) - 1;
}
uint32_t SERCOM::division(uint32_t dividend, uint32_t divisor)
{
//// division WITHOUT division operator
//
//uint32_t denom = divisor;
//uint32_t current = 1;
//uint32_t answer = 0;
//
//if ( denom > dividend)
//return 0;
//
//if ( denom == dividend)
//return 1;
//
//while (denom <= dividend) {
//denom <<= 1;
//current <<= 1;
//}
//
//denom >>= 1;
//current >>= 1;
//
//while (current!=0) {
//if ( dividend >= denom) {
//dividend -= denom;
//answer |= current;
//}
//current >>= 1;
//denom >>= 1;
//}
//
//return answer;
} }
...@@ -537,7 +495,7 @@ uint8_t SERCOM::readDataWIRE() ...@@ -537,7 +495,7 @@ uint8_t SERCOM::readDataWIRE()
void SERCOM::initClock() void SERCOM::initClock()
{ {
uint8_t clockId; uint8_t clockId = 0;
if(sercom == SERCOM0) if(sercom == SERCOM0)
{ {
...@@ -576,6 +534,39 @@ void SERCOM::initClock() ...@@ -576,6 +534,39 @@ void SERCOM::initClock()
} }
} }
void SERCOM::initNVIC()
{
IRQn_Type nvicID;
if(sercom == SERCOM0)
{
nvicID = SERCOM0_IRQn;
}
else if(sercom == SERCOM1)
{
nvicID = SERCOM1_IRQn;
}
else if(sercom == SERCOM2)
{
nvicID = SERCOM2_IRQn;
}
else if(sercom == SERCOM3)
{
nvicID = SERCOM3_IRQn;
}
else if(sercom == SERCOM4)
{
nvicID = SERCOM4_IRQn;
}
else if(sercom == SERCOM5)
{
nvicID = SERCOM5_IRQn;
}
NVIC_EnableIRQ(nvicID);
NVIC_SetPriority (nvicID, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Systick Interrupt */
}
/* ========================= /* =========================
* ===== SERCOM DEFINITION * ===== SERCOM DEFINITION
* ========================= * =========================
......
...@@ -199,6 +199,7 @@ class SERCOM ...@@ -199,6 +199,7 @@ class SERCOM
uint8_t calculateBaudrateSynchronous(uint32_t baudrate); uint8_t calculateBaudrateSynchronous(uint32_t baudrate);
uint32_t division(uint32_t dividend, uint32_t divisor); uint32_t division(uint32_t dividend, uint32_t divisor);
void initClock(); void initClock();
void initNVIC();
}; };
#endif #endif
#include "Uart.h" #include "Uart.h"
Uart::Uart(SERCOM *sercom) Uart::Uart(SERCOM *s, uint8_t pinRX, uint8_t pinTX)
{ {
this->sercom = sercom; sercom = s;
pinPeripheral(0, PIO_SERCOM); if(sercom == SERCOM::sercom0)
pinPeripheral(1, PIO_SERCOM); {
pinPeripheral(pinRX, g_APinDescription[pinRX].ulPinType);
pinPeripheral(pinTX, g_APinDescription[pinTX].ulPinType);
}
else if(sercom == SERCOM::sercom5)
{
pinPeripheral(pinRX, g_APinDescription[pinRX].ulPinType);
pinPeripheral(pinTX, g_APinDescription[pinTX].ulPinType);
}
} }
void Uart::begin(unsigned long baudrate) void Uart::begin(unsigned long baudrate)
{ {
begin(baudrate, SERIAL_8N1); begin(baudrate, (uint8_t)SERIAL_8N1);
} }
void Uart::begin(unsigned long baudrate, uint8_t config) void Uart::begin(unsigned long baudrate, uint8_t config)
...@@ -132,7 +140,8 @@ SercomParityMode Uart::extractParity(uint8_t config) ...@@ -132,7 +140,8 @@ SercomParityMode Uart::extractParity(uint8_t config)
} }
} }
Uart Serial = Uart(SERCOM::sercom0); Uart Serial = Uart(SERCOM::sercom0, 0, 1);
Uart Serial5 = Uart(SERCOM::sercom5, 36, 35);
void SERCOM0_Handler() void SERCOM0_Handler()
{ {
...@@ -140,5 +149,5 @@ void SERCOM0_Handler() ...@@ -140,5 +149,5 @@ void SERCOM0_Handler()
} }
void SERCOM5_Handler() void SERCOM5_Handler()
{ {
Serial.IrqHandler(); Serial5.IrqHandler();
} }
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
class Uart : public HardwareSerial class Uart : public HardwareSerial
{ {
public: public:
Uart(SERCOM *sercom); Uart(SERCOM *s, uint8_t pinRX, uint8_t pinTX);
void begin(unsigned long baudRate); void begin(unsigned long baudRate);
void begin(unsigned long baudrate, uint8_t config); void begin(unsigned long baudrate, uint8_t config);
void end(); void end();
...@@ -37,6 +37,7 @@ class Uart : public HardwareSerial ...@@ -37,6 +37,7 @@ class Uart : public HardwareSerial
SercomParityMode extractParity(uint8_t config); SercomParityMode extractParity(uint8_t config);
}; };
extern Uart Serial; extern Uart Serial;
extern Uart Serial5;
#endif #endif
...@@ -18,7 +18,7 @@ SPIClass::SPIClass(SERCOM *s) ...@@ -18,7 +18,7 @@ SPIClass::SPIClass(SERCOM *s)
void SPIClass::begin() { void SPIClass::begin() {
// Default speed set to 4Mhz, SPI mode set to MODE 0 and Bit order set to MSB first. // Default speed set to 4Mhz, SPI mode set to MODE 0 and Bit order set to MSB first.
sercom->initSPI(SPI_PAD_2_SCK_3, SERCOM_RX_PAD_0, SPI_CHAR_SIZE_8_BITS, MSB_FIRST); sercom->initSPI(SPI_PAD_2_SCK_3, SERCOM_RX_PAD_0, SPI_CHAR_SIZE_8_BITS, MSB_FIRST);
sercom->initClock(SERCOM_SPI_MODE_0, 4000000); sercom->initSPIClock(SERCOM_SPI_MODE_0, 4000000);
} }
void SPIClass::end() { void SPIClass::end() {
...@@ -86,6 +86,4 @@ void SPIClass::detachInterrupt() { ...@@ -86,6 +86,4 @@ void SPIClass::detachInterrupt() {
// Should be disableInterrupt() // Should be disableInterrupt()
} }
#if SPI_INTERFACES_COUNT > 0
SPIClass SPI(SERCOM::sercom4); SPIClass SPI(SERCOM::sercom4);
#endif
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment