1 /*!
2     \file    gd32l23x_usart.h
3     \brief   definitions for the USART
4 
5     \version 2021-08-04, V1.0.0, firmware for GD32L23x
6 */
7 
8 /*
9     Copyright (c) 2021, GigaDevice Semiconductor Inc.
10 
11     Redistribution and use in source and binary forms, with or without modification,
12 are permitted provided that the following conditions are met:
13 
14     1. Redistributions of source code must retain the above copyright notice, this
15        list of conditions and the following disclaimer.
16     2. Redistributions in binary form must reproduce the above copyright notice,
17        this list of conditions and the following disclaimer in the documentation
18        and/or other materials provided with the distribution.
19     3. Neither the name of the copyright holder nor the names of its contributors
20        may be used to endorse or promote products derived from this software without
21        specific prior written permission.
22 
23     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
24 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
25 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26 IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
27 INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
28 NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
29 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
30 WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
32 OF SUCH DAMAGE.
33 */
34 
35 #ifndef GD32L23X_USART_H
36 #define GD32L23X_USART_H
37 
38 #include "gd32l23x.h"
39 
40 /* USARTx(x=0,1) definitions */
41 #define USART0                        (USART_BASE + 0x0000F400U)
42 #define USART1                        USART_BASE
43 #define UART3                         (USART_BASE + 0x00000800U)
44 #define UART4                         (USART_BASE + 0x00000C00U)
45 
46 /* registers definitions */
47 #define USART_CTL0(usartx)            REG32((usartx) + 0x00000000U)        /*!< USART control register 0 */
48 #define USART_CTL1(usartx)            REG32((usartx) + 0x00000004U)        /*!< USART control register 1 */
49 #define USART_CTL2(usartx)            REG32((usartx) + 0x00000008U)        /*!< USART control register 2 */
50 #define USART_BAUD(usartx)            REG32((usartx) + 0x0000000CU)        /*!< USART baud rate register */
51 #define USART_GP(usartx)              REG32((usartx) + 0x00000010U)        /*!< USART guard time and prescaler register */
52 #define USART_RT(usartx)              REG32((usartx) + 0x00000014U)        /*!< USART receiver timeout register */
53 #define USART_CMD(usartx)             REG32((usartx) + 0x00000018U)        /*!< USART command register */
54 #define USART_STAT(usartx)            REG32((usartx) + 0x0000001CU)        /*!< USART status register */
55 #define USART_INTC(usartx)            REG32((usartx) + 0x00000020U)        /*!< USART status clear register */
56 #define USART_RDATA(usartx)           REG32((usartx) + 0x00000024U)        /*!< USART receive data register */
57 #define USART_TDATA(usartx)           REG32((usartx) + 0x00000028U)        /*!< USART transmit data register */
58 #define USART_CHC(usartx)             REG32((usartx) + 0x000000C0U)        /*!< USART coherence control register */
59 #define USART_RFCS(usartx)            REG32((usartx) + 0x000000D0U)        /*!< USART receive FIFO control and status register */
60 
61 /* bits definitions */
62 /* USARTx_CTL0 */
63 #define USART_CTL0_UEN                BIT(0)                               /*!< USART enable */
64 #define USART_CTL0_UESM               BIT(1)                               /*!< USART enable in deep-sleep mode */
65 #define USART_CTL0_REN                BIT(2)                               /*!< receiver enable */
66 #define USART_CTL0_TEN                BIT(3)                               /*!< transmitter enable */
67 #define USART_CTL0_IDLEIE             BIT(4)                               /*!< idle line detected interrupt enable */
68 #define USART_CTL0_RBNEIE             BIT(5)                               /*!< read data buffer not empty interrupt and overrun error interrupt enable */
69 #define USART_CTL0_TCIE               BIT(6)                               /*!< transmission complete interrupt enable */
70 #define USART_CTL0_TBEIE              BIT(7)                               /*!< transmitter register empty interrupt enable */
71 #define USART_CTL0_PERRIE             BIT(8)                               /*!< parity error interrupt enable */
72 #define USART_CTL0_PM                 BIT(9)                               /*!< parity mode */
73 #define USART_CTL0_PCEN               BIT(10)                              /*!< parity control enable */
74 #define USART_CTL0_WM                 BIT(11)                              /*!< wakeup method in mute mode */
75 #define USART_CTL0_WL                 BIT(12)                              /*!< word length */
76 #define USART_CTL0_MEN                BIT(13)                              /*!< mute mode enable */
77 #define USART_CTL0_AMIE               BIT(14)                              /*!< address match interrupt enable */
78 #define USART_CTL0_OVSMOD             BIT(15)                              /*!< oversample mode */
79 #define USART_CTL0_DED                BITS(16,20)                          /*!< driver enable deassertion time */
80 #define USART_CTL0_DEA                BITS(21,25)                          /*!< driver enable assertion time */
81 #define USART_CTL0_RTIE               BIT(26)                              /*!< receiver timeout interrupt enable */
82 #define USART_CTL0_EBIE               BIT(27)                              /*!< end of block interrupt enable */
83 
84 /* USARTx_CTL1 */
85 #define USART_CTL1_ADDM               BIT(4)                               /*!< address detection mode */
86 #define USART_CTL1_LBLEN              BIT(5)                               /*!< LIN break frame length */
87 #define USART_CTL1_LBDIE              BIT(6)                               /*!< LIN break detection interrupt enable */
88 #define USART_CTL1_CLEN               BIT(8)                               /*!< last bit clock pulse */
89 #define USART_CTL1_CPH                BIT(9)                               /*!< clock phase */
90 #define USART_CTL1_CPL                BIT(10)                              /*!< clock polarity */
91 #define USART_CTL1_CKEN               BIT(11)                              /*!< ck pin enable */
92 #define USART_CTL1_STB                BITS(12,13)                          /*!< stop bits length */
93 #define USART_CTL1_LMEN               BIT(14)                              /*!< LIN mode enable */
94 #define USART_CTL1_STRP               BIT(15)                              /*!< swap TX/RX pins */
95 #define USART_CTL1_RINV               BIT(16)                              /*!< RX pin level inversion */
96 #define USART_CTL1_TINV               BIT(17)                              /*!< TX pin level inversion */
97 #define USART_CTL1_DINV               BIT(18)                              /*!< data bit level inversion */
98 #define USART_CTL1_MSBF               BIT(19)                              /*!< most significant bit first */
99 #define USART_CTL1_ABDEN              BIT(20)                              /*!< auto baud rate enable */
100 #define USART_CTL1_ABDM               BITS(21,22)                          /*!< auto baud rate mode */
101 #define USART_CTL1_RTEN               BIT(23)                              /*!< receiver timeout enable */
102 #define USART_CTL1_ADDR               BITS(24,31)                          /*!< address of the USART terminal */
103 
104 /* USARTx_CTL2 */
105 #define USART_CTL2_ERRIE              BIT(0)                               /*!< error interrupt enable in multibuffer communication */
106 #define USART_CTL2_IREN               BIT(1)                               /*!< IrDA mode enable */
107 #define USART_CTL2_IRLP               BIT(2)                               /*!< IrDA low-power */
108 #define USART_CTL2_HDEN               BIT(3)                               /*!< half-duplex enable */
109 #define USART_CTL2_NKEN               BIT(4)                               /*!< NACK enable in smartcard mode */
110 #define USART_CTL2_SCEN               BIT(5)                               /*!< smartcard mode enable */
111 #define USART_CTL2_DENR               BIT(6)                               /*!< DMA enable for reception */
112 #define USART_CTL2_DENT               BIT(7)                               /*!< DMA enable for transmission */
113 #define USART_CTL2_RTSEN              BIT(8)                               /*!< RTS enable */
114 #define USART_CTL2_CTSEN              BIT(9)                               /*!< CTS enable */
115 #define USART_CTL2_CTSIE              BIT(10)                              /*!< CTS interrupt enable */
116 #define USART_CTL2_OSB                BIT(11)                              /*!< one sample bit mode */
117 #define USART_CTL2_OVRD               BIT(12)                              /*!< overrun disable */
118 #define USART_CTL2_DDRE               BIT(13)                              /*!< disable DMA on reception error */
119 #define USART_CTL2_DEM                BIT(14)                              /*!< driver enable mode */
120 #define USART_CTL2_DEP                BIT(15)                              /*!< driver enable polarity mode */
121 #define USART_CTL2_SCRTNUM            BITS(17,19)                          /*!< smartcard auto-retry number */
122 #define USART_CTL2_WUM                BITS(20,21)                          /*!< wakeup mode from deep-sleep mode */
123 #define USART_CTL2_WUIE               BIT(22)                              /*!< wakeup from deep-sleep mode interrupt enable */
124 
125 /* USARTx_BAUD */
126 #define USART_BAUD_FRADIV             BITS(0,3)                            /*!< fraction of baud-rate divider */
127 #define USART_BAUD_INTDIV             BITS(4,15)                           /*!< integer of baud-rate divider */
128 
129 /* USARTx_GP */
130 #define USART_GP_PSC                  BITS(0,7)                            /*!< prescaler value for dividing the system clock */
131 #define USART_GP_GUAT                 BITS(8,15)                           /*!< guard time value in smartcard mode */
132 
133 /* USARTx_RT */
134 #define USART_RT_RT                   BITS(0,23)                           /*!< receiver timeout threshold */
135 #define USART_RT_BL                   BITS(24,31)                          /*!< block length */
136 
137 /* USARTx_CMD */
138 #define USART_CMD_ABDCMD              BIT(0)                               /*!< auto baudrate detection command */
139 #define USART_CMD_SBKCMD              BIT(1)                               /*!< send break command */
140 #define USART_CMD_MMCMD               BIT(2)                               /*!< mute mode command */
141 #define USART_CMD_RXFCMD              BIT(3)                               /*!< receive data flush command */
142 #define USART_CMD_TXFCMD              BIT(4)                               /*!< transmit data flush request */
143 
144 /* USARTx_STAT */
145 #define USART_STAT_PERR               BIT(0)                               /*!< parity error flag */
146 #define USART_STAT_FERR               BIT(1)                               /*!< frame error flag */
147 #define USART_STAT_NERR               BIT(2)                               /*!< noise error flag */
148 #define USART_STAT_ORERR              BIT(3)                               /*!< overrun error */
149 #define USART_STAT_IDLEF              BIT(4)                               /*!< idle line detected flag */
150 #define USART_STAT_RBNE               BIT(5)                               /*!< read data buffer not empty */
151 #define USART_STAT_TC                 BIT(6)                               /*!< transmission completed */
152 #define USART_STAT_TBE                BIT(7)                               /*!< transmit data register empty */
153 #define USART_STAT_LBDF               BIT(8)                               /*!< LIN break detected flag */
154 #define USART_STAT_CTSF               BIT(9)                               /*!< CTS change flag */
155 #define USART_STAT_CTS                BIT(10)                              /*!< CTS level */
156 #define USART_STAT_RTF                BIT(11)                              /*!< receiver timeout flag */
157 #define USART_STAT_EBF                BIT(12)                              /*!< end of block flag */
158 #define USART_STAT_ABDE               BIT(14)                              /*!< auto baudrate detection error */
159 #define USART_STAT_ABDF               BIT(15)                              /*!< auto baudrate detection flag */
160 #define USART_STAT_BSY                BIT(16)                              /*!< busy flag */
161 #define USART_STAT_AMF                BIT(17)                              /*!< address match flag */
162 #define USART_STAT_SBF                BIT(18)                              /*!< send break flag */
163 #define USART_STAT_RWU                BIT(19)                              /*!< receiver wakeup from mute mode */
164 #define USART_STAT_WUF                BIT(20)                              /*!< wakeup from deep-sleep mode flag */
165 #define USART_STAT_TEA                BIT(21)                              /*!< transmit enable acknowledge flag */
166 #define USART_STAT_REA                BIT(22)                              /*!< receive enable acknowledge flag */
167 
168 /* USARTx_INTC */
169 #define USART_INTC_PEC                BIT(0)                               /*!< parity error clear */
170 #define USART_INTC_FEC                BIT(1)                               /*!< frame error flag clear */
171 #define USART_INTC_NEC                BIT(2)                               /*!< noise detected clear */
172 #define USART_INTC_OREC               BIT(3)                               /*!< overrun error clear */
173 #define USART_INTC_IDLEC              BIT(4)                               /*!< idle line detected clear */
174 #define USART_INTC_TCC                BIT(6)                               /*!< transmission complete clear */
175 #define USART_INTC_LBDC               BIT(8)                               /*!< LIN break detected clear */
176 #define USART_INTC_CTSC               BIT(9)                               /*!< CTS change clear */
177 #define USART_INTC_RTC                BIT(11)                              /*!< receiver timeout clear */
178 #define USART_INTC_EBC                BIT(12)                              /*!< end of timeout clear */
179 #define USART_INTC_AMC                BIT(17)                              /*!< address match clear */
180 #define USART_INTC_WUC                BIT(20)                              /*!< wakeup from deep-sleep mode clear */
181 
182 /* USARTx_RDATA */
183 #define USART_RDATA_RDATA             BITS(0,8)                            /*!< receive data value */
184 
185 /* USARTx_TDATA */
186 #define USART_TDATA_TDATA             BITS(0,8)                            /*!< transmit data value */
187 
188 /* USARTx_CHC */
189 #define USART_CHC_HCM                 BIT(0)                               /*!< hardware flow control coherence mode */
190 #define USART_CHC_EPERR               BIT(8)                               /*!< early parity error flag */
191 
192 /* USARTx_RFCS */
193 #define USART_RFCS_ELNACK             BIT(0)                               /*!< early NACK */
194 #define USART_RFCS_RFEN               BIT(8)                               /*!< receive FIFO enable */
195 #define USART_RFCS_RFFIE              BIT(9)                               /*!< receive FIFO full interrupt enable */
196 #define USART_RFCS_RFE                BIT(10)                              /*!< receive FIFO empty flag */
197 #define USART_RFCS_RFF                BIT(11)                              /*!< receive FIFO full flag */
198 #define USART_RFCS_RFCNT              BITS(12,14)                          /*!< receive FIFO counter number */
199 #define USART_RFCS_RFFINT             BIT(15)                              /*!< receive FIFO full interrupt flag */
200 
201 /* constants definitions */
202 /* define the USART bit position and its register index offset */
203 #define USART_REGIDX_BIT(regidx, bitpos)    (((uint32_t)(regidx) << 6) | (uint32_t)(bitpos))
204 #define USART_REG_VAL(usartx, offset)       (REG32((usartx) + (((uint32_t)(offset) & 0x0000FFFFU) >> 6)))
205 #define USART_BIT_POS(val)                  ((uint32_t)(val) & 0x0000001FU)
206 #define USART_REGIDX_BIT2(regidx, bitpos, regidx2, bitpos2)   (((uint32_t)(regidx2) << 22) | (uint32_t)((bitpos2) << 16)\
207         | (((uint32_t)(regidx) << 6) | (uint32_t)(bitpos)))
208 #define USART_REG_VAL2(usartx, offset)       (REG32((usartx) + ((uint32_t)(offset) >> 22)))
209 #define USART_BIT_POS2(val)                  (((uint32_t)(val) & 0x001F0000U) >> 16)
210 
211 /* register offset */
212 #define USART_CTL0_REG_OFFSET              ((uint32_t)0x00000000U)         /*!< CTL0 register offset */
213 #define USART_CTL1_REG_OFFSET              ((uint32_t)0x00000004U)         /*!< CTL1 register offset */
214 #define USART_CTL2_REG_OFFSET              ((uint32_t)0x00000008U)         /*!< CTL2 register offset */
215 #define USART_STAT_REG_OFFSET              ((uint32_t)0x0000001CU)         /*!< STAT register offset */
216 #define USART_CHC_REG_OFFSET               ((uint32_t)0x000000C0U)         /*!< CHC register offset */
217 #define USART_RFCS_REG_OFFSET              ((uint32_t)0x000000D0U)         /*!< RFCS register offset */
218 
219 /* USART flags */
220 typedef enum {
221     /* flags in STAT register */
222     USART_FLAG_REA = USART_REGIDX_BIT(USART_STAT_REG_OFFSET, 22U),         /*!< receive enable acknowledge flag */
223     USART_FLAG_TEA = USART_REGIDX_BIT(USART_STAT_REG_OFFSET, 21U),         /*!< transmit enable acknowledge flag */
224     USART_FLAG_WU = USART_REGIDX_BIT(USART_STAT_REG_OFFSET, 20U),          /*!< wakeup from Deep-sleep mode flag */
225     USART_FLAG_RWU = USART_REGIDX_BIT(USART_STAT_REG_OFFSET, 19U),         /*!< receiver wakeup from mute mode */
226     USART_FLAG_SB = USART_REGIDX_BIT(USART_STAT_REG_OFFSET, 18U),          /*!< send break flag */
227     USART_FLAG_AM = USART_REGIDX_BIT(USART_STAT_REG_OFFSET, 17U),          /*!< ADDR match flag */
228     USART_FLAG_BSY = USART_REGIDX_BIT(USART_STAT_REG_OFFSET, 16U),         /*!< busy flag */
229     USART_FLAG_ABD = USART_REGIDX_BIT(USART_STAT_REG_OFFSET, 15U),         /*!< auto baudrate detection flag */
230     USART_FLAG_ABDE = USART_REGIDX_BIT(USART_STAT_REG_OFFSET, 14U),        /*!< auto baudrate detection error */
231     USART_FLAG_EB = USART_REGIDX_BIT(USART_STAT_REG_OFFSET, 12U),          /*!< end of block flag */
232     USART_FLAG_RT = USART_REGIDX_BIT(USART_STAT_REG_OFFSET, 11U),          /*!< receiver timeout flag */
233     USART_FLAG_CTS = USART_REGIDX_BIT(USART_STAT_REG_OFFSET, 10U),         /*!< CTS level */
234     USART_FLAG_CTSF = USART_REGIDX_BIT(USART_STAT_REG_OFFSET, 9U),         /*!< CTS change flag */
235     USART_FLAG_LBD = USART_REGIDX_BIT(USART_STAT_REG_OFFSET, 8U),          /*!< LIN break detected flag */
236     USART_FLAG_TBE = USART_REGIDX_BIT(USART_STAT_REG_OFFSET, 7U),          /*!< transmit data buffer empty */
237     USART_FLAG_TC = USART_REGIDX_BIT(USART_STAT_REG_OFFSET, 6U),           /*!< transmission complete */
238     USART_FLAG_RBNE = USART_REGIDX_BIT(USART_STAT_REG_OFFSET, 5U),         /*!< read data buffer not empty */
239     USART_FLAG_IDLE = USART_REGIDX_BIT(USART_STAT_REG_OFFSET, 4U),         /*!< IDLE line detected flag */
240     USART_FLAG_ORERR = USART_REGIDX_BIT(USART_STAT_REG_OFFSET, 3U),        /*!< overrun error */
241     USART_FLAG_NERR = USART_REGIDX_BIT(USART_STAT_REG_OFFSET, 2U),         /*!< noise error flag */
242     USART_FLAG_FERR = USART_REGIDX_BIT(USART_STAT_REG_OFFSET, 1U),         /*!< frame error flag */
243     USART_FLAG_PERR = USART_REGIDX_BIT(USART_STAT_REG_OFFSET, 0U),         /*!< parity error flag */
244     /* flags in CHC register */
245     USART_FLAG_EPERR = USART_REGIDX_BIT(USART_CHC_REG_OFFSET, 8U),         /*!< early parity error flag */
246     /* flags in RFCS register */
247     USART_FLAG_RFFINT = USART_REGIDX_BIT(USART_RFCS_REG_OFFSET, 15U),      /*!< receive FIFO full interrupt flag */
248     USART_FLAG_RFF = USART_REGIDX_BIT(USART_RFCS_REG_OFFSET, 11U),         /*!< receive FIFO full flag */
249     USART_FLAG_RFE = USART_REGIDX_BIT(USART_RFCS_REG_OFFSET, 10U)          /*!< receive FIFO empty flag */
250 } usart_flag_enum;
251 
252 /* USART interrupt flags */
253 typedef enum {
254     /* interrupt flags in CTL0 register */
255     USART_INT_FLAG_EB = USART_REGIDX_BIT2(USART_CTL0_REG_OFFSET, 27U, USART_STAT_REG_OFFSET, 12U),       /*!< end of block interrupt and flag */
256     USART_INT_FLAG_RT = USART_REGIDX_BIT2(USART_CTL0_REG_OFFSET, 26U, USART_STAT_REG_OFFSET, 11U),       /*!< receiver timeout interrupt and flag */
257     USART_INT_FLAG_AM = USART_REGIDX_BIT2(USART_CTL0_REG_OFFSET, 14U, USART_STAT_REG_OFFSET, 17U),       /*!< address match interrupt and flag */
258     USART_INT_FLAG_PERR = USART_REGIDX_BIT2(USART_CTL0_REG_OFFSET, 8U, USART_STAT_REG_OFFSET, 0U),       /*!< parity error interrupt and flag */
259     USART_INT_FLAG_TBE = USART_REGIDX_BIT2(USART_CTL0_REG_OFFSET, 7U, USART_STAT_REG_OFFSET, 7U),        /*!< transmitter buffer empty interrupt and flag */
260     USART_INT_FLAG_TC = USART_REGIDX_BIT2(USART_CTL0_REG_OFFSET, 6U, USART_STAT_REG_OFFSET, 6U),         /*!< transmission complete interrupt and flag */
261     USART_INT_FLAG_RBNE = USART_REGIDX_BIT2(USART_CTL0_REG_OFFSET, 5U, USART_STAT_REG_OFFSET, 5U),       /*!< read data buffer not empty interrupt and flag */
262     USART_INT_FLAG_RBNE_ORERR = USART_REGIDX_BIT2(USART_CTL0_REG_OFFSET, 5U, USART_STAT_REG_OFFSET, 3U), /*!< read data buffer not empty interrupt and overrun error flag */
263     USART_INT_FLAG_IDLE = USART_REGIDX_BIT2(USART_CTL0_REG_OFFSET, 4U, USART_STAT_REG_OFFSET, 4U),       /*!< IDLE line detected interrupt and flag */
264     /* interrupt flags in CTL1 register */
265     USART_INT_FLAG_LBD = USART_REGIDX_BIT2(USART_CTL1_REG_OFFSET, 6U, USART_STAT_REG_OFFSET, 8U),        /*!< LIN break detected interrupt and flag */
266     /* interrupt flags in CTL2 register */
267     USART_INT_FLAG_WU = USART_REGIDX_BIT2(USART_CTL2_REG_OFFSET, 22U, USART_STAT_REG_OFFSET, 20U),       /*!< wakeup from deep-sleep mode interrupt and flag */
268     USART_INT_FLAG_CTS = USART_REGIDX_BIT2(USART_CTL2_REG_OFFSET, 10U, USART_STAT_REG_OFFSET, 9U),       /*!< CTS interrupt and flag */
269     USART_INT_FLAG_ERR_NERR = USART_REGIDX_BIT2(USART_CTL2_REG_OFFSET, 0U, USART_STAT_REG_OFFSET, 2U),   /*!< error interrupt and noise error flag */
270     USART_INT_FLAG_ERR_ORERR = USART_REGIDX_BIT2(USART_CTL2_REG_OFFSET, 0U, USART_STAT_REG_OFFSET, 3U),  /*!< error interrupt and overrun error */
271     USART_INT_FLAG_ERR_FERR = USART_REGIDX_BIT2(USART_CTL2_REG_OFFSET, 0U, USART_STAT_REG_OFFSET, 1U),   /*!< error interrupt and frame error flag */
272     /* interrupt flags in RFCS register */
273     USART_INT_FLAG_RFF = USART_REGIDX_BIT2(USART_RFCS_REG_OFFSET, 9U, USART_RFCS_REG_OFFSET, 15U)        /*!< receive FIFO full interrupt and flag */
274 } usart_interrupt_flag_enum;
275 
276 /* USART interrupt enable or disable */
277 typedef enum {
278     /* interrupt in CTL0 register */
279     USART_INT_EB = USART_REGIDX_BIT(USART_CTL0_REG_OFFSET, 27U),         /*!< end of block interrupt */
280     USART_INT_RT = USART_REGIDX_BIT(USART_CTL0_REG_OFFSET, 26U),         /*!< receiver timeout interrupt */
281     USART_INT_AM = USART_REGIDX_BIT(USART_CTL0_REG_OFFSET, 14U),         /*!< address match interrupt */
282     USART_INT_PERR = USART_REGIDX_BIT(USART_CTL0_REG_OFFSET, 8U),        /*!< parity error interrupt */
283     USART_INT_TBE = USART_REGIDX_BIT(USART_CTL0_REG_OFFSET, 7U),         /*!< transmitter buffer empty interrupt */
284     USART_INT_TC = USART_REGIDX_BIT(USART_CTL0_REG_OFFSET, 6U),          /*!< transmission complete interrupt */
285     USART_INT_RBNE = USART_REGIDX_BIT(USART_CTL0_REG_OFFSET, 5U),        /*!< read data buffer not empty interrupt and overrun error interrupt */
286     USART_INT_IDLE = USART_REGIDX_BIT(USART_CTL0_REG_OFFSET, 4U),        /*!< IDLE line detected interrupt */
287     /* interrupt in CTL1 register */
288     USART_INT_LBD = USART_REGIDX_BIT(USART_CTL1_REG_OFFSET, 6U),         /*!< LIN break detected interrupt */
289     /* interrupt in CTL2 register */
290     USART_INT_WU = USART_REGIDX_BIT(USART_CTL2_REG_OFFSET, 22U),         /*!< wakeup from deep-sleep mode interrupt */
291     USART_INT_CTS = USART_REGIDX_BIT(USART_CTL2_REG_OFFSET, 10U),        /*!< CTS interrupt */
292     USART_INT_ERR = USART_REGIDX_BIT(USART_CTL2_REG_OFFSET, 0U),         /*!< error interrupt */
293     /* interrupt in RFCS register */
294     USART_INT_RFF = USART_REGIDX_BIT(USART_RFCS_REG_OFFSET, 9U)          /*!< receive FIFO full interrupt */
295 } usart_interrupt_enum;
296 
297 /* USART invert configure */
298 typedef enum {
299     /* data bit level inversion */
300     USART_DINV_ENABLE = 0,                                           /*!< data bit level inversion */
301     USART_DINV_DISABLE,                                              /*!< data bit level not inversion */
302     /* TX pin level inversion */
303     USART_TXPIN_ENABLE,                                              /*!< TX pin level inversion */
304     USART_TXPIN_DISABLE,                                             /*!< TX pin level not inversion */
305     /* RX pin level inversion */
306     USART_RXPIN_ENABLE,                                              /*!< RX pin level inversion */
307     USART_RXPIN_DISABLE,                                             /*!< RX pin level not inversion */
308     /* swap TX/RX pins */
309     USART_SWAP_ENABLE,                                               /*!< swap TX/RX pins */
310     USART_SWAP_DISABLE                                               /*!< not swap TX/RX pins */
311 } usart_invert_enum;
312 
313 /* USART receiver configure */
314 #define CTL0_REN(regval)              (BIT(2) & ((uint32_t)(regval) << 2))
315 #define USART_RECEIVE_ENABLE          CTL0_REN(1)                    /*!< enable receiver */
316 #define USART_RECEIVE_DISABLE         CTL0_REN(0)                    /*!< disable receiver */
317 
318 /* USART transmitter configure */
319 #define CTL0_TEN(regval)              (BIT(3) & ((uint32_t)(regval) << 3))
320 #define USART_TRANSMIT_ENABLE         CTL0_TEN(1)                    /*!< enable transmitter */
321 #define USART_TRANSMIT_DISABLE        CTL0_TEN(0)                    /*!< disable transmitter */
322 
323 /* USART parity bits definitions */
324 #define CTL0_PM(regval)               (BITS(9,10) & ((uint32_t)(regval) << 9))
325 #define USART_PM_NONE                 CTL0_PM(0)                     /*!< no parity */
326 #define USART_PM_EVEN                 CTL0_PM(2)                     /*!< even parity */
327 #define USART_PM_ODD                  CTL0_PM(3)                     /*!< odd parity */
328 
329 /* USART wakeup method in mute mode */
330 #define CTL0_WM(regval)               (BIT(11) & ((uint32_t)(regval) << 11))
331 #define USART_WM_IDLE                 CTL0_WM(0)                     /*!< idle line */
332 #define USART_WM_ADDR                 CTL0_WM(1)                     /*!< address match */
333 
334 /* USART word length definitions */
335 #define CTL0_WL(regval)               (BIT(12) & ((uint32_t)(regval) << 12))
336 #define USART_WL_8BIT                 CTL0_WL(0)                     /*!< 8 bits */
337 #define USART_WL_9BIT                 CTL0_WL(1)                     /*!< 9 bits */
338 
339 /* USART oversample mode */
340 #define CTL0_OVSMOD(regval)           (BIT(15) & ((uint32_t)(regval) << 15))
341 #define USART_OVSMOD_8                CTL0_OVSMOD(1)                 /*!< oversampling by 8 */
342 #define USART_OVSMOD_16               CTL0_OVSMOD(0)                 /*!< oversampling by 16 */
343 
344 /* USART address detection mode */
345 #define CTL1_ADDM(regval)             (BIT(4) & ((uint32_t)(regval) << 4))
346 #define USART_ADDM_4BIT               CTL1_ADDM(0)                   /*!< 4-bit address detection */
347 #define USART_ADDM_FULLBIT            CTL1_ADDM(1)                   /*!< full-bit address detection */
348 
349 /* USART LIN break frame length */
350 #define CTL1_LBLEN(regval)            (BIT(5) & ((uint32_t)(regval) << 5))
351 #define USART_LBLEN_10B               CTL1_LBLEN(0)                  /*!< 10 bits break detection */
352 #define USART_LBLEN_11B               CTL1_LBLEN(1)                  /*!< 11 bits break detection */
353 
354 /* USART last bit clock pulse */
355 #define CTL1_CLEN(regval)             (BIT(8) & ((uint32_t)(regval) << 8))
356 #define USART_CLEN_NONE               CTL1_CLEN(0)                   /*!< clock pulse of the last data bit (MSB) is not output to the CK pin */
357 #define USART_CLEN_EN                 CTL1_CLEN(1)                   /*!< clock pulse of the last data bit (MSB) is output to the CK pin */
358 
359 /* USART clock phase */
360 #define CTL1_CPH(regval)              (BIT(9) & ((uint32_t)(regval) << 9))
361 #define USART_CPH_1CK                 CTL1_CPH(0)                    /*!< first clock transition is the first data capture edge */
362 #define USART_CPH_2CK                 CTL1_CPH(1)                    /*!< second clock transition is the first data capture edge */
363 
364 /* USART clock polarity */
365 #define CTL1_CPL(regval)              (BIT(10) & ((uint32_t)(regval) << 10))
366 #define USART_CPL_LOW                 CTL1_CPL(0)                    /*!< steady low value on CK pin */
367 #define USART_CPL_HIGH                CTL1_CPL(1)                    /*!< steady high value on CK pin */
368 
369 /* USART stop bits definitions */
370 #define CTL1_STB(regval)              (BITS(12,13) & ((uint32_t)(regval) << 12))
371 #define USART_STB_1BIT                CTL1_STB(0)                    /*!< 1 bit */
372 #define USART_STB_0_5BIT              CTL1_STB(1)                    /*!< 0.5 bit */
373 #define USART_STB_2BIT                CTL1_STB(2)                    /*!< 2 bits */
374 #define USART_STB_1_5BIT              CTL1_STB(3)                    /*!< 1.5 bits */
375 
376 /* USART data is transmitted/received with the LSB/MSB first */
377 #define CTL1_MSBF(regval)             (BIT(19) & ((uint32_t)(regval) << 19))
378 #define USART_MSBF_LSB                CTL1_MSBF(0)                   /*!< LSB first */
379 #define USART_MSBF_MSB                CTL1_MSBF(1)                   /*!< MSB first */
380 
381 /* USART auto baud rate detection mode bits definitions */
382 #define CTL1_ABDM(regval)             (BITS(21,22) & ((uint32_t)(regval) << 21))
383 #define USART_ABDM_FTOR               CTL1_ABDM(0)                   /*!< falling edge to rising edge measurement */
384 #define USART_ABDM_FTOF               CTL1_ABDM(1)                   /*!< falling edge to falling edge measurement */
385 
386 /* USART IrDA low-power enable */
387 #define CTL2_IRLP(regval)             (BIT(2) & ((uint32_t)(regval) << 2))
388 #define USART_IRLP_LOW                CTL2_IRLP(1)                   /*!< low-power */
389 #define USART_IRLP_NORMAL             CTL2_IRLP(0)                   /*!< normal */
390 
391 /* DMA enable for reception */
392 #define CTL2_DENR(regval)             (BIT(6) & ((uint32_t)(regval) << 6))
393 #define USART_DENR_ENABLE             CTL2_DENR(1)                   /*!< enable for reception */
394 #define USART_DENR_DISABLE            CTL2_DENR(0)                   /*!< disable for reception */
395 
396 /* DMA enable for transmission */
397 #define CTL2_DENT(regval)             (BIT(7) & ((uint32_t)(regval) << 7))
398 #define USART_DENT_ENABLE             CTL2_DENT(1)                   /*!< enable for transmission */
399 #define USART_DENT_DISABLE            CTL2_DENT(0)                   /*!< disable for transmission */
400 
401 /* USART RTS hardware flow control configure */
402 #define CTL2_RTSEN(regval)            (BIT(8) & ((uint32_t)(regval) << 8))
403 #define USART_RTS_ENABLE              CTL2_RTSEN(1)                  /*!< RTS hardware flow control enabled */
404 #define USART_RTS_DISABLE             CTL2_RTSEN(0)                  /*!< RTS hardware flow control disabled */
405 
406 /* USART CTS hardware flow control configure */
407 #define CTL2_CTSEN(regval)            (BIT(9) & ((uint32_t)(regval) << 9))
408 #define USART_CTS_ENABLE              CTL2_CTSEN(1)                  /*!< CTS hardware flow control enabled */
409 #define USART_CTS_DISABLE             CTL2_CTSEN(0)                  /*!< CTS hardware flow control disabled */
410 
411 /* USART one sample bit method configure */
412 #define CTL2_OSB(regval)              (BIT(11) & ((uint32_t)(regval) << 11))
413 #define USART_OSB_1BIT                CTL2_OSB(1)                    /*!< 1 sample bit */
414 #define USART_OSB_3BIT                CTL2_OSB(0)                    /*!< 3 sample bits */
415 
416 /* USART driver enable polarity mode */
417 #define CTL2_DEP(regval)              (BIT(15) & ((uint32_t)(regval) << 15))
418 #define USART_DEP_HIGH                CTL2_DEP(0)                    /*!< DE signal is active high */
419 #define USART_DEP_LOW                 CTL2_DEP(1)                    /*!< DE signal is active low */
420 
421 /* USART wakeup mode from deep-sleep mode */
422 #define CTL2_WUM(regval)              (BITS(20,21) & ((uint32_t)(regval) << 20))
423 #define USART_WUM_ADDR                CTL2_WUM(0)                    /*!< WUF active on address match */
424 #define USART_WUM_STARTB              CTL2_WUM(2)                    /*!< WUF active on start bit */
425 #define USART_WUM_RBNE                CTL2_WUM(3)                    /*!< WUF active on RBNE */
426 
427 /* USART hardware flow control coherence mode */
428 #define CHC_HCM(regval)               (BIT(0) & ((uint32_t)(regval) << 0))
429 #define USART_HCM_NONE                CHC_HCM(0)                     /*!< nRTS signal equals to the rxne status register */
430 #define USART_HCM_EN                  CHC_HCM(1)                     /*!< nRTS signal is set when the last data bit has been sampled */
431 
432 /* function declarations */
433 /* initialization functions */
434 /* reset USART */
435 void usart_deinit(uint32_t usart_periph);
436 /* configure USART baud rate value */
437 void usart_baudrate_set(uint32_t usart_periph, uint32_t baudval);
438 /* configure USART parity function */
439 void usart_parity_config(uint32_t usart_periph, uint32_t paritycfg);
440 /* configure USART word length */
441 void usart_word_length_set(uint32_t usart_periph, uint32_t wlen);
442 /* configure USART stop bit length */
443 void usart_stop_bit_set(uint32_t usart_periph, uint32_t stblen);
444 /* enable USART */
445 void usart_enable(uint32_t usart_periph);
446 /* disable USART */
447 void usart_disable(uint32_t usart_periph);
448 /* configure USART transmitter */
449 void usart_transmit_config(uint32_t usart_periph, uint32_t txconfig);
450 /* configure USART receiver */
451 void usart_receive_config(uint32_t usart_periph, uint32_t rxconfig);
452 
453 /* USART normal mode communication */
454 /* data is transmitted/received with the LSB/MSB first */
455 void usart_data_first_config(uint32_t usart_periph, uint32_t msbf);
456 /* configure USART inverted */
457 void usart_invert_config(uint32_t usart_periph, usart_invert_enum invertpara);
458 /* enable the USART overrun function */
459 void usart_overrun_enable(uint32_t usart_periph);
460 /* disable the USART overrun function */
461 void usart_overrun_disable(uint32_t usart_periph);
462 /* configure the USART oversample mode */
463 void usart_oversample_config(uint32_t usart_periph, uint32_t oversamp);
464 /* configure sample bit method */
465 void usart_sample_bit_config(uint32_t usart_periph, uint32_t osb);
466 /* enable receiver timeout */
467 void usart_receiver_timeout_enable(uint32_t usart_periph);
468 /* disable receiver timeout */
469 void usart_receiver_timeout_disable(uint32_t usart_periph);
470 /* configure receiver timeout threshold */
471 void usart_receiver_timeout_threshold_config(uint32_t usart_periph, uint32_t rtimeout);
472 /* USART transmit data function */
473 void usart_data_transmit(uint32_t usart_periph, uint32_t data);
474 /* USART receive data function */
475 uint16_t usart_data_receive(uint32_t usart_periph);
476 /* enable USART command */
477 void usart_command_enable(uint32_t usart_periph, uint32_t cmdtype);
478 
479 /* auto baud rate detection */
480 /* enable auto baud rate detection */
481 void usart_autobaud_detection_enable(uint32_t usart_periph);
482 /* disable auto baud rate detection */
483 void usart_autobaud_detection_disable(uint32_t usart_periph);
484 /* configure auto baud rate detection mode */
485 void usart_autobaud_detection_mode_config(uint32_t usart_periph, uint32_t abdmod);
486 
487 /* multi-processor communication */
488 /* configure address of the USART */
489 void usart_address_config(uint32_t usart_periph, uint8_t addr);
490 /* configure address detection mode */
491 void usart_address_detection_mode_config(uint32_t usart_periph, uint32_t addmod);
492 /* enable mute mode */
493 void usart_mute_mode_enable(uint32_t usart_periph);
494 /* disable mute mode */
495 void usart_mute_mode_disable(uint32_t usart_periph);
496 /* configure wakeup method in mute mode */
497 void usart_mute_mode_wakeup_config(uint32_t usart_periph, uint32_t wmethod);
498 
499 /* LIN mode communication */
500 /* enable LIN mode */
501 void usart_lin_mode_enable(uint32_t usart_periph);
502 /* disable LIN mode */
503 void usart_lin_mode_disable(uint32_t usart_periph);
504 /* LIN break detection length */
505 void usart_lin_break_detection_length_config(uint32_t usart_periph, uint32_t lblen);
506 
507 /* half-duplex communication */
508 /* enable half-duplex mode */
509 void usart_halfduplex_enable(uint32_t usart_periph);
510 /* disable half-duplex mode */
511 void usart_halfduplex_disable(uint32_t usart_periph);
512 
513 /* synchronous communication */
514 /* enable clock */
515 void usart_clock_enable(uint32_t usart_periph);
516 /* disable clock */
517 void usart_clock_disable(uint32_t usart_periph);
518 /* configure USART synchronous mode parameters */
519 void usart_synchronous_clock_config(uint32_t usart_periph, uint32_t clen, uint32_t cph, uint32_t cpl);
520 
521 /* smartcard communication */
522 /* configure guard time value in smartcard mode */
523 void usart_guard_time_config(uint32_t usart_periph, uint32_t guat);
524 /* enable smartcard mode */
525 void usart_smartcard_mode_enable(uint32_t usart_periph);
526 /* disable smartcard mode */
527 void usart_smartcard_mode_disable(uint32_t usart_periph);
528 /* enable NACK in smartcard mode */
529 void usart_smartcard_mode_nack_enable(uint32_t usart_periph);
530 /* disable NACK in smartcard mode */
531 void usart_smartcard_mode_nack_disable(uint32_t usart_periph);
532 /* enable early NACK in smartcard mode */
533 void usart_smartcard_mode_early_nack_enable(uint32_t usart_periph);
534 /* disable early NACK in smartcard mode */
535 void usart_smartcard_mode_early_nack_disable(uint32_t usart_periph);
536 /* configure smartcard auto-retry number */
537 void usart_smartcard_autoretry_config(uint32_t usart_periph, uint32_t scrtnum);
538 /* configure block length */
539 void usart_block_length_config(uint32_t usart_periph, uint32_t bl);
540 
541 /* IrDA communication */
542 /* enable IrDA mode */
543 void usart_irda_mode_enable(uint32_t usart_periph);
544 /* disable IrDA mode */
545 void usart_irda_mode_disable(uint32_t usart_periph);
546 /* configure the peripheral clock prescaler */
547 void usart_prescaler_config(uint32_t usart_periph, uint32_t psc);
548 /* configure IrDA low-power */
549 void usart_irda_lowpower_config(uint32_t usart_periph, uint32_t irlp);
550 
551 /* hardware flow communication */
552 /* configure hardware flow control RTS */
553 void usart_hardware_flow_rts_config(uint32_t usart_periph, uint32_t rtsconfig);
554 /* configure hardware flow control CTS */
555 void usart_hardware_flow_cts_config(uint32_t usart_periph, uint32_t ctsconfig);
556 
557 /* coherence control */
558 /* configure hardware flow control coherence mode */
559 void usart_hardware_flow_coherence_config(uint32_t usart_periph, uint32_t hcm);
560 
561 /* enable RS485 driver */
562 void usart_rs485_driver_enable(uint32_t usart_periph);
563 /* disable RS485 driver */
564 void usart_rs485_driver_disable(uint32_t usart_periph);
565 /* configure driver enable assertion time */
566 void usart_driver_assertime_config(uint32_t usart_periph, uint32_t deatime);
567 /* configure driver enable de-assertion time */
568 void usart_driver_deassertime_config(uint32_t usart_periph, uint32_t dedtime);
569 /* configure driver enable polarity mode */
570 void usart_depolarity_config(uint32_t usart_periph, uint32_t dep);
571 
572 /* USART DMA */
573 /* configure USART DMA for reception */
574 void usart_dma_receive_config(uint32_t usart_periph, uint32_t dmacmd);
575 /* configure USART DMA for transmission */
576 void usart_dma_transmit_config(uint32_t usart_periph, uint32_t dmacmd);
577 /* disable DMA on reception error */
578 void usart_reception_error_dma_disable(uint32_t usart_periph);
579 /* enable DMA on reception error */
580 void usart_reception_error_dma_enable(uint32_t usart_periph);
581 
582 /* enable USART to wakeup the mcu from deep-sleep mode */
583 void usart_wakeup_enable(uint32_t usart_periph);
584 /* disable USART to wakeup the mcu from deep-sleep mode */
585 void usart_wakeup_disable(uint32_t usart_periph);
586 /* configure the USART wakeup mode from deep-sleep mode */
587 void usart_wakeup_mode_config(uint32_t usart_periph, uint32_t wum);
588 
589 /* USART receive FIFO */
590 /* enable receive FIFO */
591 void usart_receive_fifo_enable(uint32_t usart_periph);
592 /* disable receive FIFO */
593 void usart_receive_fifo_disable(uint32_t usart_periph);
594 /* read receive FIFO counter number */
595 uint8_t usart_receive_fifo_counter_number(uint32_t usart_periph);
596 
597 /* flag & interrupt functions */
598 /* get flag in STAT/RFCS register */
599 FlagStatus usart_flag_get(uint32_t usart_periph, usart_flag_enum flag);
600 /* clear USART status */
601 void usart_flag_clear(uint32_t usart_periph, usart_flag_enum flag);
602 /* enable USART interrupt */
603 void usart_interrupt_enable(uint32_t usart_periph, usart_interrupt_enum interrupt);
604 /* disable USART interrupt */
605 void usart_interrupt_disable(uint32_t usart_periph, usart_interrupt_enum interrupt);
606 /* get USART interrupt and flag status */
607 FlagStatus usart_interrupt_flag_get(uint32_t usart_periph, usart_interrupt_flag_enum int_flag);
608 /* clear USART interrupt flag */
609 void usart_interrupt_flag_clear(uint32_t usart_periph, usart_interrupt_flag_enum int_flag);
610 
611 #endif /* GD32L23X_USART_H */
612