25
25
26
26
UARTClass::UARTClass ( Uart *pUart, IRQn_Type dwIrq, uint32_t dwId, RingBuffer *pRx_buffer, RingBuffer *pTx_buffer )
27
27
{
28
- _rx_buffer = pRx_buffer ;
28
+ _rx_buffer = pRx_buffer;
29
29
_tx_buffer = pTx_buffer;
30
30
31
- _pUart=pUart ;
32
- _dwIrq=dwIrq ;
33
- _dwId=dwId ;
31
+ _pUart=pUart;
32
+ _dwIrq=dwIrq;
33
+ _dwId=dwId;
34
34
}
35
35
36
36
// Public Methods //////////////////////////////////////////////////////////////
37
37
38
-
39
-
40
38
void UARTClass::begin ( const uint32_t dwBaudRate )
41
39
{
42
- begin ( dwBaudRate, UART_MR_PAR_NO | UART_MR_CHMODE_NORMAL );
40
+ begin ( dwBaudRate, UART_MR_PAR_NO | UART_MR_CHMODE_NORMAL );
43
41
}
44
42
45
43
void UARTClass::begin ( const uint32_t dwBaudRate, const uint32_t config )
46
44
{
47
45
// Configure PMC
48
- pmc_enable_periph_clk ( _dwId ) ;
46
+ pmc_enable_periph_clk ( _dwId );
49
47
50
48
// Disable PDC channel
51
- _pUart->UART_PTCR = UART_PTCR_RXTDIS | UART_PTCR_TXTDIS ;
49
+ _pUart->UART_PTCR = UART_PTCR_RXTDIS | UART_PTCR_TXTDIS;
52
50
53
51
// Reset and disable receiver and transmitter
54
- _pUart->UART_CR = UART_CR_RSTRX | UART_CR_RSTTX | UART_CR_RXDIS | UART_CR_TXDIS ;
52
+ _pUart->UART_CR = UART_CR_RSTRX | UART_CR_RSTTX | UART_CR_RXDIS | UART_CR_TXDIS;
55
53
56
54
// Configure mode
57
- _pUart->UART_MR = config ;
55
+ _pUart->UART_MR = config;
58
56
59
57
// Configure baudrate (asynchronous, no oversampling)
60
- _pUart->UART_BRGR = (SystemCoreClock / dwBaudRate) >> 4 ;
58
+ _pUart->UART_BRGR = (SystemCoreClock / dwBaudRate) >> 4 ;
61
59
62
60
// Configure interrupts
63
61
_pUart->UART_IDR = 0xFFFFFFFF ;
@@ -66,41 +64,41 @@ void UARTClass::begin( const uint32_t dwBaudRate, const uint32_t config )
66
64
// Enable UART interrupt in NVIC
67
65
NVIC_EnableIRQ (_dwIrq);
68
66
69
- // make sure both ring buffers are initialized back to empty.
67
+ // Make sure both ring buffers are initialized back to empty.
70
68
_rx_buffer->_iHead = _rx_buffer->_iTail = 0 ;
71
69
_tx_buffer->_iHead = _tx_buffer->_iTail = 0 ;
72
70
73
71
// Enable receiver and transmitter
74
- _pUart->UART_CR = UART_CR_RXEN | UART_CR_TXEN ;
72
+ _pUart->UART_CR = UART_CR_RXEN | UART_CR_TXEN;
75
73
}
76
74
77
75
void UARTClass::end ( void )
78
76
{
79
- // clear any received data
80
- _rx_buffer->_iHead = _rx_buffer->_iTail ;
77
+ // Clear any received data
78
+ _rx_buffer->_iHead = _rx_buffer->_iTail ;
81
79
82
80
// Wait for any outstanding data to be sent
83
81
flush ();
84
82
85
83
// Disable UART interrupt in NVIC
86
- NVIC_DisableIRQ ( _dwIrq ) ;
84
+ NVIC_DisableIRQ ( _dwIrq );
87
85
88
- pmc_disable_periph_clk ( _dwId ) ;
86
+ pmc_disable_periph_clk ( _dwId );
89
87
}
90
88
91
89
void UARTClass::setInterruptPriority (uint32_t priority)
92
90
{
93
- NVIC_SetPriority (_dwIrq, priority & 0x0F );
91
+ NVIC_SetPriority (_dwIrq, priority & 0x0F );
94
92
}
95
93
96
94
uint32_t UARTClass::getInterruptPriority ()
97
95
{
98
- return NVIC_GetPriority (_dwIrq);
96
+ return NVIC_GetPriority (_dwIrq);
99
97
}
100
98
101
99
int UARTClass::available ( void )
102
100
{
103
- return (uint32_t )(SERIAL_BUFFER_SIZE + _rx_buffer->_iHead - _rx_buffer->_iTail ) % SERIAL_BUFFER_SIZE ;
101
+ return (uint32_t )(SERIAL_BUFFER_SIZE + _rx_buffer->_iHead - _rx_buffer->_iTail ) % SERIAL_BUFFER_SIZE;
104
102
}
105
103
106
104
int UARTClass::availableForWrite (void )
@@ -114,46 +112,50 @@ int UARTClass::availableForWrite(void)
114
112
int UARTClass::peek ( void )
115
113
{
116
114
if ( _rx_buffer->_iHead == _rx_buffer->_iTail )
117
- return -1 ;
115
+ return -1 ;
118
116
119
- return _rx_buffer->_aucBuffer [_rx_buffer->_iTail ] ;
117
+ return _rx_buffer->_aucBuffer [_rx_buffer->_iTail ];
120
118
}
121
119
122
120
int UARTClass::read ( void )
123
121
{
124
122
// if the head isn't ahead of the tail, we don't have any characters
125
123
if ( _rx_buffer->_iHead == _rx_buffer->_iTail )
126
- return -1 ;
124
+ return -1 ;
127
125
128
- uint8_t uc = _rx_buffer->_aucBuffer [_rx_buffer->_iTail ] ;
129
- _rx_buffer->_iTail = (unsigned int )(_rx_buffer->_iTail + 1 ) % SERIAL_BUFFER_SIZE ;
130
- return uc ;
126
+ uint8_t uc = _rx_buffer->_aucBuffer [_rx_buffer->_iTail ];
127
+ _rx_buffer->_iTail = (unsigned int )(_rx_buffer->_iTail + 1 ) % SERIAL_BUFFER_SIZE;
128
+ return uc;
131
129
}
132
130
133
131
void UARTClass::flush ( void )
134
132
{
135
133
while (_tx_buffer->_iHead != _tx_buffer->_iTail ); // wait for transmit data to be sent
136
134
// Wait for transmission to complete
137
135
while ((_pUart->UART_SR & UART_SR_TXRDY) != UART_SR_TXRDY)
138
- ;
136
+ ;
139
137
}
140
138
141
139
size_t UARTClass::write ( const uint8_t uc_data )
142
140
{
143
- if (((_pUart->UART_SR & UART_SR_TXRDY) != UART_SR_TXRDY) | (_tx_buffer->_iTail != _tx_buffer->_iHead )) // is the hardware currently busy?
141
+ // Is the hardware currently busy?
142
+ if (((_pUart->UART_SR & UART_SR_TXRDY) != UART_SR_TXRDY) |
143
+ (_tx_buffer->_iTail != _tx_buffer->_iHead ))
144
144
{
145
- // if busy we buffer
146
- unsigned int l = (_tx_buffer->_iHead + 1 ) % SERIAL_BUFFER_SIZE;
147
- while (_tx_buffer->_iTail == l); // spin locks if we're about to overwrite the buffer. This continues once the data is sent
148
-
149
- _tx_buffer->_aucBuffer [_tx_buffer->_iHead ] = uc_data;
150
- _tx_buffer->_iHead = l;
151
- _pUart->UART_IER = UART_IER_TXRDY; // make sure TX interrupt is enabled
145
+ // If busy we buffer
146
+ unsigned int l = (_tx_buffer->_iHead + 1 ) % SERIAL_BUFFER_SIZE;
147
+ while (_tx_buffer->_iTail == l)
148
+ ; // Spin locks if we're about to overwrite the buffer. This continues once the data is sent
149
+
150
+ _tx_buffer->_aucBuffer [_tx_buffer->_iHead ] = uc_data;
151
+ _tx_buffer->_iHead = l;
152
+ // Make sure TX interrupt is enabled
153
+ _pUart->UART_IER = UART_IER_TXRDY;
152
154
}
153
155
else
154
156
{
155
- // Send character
156
- _pUart->UART_THR = uc_data ;
157
+ // Bypass buffering and send character directly
158
+ _pUart->UART_THR = uc_data;
157
159
}
158
160
return 1 ;
159
161
}
@@ -162,28 +164,28 @@ void UARTClass::IrqHandler( void )
162
164
{
163
165
uint32_t status = _pUart->UART_SR ;
164
166
165
- // Did we receive data ?
167
+ // Did we receive data?
166
168
if ((status & UART_SR_RXRDY) == UART_SR_RXRDY)
167
169
_rx_buffer->store_char (_pUart->UART_RHR );
168
170
169
- // Do we need to keep sending data?
171
+ // Do we need to keep sending data?
170
172
if ((status & UART_SR_TXRDY) == UART_SR_TXRDY)
171
173
{
172
- if (_tx_buffer->_iTail != _tx_buffer->_iHead ) { // just in case
173
- _pUart->UART_THR = _tx_buffer->_aucBuffer [_tx_buffer->_iTail ];
174
- _tx_buffer->_iTail = (unsigned int )(_tx_buffer->_iTail + 1 ) % SERIAL_BUFFER_SIZE;
175
- }
176
- else
177
- {
178
- _pUart->UART_IDR = UART_IDR_TXRDY; // mask off transmit interrupt so we don't get it anymore
179
- }
174
+ if (_tx_buffer->_iTail != _tx_buffer->_iHead ) {
175
+ _pUart->UART_THR = _tx_buffer->_aucBuffer [_tx_buffer->_iTail ];
176
+ _tx_buffer->_iTail = (unsigned int )(_tx_buffer->_iTail + 1 ) % SERIAL_BUFFER_SIZE;
177
+ }
178
+ else
179
+ {
180
+ // Mask off transmit interrupt so we don't get it anymore
181
+ _pUart->UART_IDR = UART_IDR_TXRDY;
182
+ }
180
183
}
181
184
182
185
// Acknowledge errors
183
- if ((status & UART_SR_OVRE) == UART_SR_OVRE ||
184
- (status & UART_SR_FRAME) == UART_SR_FRAME)
186
+ if ((status & UART_SR_OVRE) == UART_SR_OVRE || (status & UART_SR_FRAME) == UART_SR_FRAME)
185
187
{
186
- // TODO: error reporting outside ISR
188
+ // TODO: error reporting outside ISR
187
189
_pUart->UART_CR |= UART_CR_RSTSTA;
188
190
}
189
191
}
0 commit comments