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