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