Skip to content

Commit 20104a6

Browse files
committed
Use asynchronous fractional mode to configure UART
1 parent 8a95c1e commit 20104a6

File tree

2 files changed

+14
-22
lines changed

2 files changed

+14
-22
lines changed

cores/arduino/SERCOM.cpp

+12-19
Original file line numberDiff line numberDiff line change
@@ -43,28 +43,21 @@ void SERCOM::initUART(SercomUartMode mode, SercomUartSampleRate sampleRate, uint
4343

4444
if ( mode == UART_INT_CLOCK )
4545
{
46-
uint16_t sampleRateValue ;
46+
uint16_t sampleRateValue;
4747

48-
if ( sampleRate == SAMPLE_RATE_x16 )
49-
{
50-
sampleRateValue = 16 ;
51-
}
52-
else
53-
{
54-
if ( sampleRate == SAMPLE_RATE_x8 )
55-
{
56-
sampleRateValue = 8 ;
57-
}
58-
else
59-
{
60-
sampleRateValue = 3 ;
61-
}
48+
if (sampleRate == SAMPLE_RATE_x16) {
49+
sampleRateValue = 16;
50+
} else {
51+
sampleRateValue = 8;
6252
}
6353

64-
// Asynchronous arithmetic mode
65-
// 65535 * ( 1 - sampleRateValue * baudrate / SystemCoreClock);
66-
// 65535 - 65535 * (sampleRateValue * baudrate / SystemCoreClock));
67-
sercom->USART.BAUD.reg = 65535.0f * ( 1.0f - (float)(sampleRateValue) * (float)(baudrate) / (float)(SystemCoreClock));
54+
// Asynchronous fractional mode (Table 24-2 in datasheet)
55+
// BAUD = fref / (sampleRateValue * fbaud)
56+
// (multiply by 8, to calculate fractional piece)
57+
uint32_t baudTimes8 = (SystemCoreClock * 8) / (sampleRateValue * baudrate);
58+
59+
sercom->USART.BAUD.FRAC.FP = (baudTimes8 % 8);
60+
sercom->USART.BAUD.FRAC.BAUD = (baudTimes8 / 8);
6861
}
6962
}
7063
void SERCOM::initFrame(SercomUartCharSize charSize, SercomDataOrder dataOrder, SercomParityMode parityMode, SercomNumberStopBit nbStopBits)

cores/arduino/SERCOM.h

+2-3
Original file line numberDiff line numberDiff line change
@@ -86,9 +86,8 @@ typedef enum
8686

8787
typedef enum
8888
{
89-
SAMPLE_RATE_x16 = 0, //Arithmetic
90-
SAMPLE_RATE_x8 = 0x2, //Arithmetic
91-
SAMPLE_RATE_x3 = 0x3 //Arithmetic
89+
SAMPLE_RATE_x16 = 0x1, //Fractional
90+
SAMPLE_RATE_x8 = 0x3, //Fractional
9291
} SercomUartSampleRate;
9392

9493
typedef enum

0 commit comments

Comments
 (0)