1 /*
2 * Copyright 2021 MindMotion Microelectronics Co., Ltd.
3 * All rights reserved.
4 *
5 * SPDX-License-Identifier: BSD-3-Clause
6 */
7
8 #include "hal_uart.h"
9
UART_Init(UART_Type * UARTx,UART_Init_Type * init)10 void UART_Init(UART_Type * UARTx, UART_Init_Type * init)
11 {
12 uint32_t ccr = UARTx->CCR & ~( UART_CCR_PEN_MASK
13 | UART_CCR_PSEL_MASK
14 | UART_CCR_SPB0_MASK
15 | UART_CCR_CHAR_MASK
16 | UART_CCR_SPB1_MASK
17 );
18 /* WordLength. */
19 ccr |= UART_CCR_CHAR(init->WordLength);
20
21 /* StopBits. */
22 if ( (init->StopBits == UART_StopBits_2) || (init->StopBits == UART_StopBits_1_5) )
23 {
24 ccr |= UART_CCR_SPB0_MASK;
25 }
26 if ( (init->StopBits == UART_StopBits_0_5) || (init->StopBits == UART_StopBits_1_5) )
27 {
28 ccr |= UART_CCR_SPB1_MASK;
29 }
30
31 /* Parity. */
32 if (init->Parity == UART_Parity_Even)
33 {
34 ccr |= UART_CCR_PEN_MASK;
35 }
36 if (init->Parity == UART_Parity_Odd)
37 {
38 ccr |= UART_CCR_PEN_MASK | UART_CCR_PSEL_MASK;
39 }
40 UARTx->CCR = ccr;
41
42 /* XferMode. */
43 uint32_t gcr = UARTx->GCR & ~( UART_GCR_RXEN_MASK
44 | UART_GCR_TXEN_MASK
45 | UART_GCR_AUTOFLOWEN_MASK
46 );
47 gcr |= ((uint32_t)(init->XferMode) << UART_GCR_RXEN_SHIFT);
48 if (init->HwFlowControl == UART_HwFlowControl_RTS_CTS)
49 {
50 gcr |= UART_GCR_AUTOFLOWEN_MASK;
51 }
52 UARTx->GCR = gcr;
53
54 /* Setup the baudrate. */
55 UARTx->BRR = (init->ClockFreqHz / init->BaudRate) / 16u;
56 UARTx->FRA = (init->ClockFreqHz / init->BaudRate) % 16u;
57 }
58
UART_Enable(UART_Type * UARTx,bool enable)59 void UART_Enable(UART_Type * UARTx, bool enable)
60 {
61 if (enable)
62 {
63 UARTx->GCR |= UART_GCR_UARTEN_MASK;
64 }
65 else
66 {
67 UARTx->GCR &= ~UART_GCR_UARTEN_MASK;
68 }
69 }
70
UART_EnableInterrupts(UART_Type * UARTx,uint32_t interrupts,bool enable)71 void UART_EnableInterrupts(UART_Type * UARTx, uint32_t interrupts, bool enable)
72 {
73 (enable) ? (UARTx->IER |= interrupts) : (UARTx->IER &= ~interrupts);
74 }
75
UART_GetEnabledInterrupts(UART_Type * UARTx)76 uint32_t UART_GetEnabledInterrupts(UART_Type * UARTx)
77 {
78 return UARTx->IER;
79 }
80
UART_EnableDMA(UART_Type * UARTx,bool enable)81 void UART_EnableDMA(UART_Type * UARTx, bool enable)
82 {
83 if (enable)
84 {
85 UARTx->GCR |= UART_GCR_DMAMODE_MASK;
86 }
87 else
88 {
89 UARTx->GCR &= ~UART_GCR_DMAMODE_MASK;
90 }
91 }
92
UART_PutData(UART_Type * UARTx,uint8_t value)93 void UART_PutData(UART_Type * UARTx, uint8_t value)
94 {
95 UARTx->TDR = value;
96 }
97
UART_GetData(UART_Type * UARTx)98 uint8_t UART_GetData(UART_Type * UARTx)
99 {
100 return (uint8_t)(UARTx->RDR & 0xFFU);
101 }
102
103 /* return flags */
UART_GetStatus(UART_Type * UARTx)104 uint32_t UART_GetStatus(UART_Type * UARTx)
105 {
106 return UARTx->CSR;
107 }
108
109 /* return flags. */
UART_GetInterruptStatus(UART_Type * UARTx)110 uint32_t UART_GetInterruptStatus(UART_Type * UARTx)
111 {
112 return UARTx->ISR;
113 }
114
UART_ClearInterruptStatus(UART_Type * UARTx,uint32_t interrupts)115 void UART_ClearInterruptStatus(UART_Type * UARTx, uint32_t interrupts)
116 {
117 UARTx->ICR = interrupts;
118 }
119
UART_GetRxDataRegAddr(UART_Type * UARTx)120 uint32_t UART_GetRxDataRegAddr(UART_Type * UARTx)
121 {
122 return (uint32_t)(&(UARTx->RDR));
123 }
124
UART_GetTxDataRegAddr(UART_Type * UARTx)125 uint32_t UART_GetTxDataRegAddr(UART_Type * UARTx)
126 {
127 return (uint32_t)(&(UARTx->TDR));
128 }
129
130 /* EOF. */
131