1 /**
2   ******************************************************************************
3   * @file    lib_u32k.c
4   * @author  Application Team
5   * @version V1.1.0
6   * @date    2019-10-28
7   * @brief   UART 32K library.
8   ******************************************************************************
9   * @attention
10   *
11   ******************************************************************************
12   */
13 #include "lib_u32k.h"
14 
15 #define U32K_STS_Msk            (0x7UL)
16 #define U32K_CTRL0_RSTValue     (0UL)
17 #define U32K_CTRL1_RSTValue     (0UL)
18 #define U32K_PHASE_RSTValue     (0x4B00UL)
19 
20 /**
21   * @brief  Initializes the U32Kx peripheral registers to their default reset values.
22   * @param  U32Kx: U32K0~U32K1
23   * @retval None
24   */
U32K_DeInit(U32K_Type * U32Kx)25 void U32K_DeInit(U32K_Type *U32Kx)
26 {
27   /* Check parameters */
28   assert_parameters(IS_U32K_ALL_INSTANCE(U32Kx));
29 
30   /* Disable U32K */
31   U32Kx->CTRL0 &= ~U32K_CTRL0_EN;
32   /* clear interrupt status */
33   U32Kx->STS = U32K_STS_Msk;
34   /* write default reset values */
35   U32Kx->CTRL0 = U32K_CTRL0_RSTValue;
36   U32Kx->CTRL1 = U32K_CTRL1_RSTValue;
37   U32Kx->BAUDDIV = U32K_PHASE_RSTValue;
38 }
39 
40 /**
41   * @brief  Initializes U32K.
42   * @param  U32Kx:
43                 U32K0~U32K1
44             InitStruct: U32K configuration
45                 Debsel:
46                     U32K_DEBSEL_0
47                     U32K_DEBSEL_1
48                     U32K_DEBSEL_2
49                     U32K_DEBSEL_3
50                 Parity:
51                     U32K_PARITY_EVEN
52                     U32K_PARITY_ODD
53                     U32K_PARITY_0
54                     U32K_PARITY_1
55                     U32K_PARITY_NONE
56                 FirstBit:
57                     U32K_FIRSTBIT_LSB
58                     U32K_FIRSTBIT_MSB
59                 AutoCal:
60                     U32K_AUTOCAL_ON
61                     U32K_AUTOCAL_OFF
62                 LineSel:
63                     U32K_LINE_RX0
64                     U32K_LINE_RX1
65                     U32K_LINE_RX2
66                     U32K_LINE_RX3
67                 Baudrate: Baudrate value, 300UL ~ 14400UL
68   * @retval None
69   */
U32K_Init(U32K_Type * U32Kx,U32K_InitType * InitStruct)70 void U32K_Init(U32K_Type *U32Kx, U32K_InitType *InitStruct)
71 {
72   uint32_t tmp_reg1, tmp_reg2;
73 
74   /* Check parameters */
75   assert_parameters(IS_U32K_ALL_INSTANCE(U32Kx));
76   assert_parameters(IS_U32K_DEBSEL(InitStruct->Debsel));
77   assert_parameters(IS_U32K_PARITY(InitStruct->Parity));
78   assert_parameters(IS_U32K_FIRSTBIT(InitStruct->FirstBit));
79   assert_parameters(IS_U32K_AUTOCAL(InitStruct->AutoCal));
80   assert_parameters(IS_U32K_LINE(InitStruct->LineSel));
81   assert_parameters(IS_U32K_BAUDRATE(InitStruct->Baudrate));
82 
83   tmp_reg1 = U32Kx->CTRL0;
84   tmp_reg1 &= ~(U32K_CTRL0_DEBSEL\
85                |U32K_CTRL0_PMODE\
86                |U32K_CTRL0_MSB\
87                |U32K_CTRL0_ACOFF);
88   tmp_reg1 |= (InitStruct->Debsel\
89               |InitStruct->Parity\
90               |InitStruct->FirstBit\
91               |InitStruct->AutoCal);
92   U32Kx->CTRL0 = tmp_reg1;
93   if ((RTC->PSCA & RTC_PSCA_PSCA) == RTC_PSCA_PSCA_0) //RTCCLK 32768Hz
94     U32Kx->BAUDDIV = 65536*InitStruct->Baudrate/32768;
95   else if ((RTC->PSCA & RTC_PSCA_PSCA) == RTC_PSCA_PSCA_1) //RTCCLK 8192Hz
96     U32Kx->BAUDDIV = 65536*InitStruct->Baudrate/8192;
97   else
98     assert_parameters(0);
99 
100   tmp_reg2 = U32Kx->CTRL1;
101   tmp_reg2 &= ~(U32K_CTRL1_RXSEL);
102   tmp_reg2 |= (InitStruct->LineSel);
103   U32Kx->CTRL1 = tmp_reg2;
104 }
105 
106 /**
107   * @brief  Fills each U32K_InitType member with its default value.
108   * @param  InitStruct: pointer to an U32K_InitType structure which will be initialized.
109   * @retval None
110   */
U32K_StructInit(U32K_InitType * InitStruct)111 void U32K_StructInit(U32K_InitType *InitStruct)
112 {
113   /*-------------- Reset U32K init structure parameters values ---------------*/
114   /* Initialize the AutoCal member */
115   InitStruct->AutoCal = U32K_AUTOCAL_ON;
116   /* Initialize the Baudrate member */
117   InitStruct->Baudrate = 9600;
118   /* Initialize the Debsel member */
119   InitStruct->Debsel = U32K_DEBSEL_0;
120   /* Initialize the FirstBit member */
121   InitStruct->FirstBit = U32K_FIRSTBIT_LSB;
122   /* Initialize the LineSel member */
123   InitStruct->LineSel = U32K_LINE_RX0;
124   /* Initialize the Parity member */
125   InitStruct->Parity = U32K_PARITY_NONE;
126 }
127 
128 /**
129   * @brief  Enables or disables U32K interrupt.
130   * @param  U32Kx:
131                 U32K0~U32K1
132             INTMask: can use the '|' operator
133                 U32K_INT_RXOV
134                 U32K_INT_RXPE
135                 U32K_INT_RX
136             NewState:
137                 ENABLE
138                 DISABLE
139   * @retval None
140   */
U32K_INTConfig(U32K_Type * U32Kx,uint32_t INTMask,uint8_t NewState)141 void U32K_INTConfig(U32K_Type *U32Kx, uint32_t INTMask, uint8_t NewState)
142 {
143   uint32_t tmp;
144 
145   /* Check parameters */
146   assert_parameters(IS_U32K_ALL_INSTANCE(U32Kx));
147   assert_parameters(IS_U32K_INT(INTMask));
148   assert_parameters(IS_FUNCTIONAL_STATE(NewState));
149 
150   tmp = U32Kx->CTRL1;
151   tmp &= ~INTMask;
152   if (NewState == ENABLE)
153   {
154     tmp |= INTMask;
155   }
156   U32Kx->CTRL1 = tmp;
157 }
158 
159 /**
160   * @brief  Gets interrupt flag status.
161   * @param  U32Kx:
162                 U32K0~U32K1
163             INTMask:
164                 U32K_INTSTS_RXOV
165                 U32K_INTSTS_RXPE
166                 U32K_INTSTS_RX
167   * @retval Flag status
168   */
U32K_GetINTStatus(U32K_Type * U32Kx,uint32_t INTMask)169 uint8_t U32K_GetINTStatus(U32K_Type *U32Kx, uint32_t INTMask)
170 {
171   /* Check parameters */
172   assert_parameters(IS_U32K_ALL_INSTANCE(U32Kx));
173   assert_parameters(IS_U32K_INTFLAGR(INTMask));
174 
175   if (U32Kx->STS&INTMask)
176     return 1;
177   else
178     return 0;
179 }
180 
181 /**
182   * @brief  Clears flag status.
183   * @param  U32Kx:
184                 U32K0~U32K1
185             INTMask: can use the '|' operator
186                 U32K_INTSTS_RXOV
187                 U32K_INTSTS_RXPE
188                 U32K_INTSTS_RX
189   * @retval None
190   */
U32K_ClearINTStatus(U32K_Type * U32Kx,uint32_t INTMask)191 void U32K_ClearINTStatus(U32K_Type *U32Kx, uint32_t INTMask)
192 {
193   /* Check parameters */
194   assert_parameters(IS_U32K_ALL_INSTANCE(U32Kx));
195   assert_parameters(IS_U32K_INTFLAGC(INTMask));
196 
197   U32Kx->STS = INTMask;
198 }
199 
200 /**
201   * @brief  Reads receive data register.
202   * @param  U32Kx:
203                 U32K0~U32K1
204   * @retval Receive data value
205   */
U32K_ReceiveData(U32K_Type * U32Kx)206 uint8_t U32K_ReceiveData(U32K_Type *U32Kx)
207 {
208   /* Check parameters */
209   assert_parameters(IS_U32K_ALL_INSTANCE(U32Kx));
210 
211   return (U32Kx->DATA);
212 }
213 
214 /**
215   * @brief  Configures U32K baudrate.
216   * @param  U32Kx: U32K0~U32K1
217             BaudRate: Baudrate value
218   * @retval None
219   */
U32K_BaudrateConfig(U32K_Type * U32Kx,uint32_t BaudRate)220 void U32K_BaudrateConfig(U32K_Type *U32Kx, uint32_t BaudRate)
221 {
222   /* Check parameters */
223   assert_parameters(IS_U32K_ALL_INSTANCE(U32Kx));
224   assert_parameters(IS_U32K_BAUDRATE(BaudRate));
225 
226   if ((RTC->PSCA & RTC_PSCA_PSCA) == RTC_PSCA_PSCA_0) //RTCCLK 32768Hz
227     U32Kx->BAUDDIV = 65536*BaudRate/32768;
228   else if ((RTC->PSCA & RTC_PSCA_PSCA) == RTC_PSCA_PSCA_1) //RTCCLK 8192Hz
229     U32Kx->BAUDDIV = 65536*BaudRate/8192;
230   else
231     assert_parameters(0);
232 }
233 
234 /**
235   * @brief  Enables or disables U32K controlller.
236   * @param  U32Kx:
237                 U32K0~U32K1
238             NewState:
239                 ENABLE
240                 DISABLE
241   * @retval None
242   */
U32K_Cmd(U32K_Type * U32Kx,uint32_t NewState)243 void U32K_Cmd(U32K_Type *U32Kx, uint32_t NewState)
244 {
245   uint32_t tmp;
246 
247   /* Check parameters */
248   assert_parameters(IS_U32K_ALL_INSTANCE(U32Kx));
249   assert_parameters(IS_FUNCTIONAL_STATE(NewState));
250 
251   tmp = U32Kx->CTRL0;
252   tmp &= ~(U32K_CTRL0_EN);
253   if (NewState == ENABLE)
254   {
255     tmp |= U32K_CTRL0_EN;
256   }
257   U32Kx->CTRL0 = tmp;
258 }
259 
260 /**
261   * @brief  Configures U32K receive line.
262   * @param  U32Kx:
263                 U32K0~U32K1
264             Line:
265                 U32K_LINE_RX0
266                 U32K_LINE_RX1
267                 U32K_LINE_RX2
268                 U32K_LINE_RX3
269   * @retval None
270   */
U32K_LineConfig(U32K_Type * U32Kx,uint32_t Line)271 void U32K_LineConfig(U32K_Type *U32Kx, uint32_t Line)
272 {
273   uint32_t tmp;
274 
275   /* Check parameters */
276   assert_parameters(IS_U32K_ALL_INSTANCE(U32Kx));
277   assert_parameters(IS_U32K_LINE(Line));
278 
279   tmp = U32Kx->CTRL1;
280   tmp &= ~U32K_CTRL1_RXSEL_Msk;
281   tmp |= Line;
282 
283   U32Kx->CTRL1 = tmp;
284 }
285 
286 /**
287   * @brief  Configures Wake-up mode.
288   * @param  U32Kx:
289                 U32K0~U32K1
290             WKUMode:
291                 U32K_WKUMOD_RX
292                 U32K_WKUMOD_PC
293   * @retval None
294   */
U32K_WKUModeConfig(U32K_Type * U32Kx,uint32_t WKUMode)295 void U32K_WKUModeConfig(U32K_Type *U32Kx, uint32_t WKUMode)
296 {
297   uint32_t tmp;
298 
299   /* Check parameters */
300   assert_parameters(IS_U32K_ALL_INSTANCE(U32Kx));
301   assert_parameters(IS_U32K_WKUMODE(WKUMode));
302 
303   tmp = U32Kx->CTRL0;
304   tmp &= ~U32K_CTRL0_WKUMODE_Msk;
305   tmp |= WKUMode;
306   U32Kx->CTRL0 = tmp;
307 }
308 
309 /*********************************** END OF FILE ******************************/
310