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