Mini51 BSP  V3.02.002
The Board Support Package for Mini51 Series
uart.c
Go to the documentation of this file.
1 /**************************************************************************/
13 #include <stdio.h>
14 #include "Mini51Series.h"
15 
37 void UART_ClearIntFlag(UART_T* uart, uint32_t u32InterruptFlag)
38 {
39 
40  if(u32InterruptFlag & UART_ISR_RLS_INT_Msk) /* clear Receive Line Status Interrupt */
41  {
44  }
45 
46  if(u32InterruptFlag & UART_ISR_MODEM_INT_Msk) /* clear Modem Interrupt */
47  uart->MSR |= UART_MSR_DCTSF_Msk;
48 
49  if(u32InterruptFlag & UART_ISR_BUF_ERR_INT_Msk) /* clear Buffer Error Interrupt */
50  {
52  }
53 
54  if(u32InterruptFlag & UART_ISR_TOUT_INT_Msk) /* clear Modem Interrupt */
55  uart->ISR |= UART_ISR_TOUT_IF_Msk;
56 
57 }
58 
59 
67 void UART_Close(UART_T* uart)
68 {
69  uart->IER = 0;
70 }
71 
72 
81 {
83 }
84 
85 
102 void UART_DisableInt(UART_T* uart, uint32_t u32InterruptFlag )
103 {
104  uart->IER &= ~ u32InterruptFlag;
105 }
106 
107 
108 
117 {
118  uart->MCR |= UART_MCR_LEV_RTS_Msk;
119  uart->MCR &= ~UART_MCR_RTS_Msk;
120  uart->MSR |= UART_MSR_LEV_CTS_Msk;
122 }
123 
124 
141 void UART_EnableInt(UART_T* uart, uint32_t u32InterruptFlag )
142 {
143  uart->IER |= u32InterruptFlag;
144 }
145 
146 
155 void UART_Open(UART_T* uart, uint32_t u32baudrate)
156 {
157  uint8_t u8UartClkSrcSel;
158  uint32_t u32ClkDiv = 0;
159  uint32_t u32Clk = 0;
160  uint32_t u32ClkTbl[4] = {__XTAL, 0, __IRC22M, __IRC22M};
161  uint32_t u32Baud_Div;
162  u8UartClkSrcSel = (CLK->CLKSEL1 & CLK_CLKSEL1_UART_S_Msk) >> CLK_CLKSEL1_UART_S_Pos;
163 
164  u32ClkDiv = ( (CLK->CLKDIV & CLK_CLKDIV_UART_N_Msk) >> CLK_CLKDIV_UART_N_Pos );
165 
166  uart->FUN_SEL = UART_FUNC_SEL_UART;
169 
170  u32Clk = u32ClkTbl[u8UartClkSrcSel]/(u32ClkDiv + 1);
171 
172  if(u32baudrate != 0)
173  {
174  u32Baud_Div = UART_BAUD_MODE2_DIVIDER(u32Clk, u32baudrate);
175 
176  if(u32Baud_Div > 0xFFFF)
177  uart->BAUD = (UART_BAUD_MODE0 | UART_BAUD_MODE0_DIVIDER(u32Clk, u32baudrate));
178  else
179  uart->BAUD = (UART_BAUD_MODE2 | u32Baud_Div);
180  }
181 
182 }
183 
184 
195 uint32_t UART_Read(UART_T* uart, uint8_t *pu8RxBuf, uint32_t u32ReadBytes)
196 {
197  uint32_t u32Count, u32delayno;
198 
199  for(u32Count=0; u32Count < u32ReadBytes; u32Count++)
200  {
201  u32delayno = 0;
202 
203  while(uart->FSR & UART_FSR_RX_EMPTY_Msk) /* Check RX empty => failed */
204  {
205  u32delayno++;
206  if( u32delayno >= 0x40000000 )
207  return FALSE;
208  }
209  pu8RxBuf[u32Count] = uart->RBR; /* Get Data from UART RX */
210  }
211 
212  return u32Count;
213 
214 }
215 
216 
229 void UART_SetLine_Config(UART_T* uart, uint32_t u32baudrate, uint32_t u32data_width, uint32_t u32parity, uint32_t u32stop_bits)
230 {
231  uint8_t u8UartClkSrcSel;
232  uint32_t u32ClkDiv = 0;
233  uint32_t u32Clk = 0;
234  uint32_t u32ClkTbl[4] = {__XTAL, 0, __IRC22M, __IRC22M};
235  uint32_t u32Baud_Div = 0;
236  u8UartClkSrcSel = (CLK->CLKSEL1 & CLK_CLKSEL1_UART_S_Msk) >> CLK_CLKSEL1_UART_S_Pos;
237 
238  u32ClkDiv = ( (CLK->CLKDIV & CLK_CLKDIV_UART_N_Msk) >> CLK_CLKDIV_UART_N_Pos );
239 
240  u32Clk = u32ClkTbl[u8UartClkSrcSel]/(u32ClkDiv + 1);
241 
242  if(u32baudrate != 0)
243  {
244  u32Baud_Div = UART_BAUD_MODE2_DIVIDER(u32Clk, u32baudrate);
245 
246  if(u32Baud_Div > 0xFFFF)
247  uart->BAUD = (UART_BAUD_MODE0 | UART_BAUD_MODE0_DIVIDER(u32Clk, u32baudrate));
248  else
249  uart->BAUD = (UART_BAUD_MODE2 | u32Baud_Div);
250  }
251 
252  uart->LCR = u32data_width | u32parity | u32stop_bits;
253 }
254 
255 
264 void UART_SetTimeoutCnt(UART_T* uart, uint32_t u32TOC)
265 {
266  uart->TOR = (uart->TOR & ~UART_TOR_TOIC_Msk)| (u32TOC);
267  uart->IER |= UART_IER_TIME_OUT_EN_Msk;
268 }
269 
270 
280 void UART_SelectIrDAMode(UART_T* uart, uint32_t u32Buadrate, uint32_t u32Direction)
281 {
282  uint8_t u8UartClkSrcSel = 0;
283  uint32_t u32ClkDiv = 0;
284  uint32_t u32Clk = 0;
285  uint32_t u32Baud_Div = 0;
286 
287  u8UartClkSrcSel = (CLK->CLKSEL1 & CLK_CLKSEL1_UART_S_Msk) >> CLK_CLKSEL1_UART_S_Pos;
288 
289  u32ClkDiv = ( (CLK->CLKDIV & CLK_CLKDIV_UART_N_Msk) >> CLK_CLKDIV_UART_N_Pos );
290 
291  if(u8UartClkSrcSel == 0)
292  u32Clk = __XTAL;
293  else if(u8UartClkSrcSel >= 2)
294  u32Clk = __IRC22M;
295 
296  u32Clk = u32Clk/(u32ClkDiv + 1);
297 
298  if(u32Buadrate != 0)
299  {
300  u32Baud_Div = UART_BAUD_MODE2_DIVIDER(u32Clk, u32Buadrate);
301 
302  if(u32Baud_Div > 0xFFFF)
303  uart->BAUD = (UART_BAUD_MODE0 | UART_BAUD_MODE0_DIVIDER(u32Clk, u32Buadrate));
304  else
305  uart->BAUD = (UART_BAUD_MODE2 | u32Baud_Div);
306  }
307 
308  uart->IRCR &= ~UART_IRCR_INV_TX_Msk;
309  uart->IRCR |= UART_IRCR_INV_RX_Msk;
310  uart->IRCR = u32Direction ? uart->IRCR | UART_IRCR_TX_SELECT_Msk : uart->IRCR &~ UART_IRCR_TX_SELECT_Msk;
311  uart->FUN_SEL = (0x2 << UART_FUN_SEL_FUN_SEL_Pos);
312 }
313 
314 
324 void UART_SelectRS485Mode(UART_T* uart, uint32_t u32Mode, uint32_t u32Addr)
325 {
327  uart->ALT_CSR = 0;
328  uart->ALT_CSR |= u32Mode | (u32Addr << UART_ALT_CSR_ADDR_MATCH_Pos);
329 }
330 
331 
341 uint32_t UART_Write(UART_T* uart,uint8_t *pu8TxBuf, uint32_t u32WriteBytes)
342 {
343  uint32_t u32Count, u32delayno;
344 
345  for(u32Count=0; u32Count != u32WriteBytes; u32Count++)
346  {
347  u32delayno = 0;
348  while((uart->FSR & UART_FSR_TE_FLAG_Msk) == 0) /* Wait Tx empty and Time-out manner */
349  {
350  u32delayno++;
351  if( u32delayno >= 0x40000000 )
352  return FALSE;
353  }
354  uart->THR = pu8TxBuf[u32Count]; /* Send UART Data from buffer */
355  }
356 
357  return u32Count;
358 
359 }
360 
361  /* end of group MINI51_UART_EXPORTED_FUNCTIONS */
363  /* end of group MINI51_UART_Driver */
365  /* end of group MINI51_Device_Driver */
367 
368 /*** (C) COPYRIGHT 2012 Nuvoton Technology Corp. ***/
369 
370 
371 
#define UART_MCR_RTS_Msk
__IO uint32_t FCR
void UART_SetTimeoutCnt(UART_T *uart, uint32_t u32TOC)
This function use to set Rx timeout count.
Definition: uart.c:264
__IO uint32_t IER
#define UART_ISR_TOUT_INT_Msk
#define UART_ISR_TOUT_IF_Msk
#define UART_FSR_BIF_Msk
#define UART_MSR_LEV_CTS_Msk
__IO uint32_t FUN_SEL
#define UART_MSR_DCTSF_Msk
#define UART_STOP_BIT_1
Definition: uart.h:61
#define UART_IER_AUTO_RTS_EN_Msk
#define UART_MCR_LEV_RTS_Msk
#define UART_FUN_SEL_FUN_SEL_Pos
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:280
void UART_Close(UART_T *uart)
The function is used to disable UART.
Definition: uart.c:67
#define UART_FSR_RX_OVER_IF_Msk
void UART_Open(UART_T *uart, uint32_t u32baudrate)
This function use to enable UART function and set baud-rate.
Definition: uart.c:155
Mini51 series peripheral access layer header file. This file contains all the peripheral register's d...
__IO uint32_t ISR
#define UART_PARITY_NONE
Definition: uart.h:55
#define UART_FUNC_SEL_UART
Definition: uart.h:75
#define UART_FSR_TX_OVER_IF_Msk
void UART_ClearIntFlag(UART_T *uart, uint32_t u32InterruptFlag)
The function is used to clear UART specified interrupt flag.
Definition: uart.c:37
__IO uint32_t LCR
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:229
#define UART_FSR_FEF_Msk
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:341
#define UART_ISR_RLS_INT_Msk
#define __XTAL
#define CLK_CLKSEL1_UART_S_Msk
#define UART_IRCR_INV_RX_Msk
#define FALSE
Boolean false, define to use in API parameters or return value.
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:141
__IO uint32_t ALT_CSR
#define UART_FCR_RTS_TRI_LEV_1BYTE
Definition: uart.h:42
__IO uint32_t BAUD
__IO uint32_t MCR
#define UART_BAUD_MODE0
Calculate UART baudrate mode0 divider.
Definition: uart.h:95
#define CLK_CLKSEL1_UART_S_Pos
void UART_EnableFlowCtrl(UART_T *uart)
The function is used to Enable UART auto flow control.
Definition: uart.c:116
#define CLK_CLKDIV_UART_N_Pos
#define UART_TOR_TOIC_Msk
__IO uint32_t MSR
__IO uint32_t FSR
__O uint32_t THR
#define UART_BAUD_MODE2_DIVIDER(u32SrcFreq, u32BaudRate)
Calculate UART baudrate mode2 divider.
Definition: uart.h:127
void UART_DisableFlowCtrl(UART_T *uart)
The function is used to disable UART auto flow control.
Definition: uart.c:80
#define UART_FSR_RX_EMPTY_Msk
#define UART_FCR_RFITL_1BYTE
Definition: uart.h:37
#define UART_WORD_LEN_8
Definition: uart.h:53
__IO uint32_t IRCR
#define CLK_CLKDIV_UART_N_Msk
#define UART_IRCR_INV_TX_Msk
#define UART_FSR_TE_FLAG_Msk
#define UART_BAUD_MODE2
Calculate UART baudrate mode0 divider.
Definition: uart.h:105
#define UART_BAUD_MODE0_DIVIDER(u32SrcFreq, u32BaudRate)
Calculate UART baudrate mode0 divider.
Definition: uart.h:117
#define UART_FUNC_SEL_RS485
Definition: uart.h:77
__I uint32_t RBR
#define CLK
Pointer to CLK register structure.
void UART_SelectRS485Mode(UART_T *uart, uint32_t u32Mode, uint32_t u32Addr)
The function is used to set RS485 relative setting.
Definition: uart.c:324
#define UART_IER_TIME_OUT_EN_Msk
#define UART_ALT_CSR_ADDR_MATCH_Pos
#define UART_IER_AUTO_CTS_EN_Msk
#define __IRC22M
#define UART_FSR_RS485_ADD_DETF_Msk
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:195
__IO uint32_t TOR
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:102
#define UART_IRCR_TX_SELECT_Msk
#define UART_ISR_MODEM_INT_Msk
#define UART_FSR_PEF_Msk
#define UART_ISR_BUF_ERR_INT_Msk