1 /**
2 ******************************************************************************
3 * @file lib_uart.c
4 * @author Application Team
5 * @version V1.1.0
6 * @date 2019-10-28
7 * @brief UART library.
8 ******************************************************************************
9 * @attention
10 *
11 ******************************************************************************
12 */
13 #include "lib_uart.h"
14 #include "lib_clk.h"
15
16 #define UART_STATE_RCMsk (0xBCUL)
17 #define UART_INTSTS_RCMsk (0x3FUL)
18 #define UART_BAUDDIV_RSTValue (0UL)
19 #define UART_CTRL_RSTValue (0UL)
20 #define UART_CTRL2_RSTValue (0UL)
21
22 /**
23 * @brief Iinitializes the UARTx peripheral registers to their default reset
24 values.
25 * @param UARTx: UART0~UART5
26 * @retval None
27 */
UART_DeInit(UART_Type * UARTx)28 void UART_DeInit(UART_Type *UARTx)
29 {
30 __IO uint32_t dummy_data = 0UL;
31
32 /* Check parameters */
33 assert_parameters(IS_UART_ALL_INSTANCE(UARTx));
34
35 /* read data, clear RXFULL flag */
36 dummy_data = UARTx->DATA;
37 dummy_data += 1;
38
39 UARTx->INTSTS = UART_INTSTS_RCMsk;
40 UARTx->STATE = UART_STATE_RCMsk;
41 UARTx->BAUDDIV = UART_BAUDDIV_RSTValue;
42 UARTx->CTRL2 = UART_CTRL2_RSTValue;
43 UARTx->CTRL = UART_CTRL_RSTValue;
44 }
45
46 /**
47 * @brief Iinitializes UART.
48 * @param UARTx: UART0~UART5
49 InitStruct:UART configuration.
50 Mode: (between UART_MODE_RX and UART_MODE_TX, can use the '|' operator)
51 UART_MODE_RX
52 UART_MODE_TX
53 UART_MODE_OFF
54 Parity:
55 UART_PARITY_EVEN
56 UART_PARITY_ODD
57 UART_PARITY_0
58 UART_PARITY_1
59 UART_PARITY_NONE
60 FirstBit:
61 UART_FIRSTBIT_LSB
62 UART_FIRSTBIT_MSB
63 Baudrate: Baudrate value, 300UL ~ 819200UL
64 * @retval None
65 */
UART_Init(UART_Type * UARTx,UART_InitType * InitStruct)66 void UART_Init(UART_Type *UARTx, UART_InitType *InitStruct)
67 {
68 uint32_t pclk;
69 uint32_t div;
70 uint32_t tmp_reg1, tmp_reg2;
71
72 /* Check parameters */
73 assert_parameters(IS_UART_ALL_INSTANCE(UARTx));
74 assert_parameters(IS_UART_MODE(InitStruct->Mode));
75 assert_parameters(IS_UART_PARITY(InitStruct->Parity));
76 assert_parameters(IS_UART_FIRSTBIT(InitStruct->FirstBit));
77 assert_parameters(IS_UART_BAUDRATE(InitStruct->Baudrate));
78
79 tmp_reg1 = UARTx->CTRL;
80 tmp_reg1 &= ~(UART_CTRL_RXEN_Msk\
81 |UART_CTRL_TXEN_Msk);
82 tmp_reg1 |= (InitStruct->Mode);
83
84 tmp_reg2 = UARTx->CTRL2;
85 tmp_reg2 &= ~(UART_CTRL2_MSB_Msk \
86 |UART_CTRL2_PMODE_Msk);
87 tmp_reg2 |= (InitStruct->Parity\
88 |InitStruct->FirstBit);
89 UARTx->CTRL2 = tmp_reg2;
90
91 pclk = CLK_GetPCLKFreq();
92 div = pclk/InitStruct->Baudrate;
93
94 if ((pclk%InitStruct->Baudrate) > (InitStruct->Baudrate/2))
95 {
96 div++;
97 }
98
99 UARTx->BAUDDIV = div;
100 UARTx->CTRL = tmp_reg1;
101 }
102
103 /**
104 * @brief Fills each UART_InitType member with its default value.
105 * @param InitStruct: pointer to an UART_InitType structure which will be initialized.
106 * @retval None
107 */
UART_StructInit(UART_InitType * InitStruct)108 void UART_StructInit(UART_InitType *InitStruct)
109 {
110 /*-------------- Reset UART init structure parameters values ---------------*/
111 /* Initialize the Baudrate member */
112 InitStruct->Baudrate = 9600;
113 /* Initialize the FirstBit member */
114 InitStruct->FirstBit = UART_FIRSTBIT_LSB;
115 /* Initialize the Mode member */
116 InitStruct->Mode = UART_MODE_OFF;
117 /* Initialize the Parity member */
118 InitStruct->Parity = UART_PARITY_NONE;
119 }
120
121 /**
122 * @brief Gets peripheral flag.
123 * @param UARTx: UART0~UART5
124 FlagMask: flag to get.
125 --UART_FLAG_DMATXDONE
126 --UART_FLAG_RXPARITY
127 --UART_FLAG_TXDONE
128 --UART_FLAG_RXPE
129 --UART_FLAG_RXOV
130 --UART_FLAG_TXOV
131 --UART_FLAG_RXFULL
132 * @retval 1:flag set
133 0:flag reset
134 */
UART_GetFlag(UART_Type * UARTx,uint32_t FlagMask)135 uint8_t UART_GetFlag(UART_Type *UARTx, uint32_t FlagMask)
136 {
137 /* Check parameters */
138 assert_parameters(IS_UART_ALL_INSTANCE(UARTx));
139 assert_parameters(IS_UART_FLAGR(FlagMask));
140
141 if (UARTx->STATE&FlagMask)
142 {
143 return 1;
144 }
145 else
146 {
147 return 0;
148 }
149 }
150
151 /**
152 * @brief Clears peripheral flag.
153 * @param UARTx: UART0~UART5
154 FlagMask: status to clear, can use the '|' operator.
155 --UART_FLAG_DMATXDONE
156 --UART_FLAG_TXDONE
157 --UART_FLAG_RXPE
158 --UART_FLAG_RXOV
159 --UART_FLAG_TXOV
160 * @retval None
161 */
UART_ClearFlag(UART_Type * UARTx,uint32_t FlagMask)162 void UART_ClearFlag(UART_Type *UARTx, uint32_t FlagMask)
163 {
164 /* Check parameters */
165 assert_parameters(IS_UART_ALL_INSTANCE(UARTx));
166 assert_parameters(IS_UART_FLAGC(FlagMask));
167
168 UARTx->STATE = FlagMask;
169 }
170
171 /**
172 * @brief Enables or disables the specified UART interrupts.
173 * @param UARTx: UART0~UART5
174 INTMask: can use the '|' operator.
175 --UART_INT_TXDONE
176 --UART_INT_RXPE
177 --UART_INT_RXOV
178 --UART_INT_TXOV
179 --UART_INT_RX
180 NewState:New status of interrupt mask.
181 * @retval None
182 */
UART_INTConfig(UART_Type * UARTx,uint32_t INTMask,uint8_t NewState)183 void UART_INTConfig(UART_Type *UARTx, uint32_t INTMask, uint8_t NewState)
184 {
185 /* Check parameters */
186 assert_parameters(IS_UART_ALL_INSTANCE(UARTx));
187 assert_parameters(IS_UART_INT(INTMask));
188 assert_parameters(IS_FUNCTIONAL_STATE(NewState));
189
190 if (NewState == ENABLE)
191 {
192 UARTx->CTRL |= INTMask;
193 }
194 else
195 {
196 UARTx->CTRL &= ~INTMask;
197 }
198 }
199
200 /**
201 * @brief Gets interrupt status.
202 * @param UARTx: UART0~UART5
203 INTMask: status to get.
204 --UART_INTSTS_TXDONE
205 --UART_INTSTS_RXPE
206 --UART_INTSTS_RXOV
207 --UART_INTSTS_TXOV
208 --UART_INTSTS_RX
209 * @retval 1:status set
210 0:status reset
211 */
UART_GetINTStatus(UART_Type * UARTx,uint32_t INTMask)212 uint8_t UART_GetINTStatus(UART_Type *UARTx, uint32_t INTMask)
213 {
214 /* Check parameters */
215 assert_parameters(IS_UART_ALL_INSTANCE(UARTx));
216 assert_parameters(IS_UART_INTFLAGR(INTMask));
217
218 if (UARTx->INTSTS&INTMask)
219 {
220 return 1;
221 }
222 else
223 {
224 return 0;
225 }
226 }
227
228 /**
229 * @brief Clears interrupt status.
230 * @param UARTx: UART0~UART5
231 INTMask: status to clear, can use the '|' operator.
232 --UART_INTSTS_TXDONE
233 --UART_INTSTS_RXPE
234 --UART_INTSTS_RXOV
235 --UART_INTSTS_TXOV
236 --UART_INTSTS_RX
237 * @retval None
238 */
UART_ClearINTStatus(UART_Type * UARTx,uint32_t INTMask)239 void UART_ClearINTStatus(UART_Type *UARTx, uint32_t INTMask)
240 {
241 /* Check parameters */
242 assert_parameters(IS_UART_ALL_INSTANCE(UARTx));
243 assert_parameters(IS_UART_INTFLAGC(INTMask));
244
245 UARTx->INTSTS = INTMask;
246 }
247
248 /**
249 * @brief Loads send data register.
250 * @param UARTx: UART0~USART5
251 ch: data to send.
252 * @retval None
253 */
UART_SendData(UART_Type * UARTx,uint8_t ch)254 void UART_SendData(UART_Type *UARTx, uint8_t ch)
255 {
256 /* Check parameters */
257 assert_parameters(IS_UART_ALL_INSTANCE(UARTx));
258
259 UARTx->DATA = ch;
260 }
261
262 /**
263 * @brief Reads receive data register.
264 * @param UARTx: UART0~UART5
265 * @retval The received data.
266 */
UART_ReceiveData(UART_Type * UARTx)267 uint8_t UART_ReceiveData(UART_Type *UARTx)
268 {
269 /* Check parameters */
270 assert_parameters(IS_UART_ALL_INSTANCE(UARTx));
271
272 return UARTx->DATA;
273 }
274
275 /**
276 * @brief Configures UART baudrate.
277 * @param UARTx: UART0~UART5
278 BaudRate: Baudrate value
279 * @retval None
280 */
UART_BaudrateConfig(UART_Type * UARTx,uint32_t BaudRate)281 void UART_BaudrateConfig(UART_Type *UARTx, uint32_t BaudRate)
282 {
283 uint32_t pclk;
284 uint32_t div;
285
286 /* Check parameters */
287 assert_parameters(IS_UART_ALL_INSTANCE(UARTx));
288 assert_parameters(IS_UART_BAUDRATE(BaudRate));
289
290 pclk = CLK_GetPCLKFreq();
291 div = pclk/BaudRate;
292 if ((pclk%BaudRate) > (BaudRate/2))
293 {
294 div++;
295 }
296
297 UARTx->BAUDDIV = div;
298 }
299
300 /**
301 * @brief Enables or disables UART Transmitter/Receiver.
302 * @param UARTx: UART0~UART5
303 Mode:
304 UART_MODE_RX
305 UART_MODE_TX
306 NewState:
307 ENABLE
308 DISABLE
309 * @retval None
310 */
UART_Cmd(UART_Type * UARTx,uint32_t Mode,uint32_t NewState)311 void UART_Cmd(UART_Type *UARTx, uint32_t Mode, uint32_t NewState)
312 {
313 /* Check parameters */
314 assert_parameters(IS_UART_ALL_INSTANCE(UARTx));
315 assert_parameters(IS_UART_MODE(Mode));
316 assert_parameters(IS_FUNCTIONAL_STATE(NewState));
317
318 if (NewState == ENABLE)
319 {
320 UARTx->CTRL |= Mode;
321 }
322 else
323 {
324 UARTx->CTRL &= ~Mode;
325 }
326 }
327
328 /**
329 * @brief Gets UART configure information.
330 * @param[in] UARTx: UART0~UART5
331 * @param[out] ConfigInfo: The pointer of UART configuration.
332 * @retval None
333 */
UART_GetConfigINFO(UART_Type * UARTx,UART_ConfigINFOType * ConfigInfo)334 void UART_GetConfigINFO(UART_Type *UARTx, UART_ConfigINFOType *ConfigInfo)
335 {
336 uint32_t tmp1, tmp2, tmp3;
337 uint32_t pclk;
338
339 /* Check parameters */
340 assert_parameters(IS_UART_ALL_INSTANCE(UARTx));
341
342 tmp1 = UARTx->CTRL;
343 tmp2 = UARTx->BAUDDIV;
344 pclk = CLK_GetPCLKFreq();
345 tmp3 = UARTx->CTRL2;
346
347 /* Mode_Transmit */
348 if (tmp1 & UART_CTRL_TXEN_Msk)
349 ConfigInfo->Mode_Transmit = 1;
350 else
351 ConfigInfo->Mode_Transmit = 0;
352
353 /* Mode_Receive */
354 if (tmp1 & UART_CTRL_RXEN_Msk)
355 ConfigInfo->Mode_Receive = 1;
356 else
357 ConfigInfo->Mode_Receive = 0;
358
359 /* Baudrate */
360 ConfigInfo->Baudrate = pclk / tmp2;
361
362 /* LSB/MSB */
363 if (tmp3 & UART_CTRL2_MSB_Msk)
364 ConfigInfo->FirstBit = 1;
365 else
366 ConfigInfo->FirstBit = 0;
367
368 /* Parity */
369 ConfigInfo->Parity = (tmp3 & UART_CTRL2_PMODE) >> UART_CTRL2_PMODE_Pos;
370 }
371
372 /*********************************** END OF FILE ******************************/
373