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