M471M/R1/S BSP V3.01.000
The Board Support Package for M4521
uart.c
Go to the documentation of this file.
1/**************************************************************************/
9#include <stdio.h>
10#include "NuMicro.h"
11
40void UART_ClearIntFlag(UART_T* uart, uint32_t u32InterruptFlag)
41{
42
43 if(u32InterruptFlag & UART_INTSTS_RLSINT_Msk) /* Clear Receive Line Status Interrupt */
44 {
47 }
48
49 if(u32InterruptFlag & UART_INTSTS_MODEMINT_Msk) /* Clear Modem Status Interrupt */
51
52 if(u32InterruptFlag & UART_INTSTS_BUFERRINT_Msk) /* Clear Buffer Error Interrupt */
53 {
55 }
56
57 if(u32InterruptFlag & UART_INTSTS_CTSWKIF_Msk) /* Clear CTS Wake-up Interrupt */
58 {
60 }
61
62 if(u32InterruptFlag & UART_INTSTS_DATWKIF_Msk) /* Clear Data Wake-up Interrupt */
63 {
65 }
66}
67
68
78void UART_Close(UART_T* uart)
79{
80 uart->INTEN = 0;
81}
82
83
94{
96}
97
98
117void UART_DisableInt(UART_T* uart, uint32_t u32InterruptFlag)
118{
119 /* Disable UART specified interrupt */
120 UART_DISABLE_INT(uart, u32InterruptFlag);
121}
122
123
134{
135 /* Set RTS pin output is low level active */
137
138 /* Set CTS pin input is low level active */
140
141 /* Set RTS and CTS auto flow control enable */
143}
144
145
164void UART_EnableInt(UART_T* uart, uint32_t u32InterruptFlag)
165{
166
167 /* Enable UART specified interrupt */
168 UART_ENABLE_INT(uart, u32InterruptFlag);
169
170}
171
172
183void UART_Open(UART_T* uart, uint32_t u32baudrate)
184{
185 uint8_t u8UartClkSrcSel, u8UartClkDivNum;
186 uint32_t u32ClkTbl[4] = {__HXT, 0, __LXT, __HIRC};
187 uint32_t u32Baud_Div = 0;
188
189 /* Get UART clock source selection */
190 u8UartClkSrcSel = (CLK->CLKSEL1 & CLK_CLKSEL1_UARTSEL_Msk) >> CLK_CLKSEL1_UARTSEL_Pos;
191
192 /* Get UART clock divider number */
193 u8UartClkDivNum = (CLK->CLKDIV0 & CLK_CLKDIV0_UARTDIV_Msk) >> CLK_CLKDIV0_UARTDIV_Pos;
194
195 /* Select UART function */
197
198 /* Set UART line configuration */
200
201 /* Set UART Rx and RTS trigger level */
203
204 /* Get PLL clock frequency if UART clock source selection is PLL */
205 if(u8UartClkSrcSel == 1)
206 u32ClkTbl[u8UartClkSrcSel] = CLK_GetPLLClockFreq();
207
208 /* Set UART baud rate */
209 if(u32baudrate != 0)
210 {
211 u32Baud_Div = UART_BAUD_MODE2_DIVIDER((u32ClkTbl[u8UartClkSrcSel]) / (u8UartClkDivNum + 1), u32baudrate);
212
213 if(u32Baud_Div > 0xFFFF)
214 uart->BAUD = (UART_BAUD_MODE0 | UART_BAUD_MODE0_DIVIDER((u32ClkTbl[u8UartClkSrcSel]) / (u8UartClkDivNum + 1), u32baudrate));
215 else
216 uart->BAUD = (UART_BAUD_MODE2 | u32Baud_Div);
217 }
218}
219
220
232uint32_t UART_Read(UART_T* uart, uint8_t *pu8RxBuf, uint32_t u32ReadBytes)
233{
234 uint32_t u32Count, u32delayno;
235
236 for(u32Count = 0; u32Count < u32ReadBytes; u32Count++)
237 {
238 u32delayno = 0;
239
240 while(uart->FIFOSTS & UART_FIFOSTS_RXEMPTY_Msk) /* Check RX empty => failed */
241 {
242 u32delayno++;
243 if(u32delayno >= 0x40000000)
244 return FALSE;
245 }
246 pu8RxBuf[u32Count] = uart->DAT; /* Get Data from UART RX */
247 }
248
249 return u32Count;
250
251}
252
253
280void UART_SetLine_Config(UART_T* uart, uint32_t u32baudrate, uint32_t u32data_width, uint32_t u32parity, uint32_t u32stop_bits)
281{
282 uint8_t u8UartClkSrcSel, u8UartClkDivNum;
283 uint32_t u32ClkTbl[4] = {__HXT, 0, __LXT, __HIRC};
284 uint32_t u32Baud_Div = 0;
285
286 /* Get UART clock source selection */
287 u8UartClkSrcSel = (CLK->CLKSEL1 & CLK_CLKSEL1_UARTSEL_Msk) >> CLK_CLKSEL1_UARTSEL_Pos;
288
289 /* Get UART clock divider number */
290 u8UartClkDivNum = (CLK->CLKDIV0 & CLK_CLKDIV0_UARTDIV_Msk) >> CLK_CLKDIV0_UARTDIV_Pos;
291
292 /* Get PLL clock frequency if UART clock source selection is PLL */
293 if(u8UartClkSrcSel == 1)
294 u32ClkTbl[u8UartClkSrcSel] = CLK_GetPLLClockFreq();
295
296 /* Set UART baud rate */
297 if(u32baudrate != 0)
298 {
299 u32Baud_Div = UART_BAUD_MODE2_DIVIDER((u32ClkTbl[u8UartClkSrcSel]) / (u8UartClkDivNum + 1), u32baudrate);
300
301 if(u32Baud_Div > 0xFFFF)
302 uart->BAUD = (UART_BAUD_MODE0 | UART_BAUD_MODE0_DIVIDER((u32ClkTbl[u8UartClkSrcSel]) / (u8UartClkDivNum + 1), u32baudrate));
303 else
304 uart->BAUD = (UART_BAUD_MODE2 | u32Baud_Div);
305 }
306
307 /* Set UART line configuration */
308 uart->LINE = u32data_width | u32parity | u32stop_bits;
309}
310
311
322void UART_SetTimeoutCnt(UART_T* uart, uint32_t u32TOC)
323{
324 /* Set time-out interrupt comparator */
325 uart->TOUT = (uart->TOUT & ~UART_TOUT_TOIC_Msk) | (u32TOC);
326
327 /* Set time-out counter enable */
329}
330
331
345void UART_SelectIrDAMode(UART_T* uart, uint32_t u32Buadrate, uint32_t u32Direction)
346{
347 uint8_t u8UartClkSrcSel, u8UartClkDivNum;
348 uint32_t u32ClkTbl[4] = {__HXT, 0, __LXT, __HIRC};
349 uint32_t u32Baud_Div;
350
351 /* Select IrDA function mode */
353
354 /* Get UART clock source selection */
355 u8UartClkSrcSel = (CLK->CLKSEL1 & CLK_CLKSEL1_UARTSEL_Msk) >> CLK_CLKSEL1_UARTSEL_Pos;
356
357 /* Get UART clock divider number */
358 u8UartClkDivNum = (CLK->CLKDIV0 & CLK_CLKDIV0_UARTDIV_Msk) >> CLK_CLKDIV0_UARTDIV_Pos;
359
360 /* Get PLL clock frequency if UART clock source selection is PLL */
361 if(u8UartClkSrcSel == 1)
362 u32ClkTbl[u8UartClkSrcSel] = CLK_GetPLLClockFreq();
363
364 /* Set UART IrDA baud rate in mode 0 */
365 if(u32Buadrate != 0)
366 {
367 u32Baud_Div = UART_BAUD_MODE0_DIVIDER((u32ClkTbl[u8UartClkSrcSel]) / (u8UartClkDivNum + 1), u32Buadrate);
368
369 if(u32Baud_Div < 0xFFFF)
370 uart->BAUD = (UART_BAUD_MODE0 | u32Baud_Div);
371 }
372
373 /* Configure IrDA relative settings */
374 if(u32Direction == UART_IRDA_RXEN)
375 {
376 uart->IRDA |= UART_IRDA_RXINV_Msk; //Rx signal is inverse
377 uart->IRDA &= ~UART_IRDA_TXEN_Msk;
378 }
379 else
380 {
381 uart->IRDA &= ~UART_IRDA_TXINV_Msk; //Tx signal is not inverse
382 uart->IRDA |= UART_IRDA_TXEN_Msk;
383 }
384
385}
386
387
402void UART_SelectRS485Mode(UART_T* uart, uint32_t u32Mode, uint32_t u32Addr)
403{
404 /* Select UART RS485 function mode */
406
407 /* Set RS585 configuration */
409 uart->ALTCTL |= (u32Mode | (u32Addr << UART_ALTCTL_ADDRMV_Pos));
410}
411
412
413
414
426uint32_t UART_Write(UART_T* uart, uint8_t *pu8TxBuf, uint32_t u32WriteBytes)
427{
428 uint32_t u32Count, u32delayno;
429 uint32_t u32Exit = 0ul;
430
431 for (u32Count = 0ul; u32Count != u32WriteBytes; u32Count++)
432 {
433 u32delayno = 0ul;
434
435 while (uart->FIFOSTS & UART_FIFOSTS_TXFULL_Msk) /* Check Tx Full */
436 {
437 u32delayno++;
438
439 if (u32delayno >= 0x40000000ul)
440 {
441 u32Exit = 1ul;
442 break;
443 }
444 }
445
446 if (u32Exit == 1ul)
447 {
448 break;
449 }
450 else
451 {
452 uart->DAT = pu8TxBuf[u32Count]; /* Send UART Data from buffer */
453 }
454 }
455
456 return u32Count;
457
458}
459
460 /* end of group UART_EXPORTED_FUNCTIONS */
462 /* end of group UART_Driver */
464 /* end of group Standard_Driver */
466
467
#define UART_FIFOSTS_BIF_Msk
Definition: M471M_R1_S.h:12023
#define UART_FIFOSTS_TXOVIF_Msk
Definition: M471M_R1_S.h:12044
#define UART_FIFOSTS_RXOVIF_Msk
Definition: M471M_R1_S.h:12005
#define UART_INTEN_ATORTSEN_Msk
Definition: M471M_R1_S.h:11939
#define UART_INTSTS_BUFERRINT_Msk
Definition: M471M_R1_S.h:12089
#define UART_ALTCTL_ADDRMV_Msk
Definition: M471M_R1_S.h:12182
#define UART_FIFOSTS_TXFULL_Msk
Definition: M471M_R1_S.h:12041
#define UART_ALTCTL_ADDRMV_Pos
Definition: M471M_R1_S.h:12181
#define UART_FIFOSTS_ADDRDETF_Msk
Definition: M471M_R1_S.h:12014
#define UART_ALTCTL_RS485AUD_Msk
Definition: M471M_R1_S.h:12167
#define UART_IRDA_RXINV_Msk
Definition: M471M_R1_S.h:12149
#define UART_INTSTS_CTSWKIF_Msk
Definition: M471M_R1_S.h:12095
#define UART_FIFO_RFITL_Msk
Definition: M471M_R1_S.h:11960
#define UART_INTSTS_MODEMINT_Msk
Definition: M471M_R1_S.h:12083
#define UART_INTEN_ATOCTSEN_Msk
Definition: M471M_R1_S.h:11942
#define UART_INTSTS_RLSINT_Msk
Definition: M471M_R1_S.h:12080
#define UART_MODEM_RTSACTLV_Msk
Definition: M471M_R1_S.h:11990
#define UART_ALTCTL_RS485NMM_Msk
Definition: M471M_R1_S.h:12161
#define UART_INTSTS_DATWKIF_Msk
Definition: M471M_R1_S.h:12098
#define UART_FIFOSTS_RXEMPTY_Msk
Definition: M471M_R1_S.h:12029
#define UART_FIFOSTS_PEF_Msk
Definition: M471M_R1_S.h:12017
#define UART_MODEMSTS_CTSDETF_Msk
Definition: M471M_R1_S.h:11996
#define UART_FIFOSTS_FEF_Msk
Definition: M471M_R1_S.h:12020
#define UART_FIFO_RTSTRGLV_Msk
Definition: M471M_R1_S.h:11966
#define UART_ALTCTL_RS485AAD_Msk
Definition: M471M_R1_S.h:12164
#define UART_IRDA_TXEN_Msk
Definition: M471M_R1_S.h:12143
#define UART_MODEMSTS_CTSACTLV_Msk
Definition: M471M_R1_S.h:12002
#define UART_INTEN_TOCNTEN_Msk
Definition: M471M_R1_S.h:11936
NuMicro peripheral access layer header file.
__STATIC_INLINE uint32_t CLK_GetPLLClockFreq(void)
Get PLL clock frequency.
Definition: clk.h:326
#define CLK_CLKDIV0_UARTDIV_Pos
Definition: M471M_R1_S.h:1624
#define CLK_CLKSEL1_UARTSEL_Msk
Definition: M471M_R1_S.h:1592
#define CLK_CLKDIV0_UARTDIV_Msk
Definition: M471M_R1_S.h:1625
#define CLK_CLKSEL1_UARTSEL_Pos
Definition: M471M_R1_S.h:1591
__IO uint32_t DAT
Definition: M471M_R1_S.h:11883
__IO uint32_t INTEN
Definition: M471M_R1_S.h:11884
__IO uint32_t FIFOSTS
Definition: M471M_R1_S.h:11889
__IO uint32_t ALTCTL
Definition: M471M_R1_S.h:11894
#define CLK
Definition: M471M_R1_S.h:13818
__IO uint32_t FUNCSEL
Definition: M471M_R1_S.h:11895
__IO uint32_t BAUD
Definition: M471M_R1_S.h:11892
__IO uint32_t FIFO
Definition: M471M_R1_S.h:11885
__IO uint32_t MODEM
Definition: M471M_R1_S.h:11887
__IO uint32_t MODEMSTS
Definition: M471M_R1_S.h:11888
#define FALSE
Definition: M471M_R1_S.h:13904
__IO uint32_t TOUT
Definition: M471M_R1_S.h:11891
__IO uint32_t IRDA
Definition: M471M_R1_S.h:11893
__IO uint32_t INTSTS
Definition: M471M_R1_S.h:11890
__IO uint32_t LINE
Definition: M471M_R1_S.h:11886
#define UART_BAUD_MODE2
Definition: uart.h:98
#define UART_PARITY_NONE
Definition: uart.h:61
#define UART_BAUD_MODE0
Definition: uart.h:97
#define UART_IRDA_RXEN
Definition: uart.h:83
#define UART_FUNCSEL_IrDA
Definition: uart.h:90
#define UART_STOP_BIT_1
Definition: uart.h:67
#define UART_WORD_LEN_8
Definition: uart.h:59
#define UART_FUNCSEL_RS485
Definition: uart.h:91
#define UART_FUNCSEL_UART
Definition: uart.h:89
void UART_SelectRS485Mode(UART_T *uart, uint32_t u32Mode, uint32_t u32Addr)
Select and configure RS485 function.
Definition: uart.c:402
void UART_EnableInt(UART_T *uart, uint32_t u32InterruptFlag)
The function is used to enable UART specified interrupt and enable NVIC UART IRQ.
Definition: uart.c:164
void UART_SetTimeoutCnt(UART_T *uart, uint32_t u32TOC)
Set Rx timeout count.
Definition: uart.c:322
void UART_Close(UART_T *uart)
Disable UART interrupt.
Definition: uart.c:78
#define UART_BAUD_MODE0_DIVIDER(u32SrcFreq, u32BaudRate)
Calculate UART baudrate mode0 divider.
Definition: uart.h:119
#define UART_DISABLE_INT(uart, u32eIntSel)
Disable specified UART interrupt.
Definition: uart.h:318
void UART_ClearIntFlag(UART_T *uart, uint32_t u32InterruptFlag)
Clear UART specified interrupt flag.
Definition: uart.c:40
void UART_DisableFlowCtrl(UART_T *uart)
Disable UART auto flow control function.
Definition: uart.c:93
void UART_EnableFlowCtrl(UART_T *uart)
Enable UART auto flow control function.
Definition: uart.c:133
uint32_t UART_Write(UART_T *uart, uint8_t *pu8TxBuf, uint32_t u32WriteBytes)
Write UART data.
Definition: uart.c:426
#define UART_BAUD_MODE2_DIVIDER(u32SrcFreq, u32BaudRate)
Calculate UART baudrate mode2 divider.
Definition: uart.h:132
void UART_SetLine_Config(UART_T *uart, uint32_t u32baudrate, uint32_t u32data_width, uint32_t u32parity, uint32_t u32stop_bits)
Set UART line configuration.
Definition: uart.c:280
void UART_DisableInt(UART_T *uart, uint32_t u32InterruptFlag)
Disable UART specified interrupt.
Definition: uart.c:117
void UART_SelectIrDAMode(UART_T *uart, uint32_t u32Buadrate, uint32_t u32Direction)
Select and configure IrDA function.
Definition: uart.c:345
uint32_t UART_Read(UART_T *uart, uint8_t *pu8RxBuf, uint32_t u32ReadBytes)
Read UART data.
Definition: uart.c:232
void UART_Open(UART_T *uart, uint32_t u32baudrate)
Open and set UART function.
Definition: uart.c:183
#define UART_ENABLE_INT(uart, u32eIntSel)
Enable specified UART interrupt.
Definition: uart.h:296
#define __HIRC
#define __HXT
#define __LXT