blob: 8d383ca5f90b1eb011ba70becf6207673cd6a25a (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
|
/**************************************************************************//**
* @file sys.c
* @version V3.00
* @brief M2354 series System Manager (SYS) driver source file
*
* @copyright SPDX-License-Identifier: Apache-2.0
* @copyright Copyright (C) 2020 Nuvoton Technology Corp. All rights reserved.
*****************************************************************************/
#include "NuMicro.h"
/** @addtogroup Standard_Driver Standard Driver
@{
*/
/** @addtogroup SYS_Driver SYS Driver
@{
*/
/** @addtogroup SYS_EXPORTED_FUNCTIONS SYS Exported Functions
@{
*/
/**
* @brief Clear reset source
* @param[in] u32Src is system reset source. Including :
* - \ref SYS_RSTSTS_CPULKRF_Msk
* - \ref SYS_RSTSTS_CPURF_Msk
* - \ref SYS_RSTSTS_SYSRF_Msk
* - \ref SYS_RSTSTS_BODRF_Msk
* - \ref SYS_RSTSTS_LVRF_Msk
* - \ref SYS_RSTSTS_WDTRF_Msk
* - \ref SYS_RSTSTS_PINRF_Msk
* - \ref SYS_RSTSTS_PORF_Msk
* @return None
* @details This function clear the selected system reset source.
*/
void SYS_ClearResetSrc(uint32_t u32Src)
{
SYS->RSTSTS = u32Src;
}
/**
* @brief Get Brown-out detector output status
* @param None
* @retval 0 System voltage is higher than BODVL setting or BODEN is 0.
* @retval 1 System voltage is lower than BODVL setting.
* @details This function get Brown-out detector output status.
*/
uint32_t SYS_GetBODStatus(void)
{
return ((SYS->BODCTL & SYS_BODCTL_BODOUT_Msk) >> SYS_BODCTL_BODOUT_Pos);
}
/**
* @brief Get reset status register value
* @param None
* @return Reset source
* @details This function get the system reset status register value.
*/
uint32_t SYS_GetResetSrc(void)
{
return (SYS->RSTSTS);
}
/**
* @brief Check if register is locked nor not
* @param None
* @retval 0 Write-protection function is disabled.
* 1 Write-protection function is enabled.
* @details This function check register write-protection bit setting.
*/
uint32_t SYS_IsRegLocked(void)
{
return SYS->REGLCTL & 1UL ? 0UL : 1UL;
}
/**
* @brief Get product ID
* @param None
* @return Product ID
* @details This function get product ID.
*/
uint32_t SYS_ReadPDID(void)
{
return SYS->PDID;
}
/**
* @brief Reset chip with chip reset
* @param None
* @return None
* @details This function reset chip with chip reset.
* The register write-protection function should be disabled before using this function.
*/
void SYS_ResetChip(void)
{
SYS->IPRST0 |= SYS_IPRST0_CHIPRST_Msk;
}
/**
* @brief Reset chip with CPU reset
* @param None
* @return None
* @details This function reset CPU with CPU reset.
* The register write-protection function should be disabled before using this function.
*/
void SYS_ResetCPU(void)
{
SYS->IPRST0 |= SYS_IPRST0_CPURST_Msk;
}
/**
* @brief Reset selected module
* @param[in] u32ModuleIndex is module index. Including :
* - \ref PDMA0_RST
* - \ref PDMA1_RST
* - \ref EBI_RST
* - \ref USBH_RST
* - \ref SDH0_RST
* - \ref CRC_RST
* - \ref CRPT_RST
* - \ref KS_RST
* - \ref GPIO_RST
* - \ref TMR0_RST
* - \ref TMR1_RST
* - \ref TMR2_RST
* - \ref TMR3_RST
* - \ref TMR4_RST
* - \ref TMR5_RST
* - \ref ACMP01_RST
* - \ref I2C0_RST
* - \ref I2C1_RST
* - \ref I2C2_RST
* - \ref QSPI0_RST
* - \ref SPI0_RST
* - \ref SPI1_RST
* - \ref SPI2_RST
* - \ref SPI3_RST
* - \ref UART0_RST
* - \ref UART1_RST
* - \ref UART2_RST
* - \ref UART3_RST
* - \ref UART4_RST
* - \ref UART5_RST
* - \ref CAN0_RST
* - \ref OTG_RST
* - \ref USBD_RST
* - \ref EADC_RST
* - \ref I2S0_RST
* - \ref LCD_RST
* - \ref TRNG_RST
* - \ref SC0_RST
* - \ref SC1_RST
* - \ref SC2_RST
* - \ref USCI0_RST
* - \ref USCI1_RST
* - \ref DAC_RST
* - \ref EPWM0_RST
* - \ref EPWM1_RST
* - \ref BPWM0_RST
* - \ref BPWM1_RST
* - \ref QEI0_RST
* - \ref QEI1_RST
* - \ref ECAP0_RST
* - \ref ECAP1_RST
* @return None
* @details This function reset selected module.
*/
void SYS_ResetModule(uint32_t u32ModuleIndex)
{
uint32_t u32TmpVal = 0UL, u32TmpAddr = 0UL;
/* Generate reset signal to the corresponding module */
u32TmpVal = (1UL << (u32ModuleIndex & 0x00ffffffUL));
u32TmpAddr = (uint32_t)&SYS->IPRST0 + ((u32ModuleIndex >> 24UL));
*(uint32_t *)u32TmpAddr |= u32TmpVal;
/* Release corresponding module from reset state */
u32TmpVal = ~(1UL << (u32ModuleIndex & 0x00ffffffUL));
*(uint32_t *)u32TmpAddr &= u32TmpVal;
}
/**
* @brief Enable and configure Brown-out detector function
* @param[in] i32Mode is reset or interrupt mode. Including :
* - \ref SYS_BODCTL_BOD_RST_EN
* - \ref SYS_BODCTL_BOD_INTERRUPT_EN
* @param[in] u32BODLevel is Brown-out voltage level. Including :
* - \ref SYS_BODCTL_BODVL_1_6V
* - \ref SYS_BODCTL_BODVL_1_8V
* - \ref SYS_BODCTL_BODVL_2_0V
* - \ref SYS_BODCTL_BODVL_2_2V
* - \ref SYS_BODCTL_BODVL_2_4V
* - \ref SYS_BODCTL_BODVL_2_6V
* - \ref SYS_BODCTL_BODVL_2_8V
* - \ref SYS_BODCTL_BODVL_3_0V
* @return None
* @details This function configure Brown-out detector reset or interrupt mode, enable Brown-out function and set Brown-out voltage level.
* The register write-protection function should be disabled before using this function.
*/
void SYS_EnableBOD(int32_t i32Mode, uint32_t u32BODLevel)
{
/* Enable Brown-out Detector function */
/* Enable Brown-out interrupt or reset function */
/* Select Brown-out Detector threshold voltage */
while(SYS->BODCTL & SYS_BODCTL_WRBUSY_Msk);
SYS->BODCTL = (SYS->BODCTL & ~(SYS_BODCTL_BODRSTEN_Msk | SYS_BODCTL_BODVL_Msk)) |
((uint32_t)i32Mode) | (u32BODLevel) | (SYS_BODCTL_BODEN_Msk);
}
/**
* @brief Disable Brown-out detector function
* @param None
* @return None
* @details This function disable Brown-out detector function.
* The register write-protection function should be disabled before using this function.
*/
void SYS_DisableBOD(void)
{
while(SYS->BODCTL & SYS_BODCTL_WRBUSY_Msk);
SYS->BODCTL &= ~SYS_BODCTL_BODEN_Msk;
}
/**
* @brief Set Power Level
* @param[in] u32PowerLevel is power level setting. Including :
* - \ref SYS_PLCTL_PLSEL_PL0 : Supports system clock up to 96MHz.
* - \ref SYS_PLCTL_PLSEL_PL1 : Supports system clock up to 84MHz.
* - \ref SYS_PLCTL_PLSEL_PL2 : Supports system clock up to 48MHz.
* - \ref SYS_PLCTL_PLSEL_PL3 : Supports system clock up to 4MHz.
* @return None
* @details This function select power level.
* The register write-protection function should be disabled before using this function.
*/
void SYS_SetPowerLevel(uint32_t u32PowerLevel)
{
/* Set power voltage level */
while(SYS->PLCTL & SYS_PLCTL_WRBUSY_Msk);
SYS->PLCTL = (SYS->PLCTL & (~SYS_PLCTL_PLSEL_Msk)) | (u32PowerLevel);
while(SYS->PLSTS & SYS_PLSTS_PLCBUSY_Msk);
}
/**
* @brief Set Main Voltage Regulator Type
* @param[in] u32PowerRegulator is main voltage regulator type. Including :
* - \ref SYS_PLCTL_MVRS_LDO
* - \ref SYS_PLCTL_MVRS_DCDC
* @retval 0 main voltage regulator type setting is not finished
* @retval 1 main voltage regulator type setting is finished
* @details This function set main voltage regulator type.
* The main voltage regulator type setting to DCDC cannot finished if the inductor is not detected.
* The register write-protection function should be disabled before using this function.
*/
uint32_t SYS_SetPowerRegulator(uint32_t u32PowerRegulator)
{
int32_t i32TimeOutCnt = 400;
uint32_t u32Ret = 1U;
uint32_t u32PowerRegStatus;
/* Get main voltage regulator type status */
u32PowerRegStatus = SYS->PLSTS & SYS_PLSTS_CURMVR_Msk;
/* Set main voltage regulator type */
if((u32PowerRegulator == SYS_PLCTL_MVRS_DCDC) && (u32PowerRegStatus == SYS_PLSTS_CURMVR_LDO))
{
/* Set main voltage regulator type to DCDC if status is LDO */
while(SYS->PLCTL & SYS_PLCTL_WRBUSY_Msk);
SYS->PLCTL |= SYS_PLCTL_MVRS_Msk;
/* Wait inductor detection and main voltage regulator type change ready */
while((SYS->PLSTS & SYS_PLSTS_CURMVR_Msk) != SYS_PLSTS_CURMVR_DCDC)
{
if(i32TimeOutCnt-- <= 0)
{
u32Ret = 0U; /* Main voltage regulator type change time-out */
break;
}
}
}
else if(u32PowerRegulator == SYS_PLCTL_MVRS_LDO)
{
/* Set main voltage regulator type to LDO if status is DCDC */
while(SYS->PLCTL & SYS_PLCTL_WRBUSY_Msk);
SYS->PLCTL &= (~SYS_PLCTL_MVRS_Msk);
/* Wait main voltage regulator type change ready */
while((SYS->PLSTS & SYS_PLSTS_CURMVR_Msk) != SYS_PLSTS_CURMVR_LDO)
{
if(i32TimeOutCnt-- <= 0)
{
u32Ret = 0U; /* Main voltage regulator type change time-out */
break;
}
}
}
/* Clear main voltage regulator type change error flag */
if(SYS->PLSTS & SYS_PLSTS_MVRCERR_Msk)
{
SYS->PLSTS = SYS_PLSTS_MVRCERR_Msk;
u32Ret = 0U;
}
return u32Ret;
}
/**
* @brief Set System SRAM Power Mode
* @param[in] u32SRAMSel is SRAM region selection. Including :
* - \ref SYS_SRAMPC0_SRAM0PM0_Msk : 0x2000_0000 - 0x2000_0FFF
* - \ref SYS_SRAMPC0_SRAM0PM1_Msk : 0x2000_1000 - 0x2000_1FFF
* - \ref SYS_SRAMPC0_SRAM0PM2_Msk : 0x2000_2000 - 0x2000_3FFF
* - \ref SYS_SRAMPC0_SRAM0PM3_Msk : 0x2000_4000 - 0x2000_5FFF
* - \ref SYS_SRAMPC0_SRAM0PM4_Msk : 0x2000_6000 - 0x2000_7FFF
* - \ref SYS_SRAMPC0_SRAM1PM0_Msk : 0x2000_8000 - 0x2000_BFFF
* - \ref SYS_SRAMPC0_SRAM1PM1_Msk : 0x2000_C000 - 0x2000_FFFF
* - \ref SYS_SRAMPC0_SRAM1PM2_Msk : 0x2001_0000 - 0x2001_3FFF
* - \ref SYS_SRAMPC0_SRAM1PM3_Msk : 0x2001_4000 - 0x2001_7FFF
* - \ref SYS_SRAMPC0_SRAM1PM4_Msk : 0x2001_8000 - 0x2001_BFFF
* - \ref SYS_SRAMPC0_SRAM1PM5_Msk : 0x2001_C000 - 0x2001_FFFF
* - \ref SYS_SRAMPC0_SRAM1PM6_Msk : 0x2002_0000 - 0x2002_3FFF
* - \ref SYS_SRAMPC0_SRAM1PM7_Msk : 0x2002_4000 - 0x2002_7FFF
* - \ref SYS_SRAMPC0_SRAM2PM0_Msk : 0x2002_8000 - 0x2002_BFFF
* - \ref SYS_SRAMPC0_SRAM2PM1_Msk : 0x2002_C000 - 0x2002_FFFF
* - \ref SYS_SRAMPC1_SRAM2PM2_Msk : 0x2003_0000 - 0x2003_3FFF
* - \ref SYS_SRAMPC1_SRAM2PM3_Msk : 0x2003_4000 - 0x2003_7FFF
* - \ref SYS_SRAMPC1_SRAM2PM4_Msk : 0x2003_8000 - 0x2003_BFFF
* - \ref SYS_SRAMPC1_SRAM2PM5_Msk : 0x2003_C000 - 0x2003_FFFF
* @param[in] u32PowerMode is SRAM power mode. Including :
* - \ref SYS_SRAMPC0_SRAM_NORMAL
* - \ref SYS_SRAMPC0_SRAM_RETENTION
* - \ref SYS_SRAMPC0_SRAM_POWER_SHUT_DOWN
* - \ref SYS_SRAMPC1_SRAM_NORMAL
* - \ref SYS_SRAMPC1_SRAM_RETENTION
* - \ref SYS_SRAMPC1_SRAM_POWER_SHUT_DOWN
* @return None
* @details This function set system SRAM power mode.
* The register write-protection function should be disabled before using this function.
*/
void SYS_SetSSRAMPowerMode(uint32_t u32SRAMSel, uint32_t u32PowerMode)
{
uint32_t u32SRAMSelPos = 0UL;
/* Get system SRAM power mode setting position */
while(u32SRAMSelPos < 30UL)
{
if(u32SRAMSel & (1 << u32SRAMSelPos))
{
break;
}
else
{
u32SRAMSelPos++;
}
}
/* Set system SRAM power mode setting */
if(u32PowerMode & BIT31)
{
while(SYS->SRAMPC1 & SYS_SRAMPC1_PCBUSY_Msk);
SYS->SRAMPC1 = (SYS->SRAMPC1 & (~u32SRAMSel)) | (u32PowerMode << u32SRAMSelPos);
}
else
{
while(SYS->SRAMPC0 & SYS_SRAMPC0_PCBUSY_Msk);
SYS->SRAMPC0 = (SYS->SRAMPC0 & (~u32SRAMSel)) | (u32PowerMode << u32SRAMSelPos);
}
}
/**
* @brief Set Peripheral SRAM Power Mode
* @param[in] u32SRAMSel is SRAM region selection. Including :
* - \ref SYS_SRAMPC1_CAN_Msk
* - \ref SYS_SRAMPC1_USBD_Msk
* - \ref SYS_SRAMPC1_PDMA0_Msk
* - \ref SYS_SRAMPC1_PDMA1_Msk
* - \ref SYS_SRAMPC1_FMCCACHE_Msk
* - \ref SYS_SRAMPC1_RSA_Msk
* - \ref SYS_SRAMPC1_KS_Msk
* @param[in] u32PowerMode is SRAM power mode. Including :
* - \ref SYS_SRAMPC1_SRAM_NORMAL
* - \ref SYS_SRAMPC1_SRAM_RETENTION
* - \ref SYS_SRAMPC1_SRAM_POWER_SHUT_DOWN
* @return None
* @details This function set peripheral SRAM power mode.
* The register write-protection function should be disabled before using this function.
*/
void SYS_SetPSRAMPowerMode(uint32_t u32SRAMSel, uint32_t u32PowerMode)
{
uint32_t u32SRAMSelPos = 16UL;
/* Get peripheral SRAM power mode setting position */
while(u32SRAMSelPos < 30UL)
{
if(u32SRAMSel & (1 << u32SRAMSelPos))
{
break;
}
else
{
u32SRAMSelPos++;
}
}
/* Set peripheral SRAM power mode setting */
while(SYS->SRAMPC1 & SYS_SRAMPC1_PCBUSY_Msk);
SYS->SRAMPC1 = (SYS->SRAMPC1 & (~u32SRAMSel)) | (u32PowerMode << u32SRAMSelPos);
}
/**
* @brief Set Reference Voltage
* @param[in] u32VRefCTL is reference voltage setting. Including :
* - \ref SYS_VREFCTL_VREF_PIN
* - \ref SYS_VREFCTL_VREF_1_6V
* - \ref SYS_VREFCTL_VREF_2_0V
* - \ref SYS_VREFCTL_VREF_2_5V
* - \ref SYS_VREFCTL_VREF_3_0V
* - \ref SYS_VREFCTL_VREF_AVDD
* @return None
* @details This function select reference voltage.
* The register write-protection function should be disabled before using this function.
*/
void SYS_SetVRef(uint32_t u32VRefCTL)
{
/* Set reference voltage */
SYS->VREFCTL = (SYS->VREFCTL & (~SYS_VREFCTL_VREFCTL_Msk)) | (u32VRefCTL);
}
/**@}*/ /* end of group SYS_EXPORTED_FUNCTIONS */
/**@}*/ /* end of group SYS_Driver */
/**@}*/ /* end of group Standard_Driver */
|