NANO102/112 BSP V3.03.003
The Board Support Package for Nano102/112 Series
uart.c
Go to the documentation of this file.
1/**************************************************************************/
13#include <stdio.h>
14#include "Nano1X2Series.h"
15
29extern uint32_t SysGet_PLLClockFreq(void);
30
31
32
41void UART_ClearIntFlag(UART_T* uart , uint32_t u32InterruptFlag)
42{
43
44 if(u32InterruptFlag & UART_ISR_RLS_IS_Msk) /* clear Receive Line Status Interrupt */
45 {
48 }
49
50 if(u32InterruptFlag & UART_ISR_MODEM_IS_Msk) /* clear Modem Interrupt */
52
53 if(u32InterruptFlag & UART_ISR_BUF_ERR_IS_Msk) /* clear Buffer Error Interrupt */
54 {
56 }
57
58 if(u32InterruptFlag & UART_ISR_WAKE_IS_Msk) /* clear wake up Interrupt */
59 {
61 }
62
63 if(u32InterruptFlag & UART_ISR_ABAUD_IS_Msk) /* clear auto-baud rate Interrupt */
64 {
66 }
67
68 if(u32InterruptFlag & UART_ISR_LIN_IS_Msk) /* clear LIN break Interrupt */
69 {
71 }
72
73}
74
75
83void UART_Close(UART_T* uart)
84{
85 uart->IER = 0;
86}
87
88
97{
99}
100
101
119void UART_DisableInt(UART_T* uart, uint32_t u32InterruptFlag )
120{
121 uart->IER &= ~ u32InterruptFlag;
122}
123
124
125
134{
137}
138
139
157void UART_EnableInt(UART_T* uart, uint32_t u32InterruptFlag )
158{
159 uart->IER |= u32InterruptFlag;
160}
161
162
171void 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 if( (u8UartClkSrcSel == 0x3) && (CLK->PWRCTL & CLK_PWRCTL_HIRC_FSEL_Msk) )
182 u32SrcFreq = __HIRC16M;
183 else
184 u32SrcFreq = u32ClkTbl[u8UartClkSrcSel];
185
186 u32SrcFreqDiv = (((CLK->CLKDIV0 & CLK_CLKDIV0_UART_N_Msk) >> CLK_CLKDIV0_UART_N_Pos) + 1);
187
188 if(u32SrcFreq == 0)
189 {
190 u32SrcFreq = SysGet_PLLClockFreq() / u32SrcFreqDiv;
191 }
192 else
193 {
194 u32SrcFreq = u32SrcFreq / u32SrcFreqDiv;
195 }
196
200
201 if(u32baudrate != 0)
202 {
203 u32Baud_Div = UART_BAUD_MODE0_DIVIDER(u32SrcFreq, u32baudrate);
204
205 if(u32Baud_Div > 0xFFFF)
206 uart->BAUD = (UART_BAUD_MODE1 | UART_BAUD_MODE1_DIVIDER(u32SrcFreq, u32baudrate));
207 else
208 uart->BAUD = (UART_BAUD_MODE0 | u32Baud_Div);
209 }
210}
211
212
223uint32_t UART_Read(UART_T* uart, uint8_t *pu8RxBuf, uint32_t u32ReadBytes)
224{
225 uint32_t u32Count, u32delayno;
226
227 for(u32Count=0; u32Count < u32ReadBytes; u32Count++)
228 {
229 u32delayno = 0;
230
231 while(uart->FSR & UART_FSR_RX_EMPTY_F_Msk) /* Check RX empty => failed */
232 {
233 u32delayno++;
234 if( u32delayno >= 0x40000000 )
235 return FALSE;
236 }
237 pu8RxBuf[u32Count] = uart->RBR; /* Get Data from UART RX */
238 }
239
240 return u32Count;
241
242}
243
244
257void UART_SetLine_Config(UART_T* uart, uint32_t u32baudrate, uint32_t u32data_width, uint32_t u32parity, uint32_t u32stop_bits)
258{
259 uint8_t u8UartClkSrcSel;
260 uint32_t u32ClkTbl[4] = {__HXT, __LXT, 0, __HIRC12M};
261 uint32_t u32Baud_Div = 0;
262 uint32_t u32SrcFreq;
263 uint32_t u32SrcFreqDiv;
264
265 u8UartClkSrcSel = (CLK->CLKSEL1 & CLK_CLKSEL1_UART_S_Msk) >> CLK_CLKSEL1_UART_S_Pos;
266
267 if( (u8UartClkSrcSel == 0x3) && (CLK->PWRCTL & CLK_PWRCTL_HIRC_FSEL_Msk) )
268 u32SrcFreq = __HIRC16M;
269 else
270 u32SrcFreq = u32ClkTbl[u8UartClkSrcSel];
271
272 u32SrcFreqDiv = (((CLK->CLKDIV0 & CLK_CLKDIV0_UART_N_Msk) >> CLK_CLKDIV0_UART_N_Pos) + 1);
273
274 if(u32SrcFreq == 0)
275 {
276 u32SrcFreq = SysGet_PLLClockFreq() / u32SrcFreqDiv;
277 }
278 else
279 {
280 u32SrcFreq = u32SrcFreq / u32SrcFreqDiv;
281 }
282
283 if(u32baudrate != 0)
284 {
285 u32Baud_Div = UART_BAUD_MODE0_DIVIDER(u32SrcFreq, u32baudrate);
286
287 if(u32Baud_Div > 0xFFFF)
288 uart->BAUD = (UART_BAUD_MODE1 | UART_BAUD_MODE1_DIVIDER(u32SrcFreq, u32baudrate));
289 else
290 uart->BAUD = (UART_BAUD_MODE0 | u32Baud_Div);
291 }
292
293 uart->TLCTL = u32data_width | u32parity | u32stop_bits;
294}
295
296
305void UART_SetTimeoutCnt(UART_T* uart, uint32_t u32TOC)
306{
307 uart->TMCTL = (uart->TMCTL & ~UART_TMCTL_TOIC_Msk)| (u32TOC);
308 uart->IER |= UART_IER_RTO_IE_Msk;
309}
310
311
321void UART_SelectIrDAMode(UART_T* uart, uint32_t u32Buadrate, uint32_t u32Direction)
322{
323 uint8_t u8UartClkSrcSel;
324 uint32_t u32ClkTbl[4] = {__HXT, __LXT, 0, __HIRC12M};
325 uint32_t u32SrcFreq;
326 uint32_t u32SrcFreqDiv;
327
328 u8UartClkSrcSel = (CLK->CLKSEL1 & CLK_CLKSEL1_UART_S_Msk) >> CLK_CLKSEL1_UART_S_Pos;
329
330 u32SrcFreq = u32ClkTbl[u8UartClkSrcSel];
331
332 u32SrcFreqDiv = (((CLK->CLKDIV0 & CLK_CLKDIV0_UART_N_Msk) >> CLK_CLKDIV0_UART_N_Pos) + 1);
333
334 if(u32SrcFreq == 0)
335 {
336 u32SrcFreq = SysGet_PLLClockFreq() / u32SrcFreqDiv;
337 }
338 else
339 {
340 u32SrcFreq = u32SrcFreq / u32SrcFreqDiv;
341 }
342
343 uart->BAUD = UART_BAUD_MODE1 | UART_BAUD_MODE1_DIVIDER(u32SrcFreq, u32Buadrate);
344
345 uart->IRCR &= ~UART_IRCR_INV_TX_Msk;
346 uart->IRCR |= UART_IRCR_INV_RX_Msk;
347 uart->IRCR = u32Direction ? uart->IRCR | UART_IRCR_TX_SELECT_Msk : uart->IRCR &~ UART_IRCR_TX_SELECT_Msk;
348 uart->FUN_SEL = (0x2 << UART_FUN_SEL_FUN_SEL_Pos);
349}
350
351
361void UART_SelectRS485Mode(UART_T* uart, uint32_t u32Mode, uint32_t u32Addr)
362{
364 uart->ALT_CTL = 0;
365 uart->ALT_CTL |= u32Mode | (u32Addr << UART_ALT_CTL_ADDR_PID_MATCH_Pos);
366}
367
382void UART_SelectLINMode(UART_T* uart, uint32_t u32Mode, uint32_t u32BreakLength)
383{
384 /* Select LIN function mode */
386
387 /* Select LIN function setting : Tx enable, Rx enable and break field length */
390 uart->ALT_CTL |= u32BreakLength & UART_ALT_CTL_LIN_TX_BCNT_Msk;
391 uart->ALT_CTL |= u32Mode;
392}
393
403uint32_t UART_Write(UART_T* uart,uint8_t *pu8TxBuf, uint32_t u32WriteBytes)
404{
405 uint32_t u32Count, u32delayno;
406
407 for(u32Count=0; u32Count != u32WriteBytes; u32Count++)
408 {
409 u32delayno = 0;
410 while((uart->FSR & UART_FSR_TX_EMPTY_F_Msk) == 0) /* Wait Tx empty and Time-out manner */
411 {
412 u32delayno++;
413 if( u32delayno >= 0x40000000 )
414 return FALSE;
415 }
416 uart->THR = pu8TxBuf[u32Count]; /* Send UART Data from buffer */
417 }
418
419 return u32Count;
420
421}
422
423 /* end of group NANO1X2_UART_EXPORTED_FUNCTIONS */
425 /* end of group NANO1X2_UART_Driver */
427 /* end of group NANO1X2_Device_Driver */
429
430/*** (C) COPYRIGHT 2014 Nuvoton Technology Corp. ***/
431
432
433
Nano102/112 peripheral access layer header file. This file contains all the peripheral register's def...
#define UART_FSR_BI_F_Msk
#define UART_MCSR_LEV_RTS_Msk
#define UART_IRCR_TX_SELECT_Msk
#define UART_ISR_ABAUD_IS_Msk
#define UART_IRCR_INV_RX_Msk
#define UART_TRSR_ABAUD_F_Msk
#define UART_TRSR_ABAUD_TOUT_F_Msk
#define UART_IER_RTO_IE_Msk
#define UART_FSR_TX_EMPTY_F_Msk
#define UART_TRSR_LIN_TX_F_Msk
#define UART_ALT_CTL_LIN_TX_BCNT_Msk
#define UART_FSR_RX_OVER_F_Msk
#define UART_TRSR_BIT_ERR_F_Msk
#define UART_ISR_BUF_ERR_IS_Msk
#define UART_FUN_SEL_FUN_SEL_Pos
#define UART_ISR_LIN_IS_Msk
#define UART_FSR_FE_F_Msk
#define UART_TRSR_RS485_ADDET_F_Msk
#define UART_FSR_PE_F_Msk
#define UART_ISR_WAKE_IS_Msk
#define UART_ISR_RLS_IS_Msk
#define UART_FSR_TX_OVER_F_Msk
#define UART_CTL_AUTO_RTS_EN_Msk
#define UART_FSR_RX_EMPTY_F_Msk
#define UART_ALT_CTL_LIN_RX_EN_Msk
#define UART_TRSR_LIN_RX_F_Msk
#define UART_CTL_AUTO_CTS_EN_Msk
#define UART_MCSR_LEV_CTS_Msk
#define UART_ALT_CTL_ADDR_PID_MATCH_Pos
#define UART_ALT_CTL_LIN_TX_EN_Msk
#define UART_MCSR_DCT_F_Msk
#define UART_ISR_MODEM_IS_Msk
#define CLK_CLKDIV0_UART_N_Pos
#define CLK_CLKDIV0_UART_N_Msk
#define CLK_CLKSEL1_UART_S_Pos
#define CLK_PWRCTL_HIRC_FSEL_Msk
#define CLK_CLKSEL1_UART_S_Msk
#define CLK
Pointer to CLK register structure.
#define UART_FUNC_SEL_LIN
Definition: uart.h:74
#define UART_PARITY_NONE
Definition: uart.h:43
#define UART_STOP_BIT_1
Definition: uart.h:49
#define UART_WORD_LEN_8
Definition: uart.h:41
#define UART_TLCTL_RFITL_1BYTE
Definition: uart.h:53
#define UART_TLCTL_RTS_TRI_LEV_1BYTE
Definition: uart.h:58
#define UART_FUNC_SEL_UART
Definition: uart.h:73
#define UART_FUNC_SEL_RS485
Definition: uart.h:76
void UART_SelectRS485Mode(UART_T *uart, uint32_t u32Mode, uint32_t u32Addr)
The function is used to set RS485 relative setting.
Definition: uart.c:361
void UART_SelectLINMode(UART_T *uart, uint32_t u32Mode, uint32_t u32BreakLength)
Select and configure LIN function.
Definition: uart.c:382
void UART_EnableInt(UART_T *uart, uint32_t u32InterruptFlag)
The function is used to enable UART specified interrupt.
Definition: uart.c:157
#define UART_BAUD_MODE1
Calculate UART baudrate mode0 divider.
Definition: uart.h:104
#define UART_BAUD_MODE0
Calculate UART baudrate mode0 divider.
Definition: uart.h:94
void UART_SetTimeoutCnt(UART_T *uart, uint32_t u32TOC)
This function use to set Rx timeout count.
Definition: uart.c:305
void UART_Close(UART_T *uart)
The function is used to disable UART.
Definition: uart.c:83
#define UART_BAUD_MODE0_DIVIDER(u32SrcFreq, u32BaudRate)
Calculate UART baudrate mode2 divider.
Definition: uart.h:126
void UART_ClearIntFlag(UART_T *uart, uint32_t u32InterruptFlag)
The function is used to clear UART specified interrupt flag.
Definition: uart.c:41
void UART_DisableFlowCtrl(UART_T *uart)
The function is used to disable UART auto flow control.
Definition: uart.c:96
void UART_EnableFlowCtrl(UART_T *uart)
The function is used to Enable UART auto flow control.
Definition: uart.c:133
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:403
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:257
void UART_DisableInt(UART_T *uart, uint32_t u32InterruptFlag)
The function is used to disable UART specified interrupt.
Definition: uart.c:119
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:321
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:223
uint32_t SysGet_PLLClockFreq(void)
Calculate current PLL clock frequency.
#define UART_BAUD_MODE1_DIVIDER(u32SrcFreq, u32BaudRate)
Calculate UART baudrate mode0 divider.
Definition: uart.h:116
void UART_Open(UART_T *uart, uint32_t u32baudrate)
This function use to enable UART function and set baud-rate.
Definition: uart.c:171
__IO uint32_t MCSR
__IO uint32_t BAUD
__IO uint32_t ISR
__IO uint32_t IER
__IO uint32_t FSR
__IO uint32_t TRSR
__IO uint32_t FUN_SEL
__IO uint32_t TLCTL
__IO uint32_t TMCTL
__IO uint32_t CTL
#define FALSE
Boolean false, define to use in API parameters or return value.
__O uint32_t THR
__IO uint32_t IRCR
__I uint32_t RBR
__IO uint32_t ALT_CTL
#define __HXT
#define __HIRC16M
#define __LXT
#define __HIRC12M