| Nano100AN Series BSP V3.02.002 The Board Support Package for Nano100AN Series

uart.c
Go to the documentation of this file.
1 /**************************************************************************/
13 #include <stdio.h>
14 #include "Nano100Series.h"
15
28 extern uint32_t SysGet_PLLClockFreq(void);
31
32
41 void UART_ClearIntFlag(UART_T* uart, uint32_t u32InterruptFlag)
42 {
43
44 if(u32InterruptFlag & UART_ISR_RLS_IS_Msk) /* clear Receive Line Status Interrupt */
45 {
46 uart->FSR |= UART_FSR_BI_F_Msk | UART_FSR_FE_F_Msk | UART_FSR_PE_F_Msk;
47 uart->TRSR |= UART_TRSR_RS485_ADDET_F_Msk;
48 }
49
50 if(u32InterruptFlag & UART_ISR_MODEM_IS_Msk) /* clear Modem Interrupt */
51 uart->MCSR |= UART_MCSR_DCT_F_Msk;
52
53 if(u32InterruptFlag & UART_ISR_BUF_ERR_IS_Msk) /* clear Buffer Error Interrupt */
54 {
55 uart->FSR |= UART_FSR_RX_OVER_F_Msk | UART_FSR_TX_OVER_F_Msk;
56 }
57
58 if(u32InterruptFlag & UART_ISR_WAKE_IS_Msk) /* clear wake up Interrupt */
59 {
60 uart->ISR |= UART_ISR_WAKE_IS_Msk;
61 }
62
63 if(u32InterruptFlag & UART_ISR_ABAUD_IS_Msk) /* clear auto-baud rate Interrupt */
64 {
65 uart->TRSR |= UART_TRSR_ABAUD_TOUT_F_Msk | UART_TRSR_ABAUD_F_Msk;
66 }
67
68 if(u32InterruptFlag & UART_ISR_LIN_IS_Msk) /* clear LIN break Interrupt */
69 {
70 uart->TRSR |= UART_TRSR_LIN_TX_F_Msk | UART_TRSR_LIN_RX_F_Msk | UART_TRSR_BIT_ERR_F_Msk;
71 }
72
73 }
74
75
83 void UART_Close(UART_T* uart)
84 {
85 uart->IER = 0;
86 }
87
88
96 void UART_DisableFlowCtrl(UART_T* uart)
97 {
98 uart->CTL &= ~(UART_CTL_AUTO_RTS_EN_Msk | UART_CTL_AUTO_CTS_EN_Msk);
99 }
100
101
119 void UART_DisableInt(UART_T* uart, uint32_t u32InterruptFlag )
120 {
121 uart->IER &= ~ u32InterruptFlag;
122 }
123
124
125
133 void UART_EnableFlowCtrl(UART_T* uart )
134 {
135 uart->MCSR |= UART_MCSR_LEV_RTS_Msk | UART_MCSR_LEV_CTS_Msk;
136 uart->CTL |= UART_CTL_AUTO_RTS_EN_Msk | UART_CTL_AUTO_CTS_EN_Msk;
137 }
138
139
157 void UART_EnableInt(UART_T* uart, uint32_t u32InterruptFlag )
158 {
159 uart->IER |= u32InterruptFlag;
160 }
161
162
171 void UART_Open(UART_T* uart, uint32_t u32baudrate)
172 {
173 uint8_t u8UartClkSrcSel;
174 uint32_t u32ClkTbl[4] = {__HXT, __LXT, 0, __HIRC12M};
175 uint32_t u32Baud_Div;
176 uint32_t u32SrcFreq;
177 uint32_t u32SrcFreqDiv;
178
179 u8UartClkSrcSel = (CLK->CLKSEL1 & CLK_CLKSEL1_UART_S_Msk) >> CLK_CLKSEL1_UART_S_Pos;
180
181 u32SrcFreq = u32ClkTbl[u8UartClkSrcSel];
182
183 u32SrcFreqDiv = (((CLK->CLKDIV0 & CLK_CLKDIV0_UART_N_Msk) >> CLK_CLKDIV0_UART_N_Pos) + 1);
184
185 if(u32SrcFreq == 0)
186 {
187 u32SrcFreq = SysGet_PLLClockFreq() / u32SrcFreqDiv;
188 }
189 else
190 {
191 u32SrcFreq = u32SrcFreq / u32SrcFreqDiv;
192 }
193
194 uart->FUN_SEL = UART_FUNC_SEL_UART;
195 uart->TLCTL = UART_WORD_LEN_8 | UART_PARITY_NONE | UART_STOP_BIT_1 |
196 UART_TLCTL_RFITL_1BYTE | UART_TLCTL_RTS_TRI_LEV_1BYTE;
197
198 if(u32baudrate != 0)
199 {
200 u32Baud_Div = UART_BAUD_MODE0_DIVIDER(u32SrcFreq, u32baudrate);
201
202 if(u32Baud_Div > 0xFFFF)
203 uart->BAUD = (UART_BAUD_MODE1 | UART_BAUD_MODE1_DIVIDER(u32SrcFreq, u32baudrate));
204 else
205 uart->BAUD = (UART_BAUD_MODE0 | u32Baud_Div);
206 }
207 }
208
209
220 uint32_t UART_Read(UART_T* uart, uint8_t *pu8RxBuf, uint32_t u32ReadBytes)
221 {
222 uint32_t u32Count, u32delayno;
223
224 for(u32Count=0; u32Count < u32ReadBytes; u32Count++)
225 {
226 u32delayno = 0;
227
228 while(uart->FSR & UART_FSR_RX_EMPTY_F_Msk) /* Check RX empty => failed */
229 {
230 u32delayno++;
231 if( u32delayno >= 0x40000000 )
232 return FALSE;
233 }
234 pu8RxBuf[u32Count] = uart->RBR; /* Get Data from UART RX */
235 }
236
237 return u32Count;
238
239 }
240
241
254 void UART_SetLine_Config(UART_T* uart, uint32_t u32baudrate, uint32_t u32data_width, uint32_t u32parity, uint32_t u32stop_bits)
255 {
256 uint8_t u8UartClkSrcSel;
257 uint32_t u32ClkTbl[4] = {__HXT, __LXT, 0, __HIRC12M};
258 uint32_t u32Baud_Div = 0;
259 uint32_t u32SrcFreq;
260 uint32_t u32SrcFreqDiv;
261
262 u8UartClkSrcSel = (CLK->CLKSEL1 & CLK_CLKSEL1_UART_S_Msk) >> CLK_CLKSEL1_UART_S_Pos;
263
264 u32SrcFreq = u32ClkTbl[u8UartClkSrcSel];
265
266 u32SrcFreqDiv = (((CLK->CLKDIV0 & CLK_CLKDIV0_UART_N_Msk) >> CLK_CLKDIV0_UART_N_Pos) + 1);
267
268 if(u32SrcFreq == 0)
269 {
270 u32SrcFreq = SysGet_PLLClockFreq() / u32SrcFreqDiv;
271 }
272 else
273 {
274 u32SrcFreq = u32SrcFreq / u32SrcFreqDiv;
275 }
276
277 if(u32baudrate != 0)
278 {
279 u32Baud_Div = UART_BAUD_MODE0_DIVIDER(u32SrcFreq, u32baudrate);
280
281 if(u32Baud_Div > 0xFFFF)
282 uart->BAUD = (UART_BAUD_MODE1 | UART_BAUD_MODE1_DIVIDER(u32SrcFreq, u32baudrate));
283 else
284 uart->BAUD = (UART_BAUD_MODE0 | u32Baud_Div);
285 }
286
287 uart->TLCTL = u32data_width | u32parity | u32stop_bits;
288 }
289
290
299 void UART_SetTimeoutCnt(UART_T* uart, uint32_t u32TOC)
300 {
301 uart->TMCTL = (uart->TMCTL & ~UART_TMCTL_TOIC_Msk)| (u32TOC);
302 uart->IER |= UART_IER_RTO_IE_Msk;
303 }
304
305
315 void UART_SelectIrDAMode(UART_T* uart, uint32_t u32Buadrate, uint32_t u32Direction)
316 {
317 uint8_t u8UartClkSrcSel;
318 uint32_t u32ClkTbl[4] = {__HXT, __LXT, 0, __HIRC12M};
319 uint32_t u32SrcFreq;
320 uint32_t u32SrcFreqDiv;
321
322 u8UartClkSrcSel = (CLK->CLKSEL1 & CLK_CLKSEL1_UART_S_Msk) >> CLK_CLKSEL1_UART_S_Pos;
323
324 u32SrcFreq = u32ClkTbl[u8UartClkSrcSel];
325
326 u32SrcFreqDiv = (((CLK->CLKDIV0 & CLK_CLKDIV0_UART_N_Msk) >> CLK_CLKDIV0_UART_N_Pos) + 1);
327
328 if(u32SrcFreq == 0)
329 {
330 u32SrcFreq = SysGet_PLLClockFreq() / u32SrcFreqDiv;
331 }
332 else
333 {
334 u32SrcFreq = u32SrcFreq / u32SrcFreqDiv;
335 }
336
337 uart->BAUD = UART_BAUD_MODE1 | UART_BAUD_MODE1_DIVIDER(u32SrcFreq, u32Buadrate);
338
339 uart->IRCR &= ~UART_IRCR_INV_TX_Msk;
340 uart->IRCR |= UART_IRCR_INV_RX_Msk;
341 uart->IRCR = u32Direction ? uart->IRCR | UART_IRCR_TX_SELECT_Msk : uart->IRCR &~ UART_IRCR_TX_SELECT_Msk;
342 uart->FUN_SEL = (0x2 << UART_FUN_SEL_FUN_SEL_Pos);
343 }
344
345
355 void UART_SelectRS485Mode(UART_T* uart, uint32_t u32Mode, uint32_t u32Addr)
356 {
357 uart->FUN_SEL = UART_FUNC_SEL_RS485;
358 uart->ALT_CTL = 0;
359 uart->ALT_CTL |= u32Mode | (u32Addr << UART_ALT_CTL_ADDR_PID_MATCH_Pos);
360 }
361
376 void UART_SelectLINMode(UART_T* uart, uint32_t u32Mode, uint32_t u32BreakLength)
377 {
378 /* Select LIN function mode */
379 uart->FUN_SEL = UART_FUNC_SEL_LIN;
380
381 /* Select LIN function setting : Tx enable, Rx enable and break field length */
382 uart->FUN_SEL = UART_FUNC_SEL_LIN;
383 uart->ALT_CTL &= ~(UART_ALT_CTL_LIN_TX_BCNT_Msk | UART_ALT_CTL_LIN_RX_EN_Msk | UART_ALT_CTL_LIN_TX_EN_Msk);
384 uart->ALT_CTL |= u32BreakLength & UART_ALT_CTL_LIN_TX_BCNT_Msk;
385 uart->ALT_CTL |= u32Mode;
386 }
387
397 uint32_t UART_Write(UART_T* uart,uint8_t *pu8TxBuf, uint32_t u32WriteBytes)
398 {
399 uint32_t u32Count, u32delayno;
400
401 for(u32Count=0; u32Count != u32WriteBytes; u32Count++)
402 {
403 u32delayno = 0;
404 while((uart->FSR & UART_FSR_TX_EMPTY_F_Msk) == 0) /* Wait Tx empty and Time-out manner */
405 {
406 u32delayno++;
407 if( u32delayno >= 0x40000000 )
408 return FALSE;
409 }
410 uart->THR = pu8TxBuf[u32Count]; /* Send UART Data from buffer */
411 }
412
413 return u32Count;
414
415 }
416
417 /* end of group NANO100_UART_EXPORTED_FUNCTIONS */
419 /* end of group NANO100_UART_Driver */
421 /* end of group NANO100_Device_Driver */
423
424 /*** (C) COPYRIGHT 2013 Nuvoton Technology Corp. ***/
425
426
427
UART_FUNC_SEL_LIN
#define UART_FUNC_SEL_LIN
Definition: uart.h:74
UART_FUN_SEL_FUN_SEL_Pos
#define UART_FUN_SEL_FUN_SEL_Pos
Definition: Nano100Series.h:9430
UART_TMCTL_TOIC_Msk
#define UART_TMCTL_TOIC_Msk
Definition: Nano100Series.h:9380
UART_WORD_LEN_8
#define UART_WORD_LEN_8
Definition: uart.h:41
UART_T::ALT_CTL
__IO uint32_t ALT_CTL
Definition: Nano100Series.h:9169
UART_CTL_AUTO_RTS_EN_Msk
#define UART_CTL_AUTO_RTS_EN_Msk
Definition: Nano100Series.h:9209
UART_FSR_RX_OVER_F_Msk
#define UART_FSR_RX_OVER_F_Msk
Definition: Nano100Series.h:9329
UART_T::FUN_SEL
__IO uint32_t FUN_SEL
Definition: Nano100Series.h:9184
UART_ALT_CTL_ADDR_PID_MATCH_Pos
#define UART_ALT_CTL_ADDR_PID_MATCH_Pos
Definition: Nano100Series.h:9427
UART_ISR_BUF_ERR_IS_Msk
#define UART_ISR_BUF_ERR_IS_Msk
Definition: Nano100Series.h:9296
UART_BAUD_MODE0_DIVIDER
#define UART_BAUD_MODE0_DIVIDER(u32SrcFreq, u32BaudRate)
Calculate UART baudrate mode2 divider.
Definition: uart.h:126
UART_Write
uint32_t UART_Write(UART_T *uart, uint8_t *pu8TxBuf, uint32_t u32WriteBytes)
The function is to write data into TX buffer to transmit data by UART.
Definition: uart.c:397
UART_SetLine_Config
void UART_SetLine_Config(UART_T *uart, uint32_t u32baudrate, uint32_t u32data_width, uint32_t u32parity, uint32_t u32stop_bits)
This function use to config UART line setting.
Definition: uart.c:254
UART_ISR_MODEM_IS_Msk
#define UART_ISR_MODEM_IS_Msk
Definition: Nano100Series.h:9290
UART_SelectIrDAMode
void UART_SelectIrDAMode(UART_T *uart, uint32_t u32Buadrate, uint32_t u32Direction)
The function is used to configure IrDA relative settings. It consists of TX or RX mode and baudrate.
Definition: uart.c:315
UART_FSR_TX_OVER_F_Msk
#define UART_FSR_TX_OVER_F_Msk
Definition: Nano100Series.h:9347
UART_ALT_CTL_LIN_TX_BCNT_Msk
#define UART_ALT_CTL_LIN_TX_BCNT_Msk
Definition: Nano100Series.h:9401
UART_ISR_LIN_IS_Msk
#define UART_ISR_LIN_IS_Msk
Definition: Nano100Series.h:9305
CLK_CLKSEL1_UART_S_Pos
#define CLK_CLKSEL1_UART_S_Pos
Definition: Nano100Series.h:1176
UART_BAUD_MODE0
#define UART_BAUD_MODE0
Calculate UART baudrate mode0 divider.
Definition: uart.h:94
SysGet_PLLClockFreq
uint32_t SysGet_PLLClockFreq(void)
Calculate current PLL clock frequency.
Definition: system_Nano100Series.c:28
UART_TLCTL_RTS_TRI_LEV_1BYTE
#define UART_TLCTL_RTS_TRI_LEV_1BYTE
Definition: uart.h:58
FALSE
#define FALSE
Boolean false, define to use in API parameters or return value.
Definition: Nano100Series.h:10287
CLK
#define CLK
Pointer to CLK register structure.
Definition: Nano100Series.h:10121
UART_FSR_RX_EMPTY_F_Msk
#define UART_FSR_RX_EMPTY_F_Msk
Definition: Nano100Series.h:9332
UART_T::FSR
__IO uint32_t FSR
Definition: Nano100Series.h:9026
UART_Close
void UART_Close(UART_T *uart)
The function is used to disable UART.
Definition: uart.c:83
UART_T::TRSR
__IO uint32_t TRSR
Definition: Nano100Series.h:8975
UART_T::IER
__IO uint32_t IER
Definition: Nano100Series.h:8875
UART_BAUD_MODE1
#define UART_BAUD_MODE1
Calculate UART baudrate mode0 divider.
Definition: uart.h:104
CLK_CLKDIV0_UART_N_Msk
#define CLK_CLKDIV0_UART_N_Msk
Definition: Nano100Series.h:1222
UART_ISR_ABAUD_IS_Msk
#define UART_ISR_ABAUD_IS_Msk
Definition: Nano100Series.h:9302
UART_MCSR_LEV_RTS_Msk
#define UART_MCSR_LEV_RTS_Msk
Definition: Nano100Series.h:9365
UART_ALT_CTL_LIN_TX_EN_Msk
#define UART_ALT_CTL_LIN_TX_EN_Msk
Definition: Nano100Series.h:9410
UART_T::RBR
__I uint32_t RBR
Definition: Nano100Series.h:8722
CLK_CLKSEL1_UART_S_Msk
#define CLK_CLKSEL1_UART_S_Msk
Definition: Nano100Series.h:1177
Nano100Series.h
Nano100 series peripheral access layer header file. This file contains all the peripheral register's ...
UART_T::ISR
__IO uint32_t ISR
Definition: Nano100Series.h:8923
UART_IRCR_INV_TX_Msk
#define UART_IRCR_INV_TX_Msk
Definition: Nano100Series.h:9395
UART_T::TMCTL
__IO uint32_t TMCTL
Definition: Nano100Series.h:9075
UART_ISR_WAKE_IS_Msk
#define UART_ISR_WAKE_IS_Msk
Definition: Nano100Series.h:9299
UART_SelectLINMode
void UART_SelectLINMode(UART_T *uart, uint32_t u32Mode, uint32_t u32BreakLength)
Select and configure LIN function.
Definition: uart.c:376
UART_PARITY_NONE
#define UART_PARITY_NONE
Definition: uart.h:43
UART_T::CTL
__IO uint32_t CTL
Definition: Nano100Series.h:8794
UART_FSR_PE_F_Msk
#define UART_FSR_PE_F_Msk
Definition: Nano100Series.h:9338
CLK_CLKDIV0_UART_N_Pos
#define CLK_CLKDIV0_UART_N_Pos
Definition: Nano100Series.h:1221
__HIRC12M
#define __HIRC12M
Definition: system_Nano100Series.h:28
UART_TRSR_RS485_ADDET_F_Msk
#define UART_TRSR_RS485_ADDET_F_Msk
Definition: Nano100Series.h:9308
UART_DisableFlowCtrl
void UART_DisableFlowCtrl(UART_T *uart)
The function is used to disable UART auto flow control.
Definition: uart.c:96
UART_T::MCSR
__IO uint32_t MCSR
Definition: Nano100Series.h:9052
UART_TRSR_LIN_RX_F_Msk
#define UART_TRSR_LIN_RX_F_Msk
Definition: Nano100Series.h:9320
UART_EnableInt
void UART_EnableInt(UART_T *uart, uint32_t u32InterruptFlag)
The function is used to enable UART specified interrupt and disable NVIC UART IRQ.
Definition: uart.c:157
UART_IRCR_INV_RX_Msk
#define UART_IRCR_INV_RX_Msk
Definition: Nano100Series.h:9398
__HXT
#define __HXT
Definition: system_Nano100Series.h:26
UART_ISR_RLS_IS_Msk
#define UART_ISR_RLS_IS_Msk
Definition: Nano100Series.h:9287
UART_T::TLCTL
__IO uint32_t TLCTL
Definition: Nano100Series.h:8838
UART_DisableInt
void UART_DisableInt(UART_T *uart, uint32_t u32InterruptFlag)
The function is used to disable UART specified interrupt and disable NVIC UART IRQ.
Definition: uart.c:119
UART_MCSR_DCT_F_Msk
#define UART_MCSR_DCT_F_Msk
Definition: Nano100Series.h:9377
__LXT
#define __LXT
Definition: system_Nano100Series.h:27
UART_TRSR_ABAUD_TOUT_F_Msk
#define UART_TRSR_ABAUD_TOUT_F_Msk
Definition: Nano100Series.h:9314
UART_IER_RTO_IE_Msk
#define UART_IER_RTO_IE_Msk
Definition: Nano100Series.h:9266
UART_FUNC_SEL_RS485
#define UART_FUNC_SEL_RS485
Definition: uart.h:76
UART_ALT_CTL_LIN_RX_EN_Msk
#define UART_ALT_CTL_LIN_RX_EN_Msk
Definition: Nano100Series.h:9407
UART_SetTimeoutCnt
void UART_SetTimeoutCnt(UART_T *uart, uint32_t u32TOC)
This function use to set Rx timeout count.
Definition: uart.c:299
UART_MCSR_LEV_CTS_Msk
#define UART_MCSR_LEV_CTS_Msk
Definition: Nano100Series.h:9371
UART_TRSR_LIN_TX_F_Msk
#define UART_TRSR_LIN_TX_F_Msk
Definition: Nano100Series.h:9317
UART_CTL_AUTO_CTS_EN_Msk
#define UART_CTL_AUTO_CTS_EN_Msk
Definition: Nano100Series.h:9212
UART_TRSR_BIT_ERR_F_Msk
#define UART_TRSR_BIT_ERR_F_Msk
Definition: Nano100Series.h:9323
UART_STOP_BIT_1
#define UART_STOP_BIT_1
Definition: uart.h:49
UART_ClearIntFlag
void UART_ClearIntFlag(UART_T *uart, uint32_t u32InterruptFlag)
The function is used to clear UART specified interrupt flag.
Definition: uart.c:41
UART_SelectRS485Mode
void UART_SelectRS485Mode(UART_T *uart, uint32_t u32Mode, uint32_t u32Addr)
The function is used to set RS485 relative setting.
Definition: uart.c:355
UART_FSR_FE_F_Msk
#define UART_FSR_FE_F_Msk
Definition: Nano100Series.h:9341
UART_T
Definition: Nano100Series.h:8705
UART_T::IRCR
__IO uint32_t IRCR
Definition: Nano100Series.h:9116
UART_FSR_TX_EMPTY_F_Msk
#define UART_FSR_TX_EMPTY_F_Msk
Definition: Nano100Series.h:9350
UART_Read
uint32_t UART_Read(UART_T *uart, uint8_t *pu8RxBuf, uint32_t u32ReadBytes)
The function is used to read Rx data from RX FIFO and the data will be stored in pu8RxBuf.
Definition: uart.c:220
UART_TRSR_ABAUD_F_Msk
#define UART_TRSR_ABAUD_F_Msk
Definition: Nano100Series.h:9311
UART_T::THR
__O uint32_t THR
Definition: Nano100Series.h:8735
UART_Open
void UART_Open(UART_T *uart, uint32_t u32baudrate)
This function use to enable UART function and set baud-rate.
Definition: uart.c:171
UART_FSR_BI_F_Msk
#define UART_FSR_BI_F_Msk
Definition: Nano100Series.h:9344
UART_EnableFlowCtrl
void UART_EnableFlowCtrl(UART_T *uart)
The function is used to Enable UART auto flow control.
Definition: uart.c:133
UART_FUNC_SEL_UART
#define UART_FUNC_SEL_UART
Definition: uart.h:73
UART_TLCTL_RFITL_1BYTE
#define UART_TLCTL_RFITL_1BYTE
Definition: uart.h:53
UART_IRCR_TX_SELECT_Msk
#define UART_IRCR_TX_SELECT_Msk
Definition: Nano100Series.h:9392
UART_T::BAUD
__IO uint32_t BAUD
Definition: Nano100Series.h:9091
UART_BAUD_MODE1_DIVIDER
#define UART_BAUD_MODE1_DIVIDER(u32SrcFreq, u32BaudRate)
Calculate UART baudrate mode0 divider.
Definition: uart.h:116