system_ac780x.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586
  1. /* Copyright Statement:
  2. *
  3. * This software/firmware and related documentation ("AutoChips Software") are
  4. * protected under relevant copyright laws. The information contained herein is
  5. * confidential and proprietary to AutoChips Inc. and/or its licensors. Without
  6. * the prior written permission of AutoChips inc. and/or its licensors, any
  7. * reproduction, modification, use or disclosure of AutoChips Software, and
  8. * information contained herein, in whole or in part, shall be strictly
  9. * prohibited.
  10. *
  11. * AutoChips Inc. (C) 2020. All rights reserved.
  12. *
  13. * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
  14. * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("AUTOCHIPS SOFTWARE")
  15. * RECEIVED FROM AUTOCHIPS AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
  16. * ON AN "AS-IS" BASIS ONLY. AUTOCHIPS EXPRESSLY DISCLAIMS ANY AND ALL
  17. * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
  18. * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
  19. * NONINFRINGEMENT. NEITHER DOES AUTOCHIPS PROVIDE ANY WARRANTY WHATSOEVER WITH
  20. * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
  21. * INCORPORATED IN, OR SUPPLIED WITH THE AUTOCHIPS SOFTWARE, AND RECEIVER AGREES
  22. * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
  23. * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
  24. * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN AUTOCHIPS
  25. * SOFTWARE. AUTOCHIPS SHALL ALSO NOT BE RESPONSIBLE FOR ANY AUTOCHIPS SOFTWARE
  26. * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
  27. * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND AUTOCHIPS'S
  28. * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE AUTOCHIPS SOFTWARE
  29. * RELEASED HEREUNDER WILL BE, AT AUTOCHIPS'S OPTION, TO REVISE OR REPLACE THE
  30. * AUTOCHIPS SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
  31. * CHARGE PAID BY RECEIVER TO AUTOCHIPS FOR SUCH AUTOCHIPS SOFTWARE AT ISSUE.
  32. */
  33. /*!
  34. * @file system_ac780x.c
  35. *
  36. * @brief This file provides system clock config integration functions.
  37. *
  38. */
  39. /* =========================================== Includes =========================================== */
  40. #include "ac780x.h"
  41. /* ============================================ Define ============================================ */
  42. #define XTAL ( USE_XTAL ) /* Oscillator frequency */
  43. #define SYSTEM_CLOCK ( SYSCLK_FREQ ) /* system clock frequency */
  44. #define MAX_SYSTICK_COUNT (SysTick_LOAD_RELOAD_Msk + 1) /* systemTick max count value */
  45. /* for eFlash clock config */
  46. #define SYS_EFLSH_UNLOCK_KEY1 0xac7811
  47. #define SYS_EFLSH_UNLOCK_KEY2 0x01234567
  48. #define Eflash_KEY_REG 0x40002000
  49. #define EFLASH_INFO_REG 0x40002004
  50. #define EFLASH_CTRL1_REG 0x40002014
  51. #define EFLASH_CTRL2_REG 0x40002040
  52. #define SYSTEM_CLOCK_SRC_HSI 0UL
  53. #define SYSTEM_CLOCK_SRC_PLL 1UL
  54. #define SYSTEM_CLOCK_SRC_HSE 2UL
  55. /* =========================================== Typedef ============================================ */
  56. /* ========================================== Variables =========================================== */
  57. /* systemTick us delay factor */
  58. static uint32_t s_facus = 0;
  59. /* systemTick ms delay factor */
  60. static uint32_t s_facms = 0;
  61. /* system clock frequency save */
  62. uint32_t SystemCoreClock = SYSTEM_CLOCK;
  63. /* apbclk frequency save */
  64. uint32_t g_periphAPBClock = SYSTEM_CLOCK / 2;
  65. /* define system pll prediv value */
  66. static __IOM uint8_t s_pllPREDIV[] = {1, 2, 4};
  67. /* ==================================== Functions declaration ===================================== */
  68. /* Externals declaration */
  69. #if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U)
  70. extern uint32_t __Vectors;
  71. #endif
  72. /* ====================================== Functions define ======================================== */
  73. /*!
  74. * @brief Init Delay count factor, 1s = TICKS * (1/f) s;
  75. *
  76. * @param[in] none
  77. * @return none
  78. */
  79. void InitDelay(void)
  80. {
  81. s_facus = __SYSTEM_CLOCK / 1000000;
  82. s_facms = s_facus * 1000;
  83. }
  84. /*!
  85. * @brief Set HSE bypass mode. if xosc enable fail then change system clock to HSI(8m).
  86. *
  87. * @param[in] none
  88. * @return none
  89. */
  90. void SetHSEBYPClock(void)
  91. {
  92. __IO PLL_ReferenceType pllReference = PLL_REF_INTERAL_OSC;
  93. /* enable xosc bypass mode */
  94. SPM_EnableXOSCBypassMode(ENABLE);
  95. CKGEN_SetSysclkDiv(SYSCLK_DIV);
  96. /* check if xosc enable success? */
  97. if (SPM_EnableXOSC(ENABLE) == SUCCESS)
  98. {
  99. CKGEN_SetPLLReference(PLL_REF_EXTERNAL_OSC);
  100. pllReference = PLL_REF_EXTERNAL_OSC;
  101. }
  102. else
  103. {
  104. /* xosc enable fail, use hsi(8m) as pll clock(default) */
  105. CKGEN_SetPLLReference(PLL_REF_INTERAL_OSC);
  106. pllReference = PLL_REF_INTERAL_OSC;
  107. }
  108. /* check if pll enable success? */
  109. if (SPM_EnablePLL(ENABLE) == SUCCESS)
  110. {
  111. CKGEN_SetPllPrevDiv(PLL_PREDIV);
  112. CKGEN_SetPllPostDiv(PLL_POSDIV);
  113. CKGEN_SetPllFeedbackDiv(PLL_FBKDIV);
  114. CKGEN_SetSysclkSrc(SYSCLK_SRC_PLL_OUTPUT);
  115. }
  116. else /* pll enable fail */
  117. {
  118. if (pllReference == PLL_REF_EXTERNAL_OSC)
  119. {
  120. CKGEN_SetSysclkSrc(SYSCLK_SRC_EXTERNAL_OSC); /* set external osc as sysclk src */
  121. }
  122. else
  123. {
  124. CKGEN_SetSysclkSrc(SYSCLK_SRC_INTERNAL_OSC); /* set internal osc as sysclk src */
  125. }
  126. }
  127. }
  128. /*!
  129. * @brief Set XOSC Clock. if xosc enable fail, change system clock to HSI(8m).
  130. *
  131. * @param[in] none
  132. * @return none
  133. */
  134. void SetXOSCClock(void)
  135. {
  136. CKGEN_SetSysclkDiv(SYSCLK_DIV);
  137. /* check if xosc enable success? */
  138. if (SPM_EnableXOSC(ENABLE) == SUCCESS)
  139. {
  140. /* xosc enable success, use external osc as system clock */
  141. CKGEN_SetSysclkSrc(SYSCLK_SRC_EXTERNAL_OSC);
  142. }
  143. else
  144. {
  145. /* xosc enable fail, use hsi(8m) as system clock(default) */
  146. CKGEN_SetSysclkSrc(SYSCLK_SRC_INTERNAL_OSC);
  147. }
  148. }
  149. /*!
  150. * @brief Use HSE mode, set the system clock.
  151. * pll reference clock default use xosc,if xosc enable fail,change to hsi(8m).
  152. * system clock source default use pll output. if pll enable fail, then
  153. * stop change system clock source to osc(HSI or HSE).
  154. *
  155. * @param[in] none
  156. * @return none
  157. */
  158. void SetHSEClock(void)
  159. {
  160. __IO PLL_ReferenceType pllReference = PLL_REF_INTERAL_OSC;
  161. /* check if xosc enable success? */
  162. if (SPM_EnableXOSC(ENABLE) == SUCCESS)
  163. {
  164. CKGEN_SetPLLReference(PLL_REF_EXTERNAL_OSC);
  165. pllReference = PLL_REF_EXTERNAL_OSC;
  166. }
  167. else /* if xosc enable fail,change pll reference clock to HSI 8M */
  168. {
  169. CKGEN_SetPLLReference(PLL_REF_INTERAL_OSC);
  170. pllReference = PLL_REF_INTERAL_OSC;
  171. }
  172. /* set system clock divider */
  173. CKGEN_SetSysclkDiv(SYSCLK_DIV);
  174. /* check if pll enable success? */
  175. if (SPM_EnablePLL(ENABLE) == SUCCESS)
  176. {
  177. CKGEN_SetPllPrevDiv(PLL_PREDIV);
  178. CKGEN_SetPllPostDiv(PLL_POSDIV);
  179. CKGEN_SetPllFeedbackDiv(PLL_FBKDIV);
  180. CKGEN_SetSysclkSrc(SYSCLK_SRC_PLL_OUTPUT);
  181. }
  182. else /* pll enable fail */
  183. {
  184. if (pllReference == PLL_REF_EXTERNAL_OSC)
  185. {
  186. CKGEN_SetSysclkSrc(SYSCLK_SRC_EXTERNAL_OSC); /* set external osc as sysclk src */
  187. }
  188. else
  189. {
  190. CKGEN_SetSysclkSrc(SYSCLK_SRC_INTERNAL_OSC); /* set internal osc as sysclk src */
  191. }
  192. }
  193. }
  194. /*!
  195. * @brief Use HSI Mode.Default set pll output as system clock;if pll enable fail
  196. * ,change system clock to HSI(8m).
  197. *
  198. * @param[in] none
  199. * @return none
  200. */
  201. void SetHSIClock(void)
  202. {
  203. CKGEN_SetPLLReference(PLL_REF_INTERAL_OSC);
  204. CKGEN_SetPllPrevDiv(PLL_PREDIV);
  205. CKGEN_SetPllPostDiv(PLL_POSDIV);
  206. CKGEN_SetPllFeedbackDiv(PLL_FBKDIV);
  207. CKGEN_SetSysclkDiv(SYSCLK_DIV);
  208. /* check if pll enable success? */
  209. if (SPM_EnablePLL(ENABLE) == SUCCESS)
  210. {
  211. /* pll enable success,use pll output as system clock src */
  212. CKGEN_SetSysclkSrc(SYSCLK_SRC_PLL_OUTPUT);
  213. }
  214. else
  215. {
  216. /* pll enable fail,use hsi(8m) as system clock src */
  217. CKGEN_SetSysclkSrc(SYSCLK_SRC_INTERNAL_OSC);
  218. }
  219. }
  220. /*!
  221. * @brief set system clock
  222. *
  223. * @param[in] none
  224. * @return none
  225. */
  226. void SetSysClock(void)
  227. {
  228. #if AC780X_CLOCK_SRC == IC_CLOCK_SRC_XOSC
  229. SetXOSCClock();
  230. #elif AC780X_CLOCK_SRC == IC_CLOCK_SRC_HSI
  231. SetHSIClock();
  232. #elif AC780X_CLOCK_SRC == IC_CLOCK_SRC_HSE
  233. SetHSEClock();
  234. #elif AC780X_CLOCK_SRC == IC_CLOCK_SRC_XOSC_BYPASS
  235. SetHSEBYPClock();
  236. #else
  237. SetHSIClock();
  238. #endif
  239. }
  240. /**
  241. * SetEflashClock
  242. *
  243. * @param[in] none
  244. * @return none
  245. *
  246. * @brief Set eflash clock.
  247. *
  248. **/
  249. void SetEflashClock(void)
  250. {
  251. uint32_t eflashCKDIV = 0;
  252. uint32_t ctrl1 = 0x0;
  253. int32_t timeout = 500;
  254. do
  255. {
  256. WRITE_MEM32(Eflash_KEY_REG, SYS_EFLSH_UNLOCK_KEY1);
  257. WRITE_MEM32(Eflash_KEY_REG, SYS_EFLSH_UNLOCK_KEY2);
  258. timeout--;
  259. } while ((READ_MEM32(EFLASH_INFO_REG) & ((uint32_t)1 << 31)) && (0 < timeout));
  260. eflashCKDIV = (SYSCLK_FREQ / 1000000 + 1) & 0x7F;
  261. ctrl1 = 0x2000 | eflashCKDIV;
  262. WRITE_MEM32(EFLASH_CTRL1_REG, ctrl1);
  263. SET_BIT32((*(uint32_t*)EFLASH_CTRL1_REG), (uint32_t)1 << 8);
  264. SET_BIT32((*(uint32_t*)EFLASH_INFO_REG), (uint32_t)1 << 31);
  265. }
  266. /*!
  267. * @brief delay until the syctick count tick to 0
  268. *
  269. * @param[in] tick : systick count value
  270. * @return none
  271. */
  272. static void SysTickDelay(uint32_t tick)
  273. {
  274. __IO uint32_t tickFlag = 0;
  275. SysTick->LOAD = tick - 1;
  276. SysTick->VAL = 0x00;
  277. SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk;
  278. do
  279. {
  280. tickFlag = SysTick->CTRL;
  281. } while((tickFlag & SysTick_CTRL_ENABLE_Msk) &&
  282. (!(tickFlag & SysTick_CTRL_COUNTFLAG_Msk)));
  283. SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
  284. SysTick->VAL = 0X00;
  285. }
  286. /*!
  287. * @brief Repeatlly delay the ticks for the given times
  288. *
  289. * @param[in] param : times, the times of delay the tick
  290. * @param[in] param : tick, each tick to delay
  291. * @return none
  292. */
  293. static void SysTickRepeatDelay(uint32_t times, uint32_t tick)
  294. {
  295. uint32_t i = 0;
  296. for (i = 0; i < times; i++)
  297. {
  298. SysTickDelay(tick);
  299. }
  300. }
  301. /*!
  302. * @brief delay us
  303. *
  304. * @param[in] param : us, us for delay
  305. * @return none
  306. */
  307. void udelay(uint32_t us)
  308. {
  309. uint32_t tick = us * s_facus;
  310. SysTickRepeatDelay(tick / MAX_SYSTICK_COUNT, MAX_SYSTICK_COUNT);
  311. SysTickDelay(tick % MAX_SYSTICK_COUNT);
  312. }
  313. /*!
  314. * @brief delay ms
  315. *
  316. * @param[in] param : ms, ms for delay
  317. * @return none
  318. */
  319. void mdelay(uint32_t ms)
  320. {
  321. uint32_t tick = ms * s_facms;
  322. SysTickRepeatDelay(tick / MAX_SYSTICK_COUNT, MAX_SYSTICK_COUNT);
  323. SysTickDelay(tick % MAX_SYSTICK_COUNT);
  324. }
  325. /*!
  326. * @brief get system clock frequence
  327. *
  328. * @param[in] none
  329. * @return none
  330. */
  331. void SystemCoreClockUpdate(void)
  332. {
  333. __IO uint8_t clkSrc = 0, postDiv = 0, feedbackDiv = 0, sysclkDiv = 0;
  334. __IO uint8_t pllRef = 0, preDiv = 0, apbClkDiv = 0;
  335. __IO uint32_t vcoClk = 0;
  336. clkSrc = CKGEN->CTRL & CKGEN_CTRL_SYSCLK_SEL_Msk;
  337. apbClkDiv = ((CKGEN->CTRL & CKGEN_CTRL_APBCLK_DIV_Msk) >> CKGEN_CTRL_APBCLK_DIV_Pos) + 1;
  338. switch (clkSrc)
  339. {
  340. case SYSTEM_CLOCK_SRC_HSI:
  341. SystemCoreClock = HSI_FREQ; /* HSI RC */
  342. break;
  343. case SYSTEM_CLOCK_SRC_PLL:
  344. /* PLL Output */
  345. pllRef = (CKGEN->CTRL & CKGEN_CTRL_PLL_REF_SEL_Msk) >> CKGEN_CTRL_PLL_REF_SEL_Pos;
  346. sysclkDiv = ((CKGEN->CTRL & CKGEN_CTRL_SYSCLK_DIV_Msk) >> CKGEN_CTRL_SYSCLK_DIV_Pos) + 1;
  347. preDiv = s_pllPREDIV[(CKGEN->SYSPLL1_CFG0 & CKGEN_SYSPLL1_CFG0_SYSPLL1_PREDIV_Msk) >> CKGEN_SYSPLL1_CFG0_SYSPLL1_PREDIV_Pos];
  348. postDiv = ((CKGEN->SYSPLL1_CFG0 & CKGEN_SYSPLL1_CFG0_SYSPLL1_POSDIV_Msk) >> CKGEN_SYSPLL1_CFG0_SYSPLL1_POSDIV_Pos) * 2;
  349. feedbackDiv = (CKGEN->SYSPLL1_CFG0 & CKGEN_SYSPLL1_CFG0_SYSPLL1_FBKDIV_Msk) >> CKGEN_SYSPLL1_CFG0_SYSPLL1_FBKDIV_Pos;
  350. if (pllRef)
  351. {
  352. /* ext xosc clock */
  353. SystemCoreClock = USE_XTAL;
  354. }
  355. else
  356. {
  357. /* internal RC */
  358. SystemCoreClock = HSI_FREQ;
  359. }
  360. vcoClk = (SystemCoreClock * feedbackDiv) / preDiv; /* pll vco clock */
  361. SystemCoreClock = vcoClk / (postDiv * sysclkDiv); /* system clock freq */
  362. break;
  363. case SYSTEM_CLOCK_SRC_HSE:
  364. SystemCoreClock = USE_XTAL; /* HSE XTAL */
  365. break;
  366. default:
  367. break;
  368. }
  369. g_periphAPBClock = SystemCoreClock / apbClkDiv; /* apb clock freq */
  370. }
  371. /*!
  372. * @brief Setup the microcontroller system. Initialize the System.
  373. *
  374. * @param[in] none
  375. * @return none
  376. */
  377. void SystemInit (void)
  378. {
  379. #if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U)
  380. SCB->VTOR = (uint32_t) &__Vectors;
  381. #endif
  382. SystemCoreClock = SYSTEM_CLOCK;
  383. SetEflashClock();
  384. SetSysClock();
  385. CKGEN_SetAPBClockDivider(APBCLK_DIV);
  386. //SPM_EnableLVD(DISABLE); //disable LVD if need
  387. }
  388. /*!
  389. * @brief change the current menu and display
  390. *
  391. * @param[in]
  392. * @return return the CPUID
  393. */
  394. uint32_t GetCPUID(void)
  395. {
  396. return SCB->CPUID;
  397. }
  398. /*!
  399. * @brief enter the Standby mode
  400. *
  401. * @param[in] none
  402. * @return none
  403. */
  404. void SysStandby(void)
  405. {
  406. SPM_SetLowPowerMode(LOW_POWER_MODE_STANDBY);
  407. /* Set the SLEEPDEEP bit to enable deep sleep mode (STOP) */
  408. SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
  409. #if defined ( __ICCARM__ )
  410. asm("WFI");
  411. #elif defined ( __GNUC__)
  412. asm("WFI");
  413. #elif defined (__CC_ARM)
  414. // If using KEIL's uVision, use the CMSIS intrinsic
  415. __wfi();
  416. #endif
  417. }
  418. /*!
  419. * @brief enter the Stop mode
  420. *
  421. * @param[in] none
  422. * @return none
  423. */
  424. void SysStop(void)
  425. {
  426. SPM_SetLowPowerMode(LOW_POWER_MODE_STOP);
  427. /* Set the SLEEPDEEP bit to enable deep sleep mode (STOP) */
  428. SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
  429. #if defined ( __ICCARM__ )
  430. asm("WFI");
  431. #elif defined ( __GNUC__)
  432. asm("WFI");
  433. #elif defined (__CC_ARM)
  434. // If using KEIL's uVision, use the CMSIS intrinsic
  435. __wfi();
  436. #endif
  437. // Add Debug Interface to enable printf after wakeup
  438. }
  439. /*!
  440. * @brief enter the Sleep mode
  441. *
  442. * @param[in] none
  443. * @return none
  444. */
  445. void SysSleep(void)
  446. {
  447. /* Clear the SLEEPDEEP bit to make sure we go into WAIT (sleep) mode instead
  448. * of deep sleep.
  449. */
  450. SCB->SCR &= ~SCB_SCR_SLEEPDEEP_Msk;
  451. #if defined ( __ICCARM__ )
  452. asm("WFI");
  453. #elif defined ( __GNUC__)
  454. asm("WFI");
  455. #elif defined (__CC_ARM)
  456. // If using KEIL's uVision, use the CMSIS intrinsic
  457. __wfi();
  458. #endif
  459. }
  460. /*!
  461. * @brief get uuid from device
  462. *
  463. * @param[in] uuidBuffer: uuid buffer
  464. * @return none
  465. */
  466. void GetUUID(uint32_t *uuidBuffer)
  467. {
  468. #define UUID_BASE_ADDRESS 0x4000202C
  469. uint8_t i = 0;
  470. if(0 != uuidBuffer)
  471. {
  472. for (i = 0; i < 4; i++)
  473. {
  474. uuidBuffer[i] = (*(__IO uint32_t *)(UUID_BASE_ADDRESS + i * 4));
  475. }
  476. }
  477. }
  478. /*!
  479. * @brief get cpu type from device
  480. *
  481. * @param[in] none
  482. * @return cpu type: AC7801(0xFFAC7801)/AC7811(0xFFAC7811)
  483. */
  484. uint32_t GetCpuType(void)
  485. {
  486. #define CPU_TYPE_BASE_ADDRESS 0x40002028
  487. return (*(__IO uint32_t *)(CPU_TYPE_BASE_ADDRESS));
  488. }
  489. /*!
  490. * @brief get reset status
  491. *
  492. * @param[in] none
  493. * @return reset status
  494. * - bit0: POR_RESET_STATUS
  495. * - bit1: LVD_RESET_STATUS
  496. * - bit2: EXT_RESET_STATUS
  497. * - bit4: WDT_RESET_STATUS
  498. * - bit5: WDT_32K_RESET_STATUS
  499. * - bit6: CPU_SYSRESET_STATUS
  500. * - bit7: CPU_LOCKUP_RST_STATUS
  501. * - bit8: PLL_UNLOCK_RST_STATUS
  502. * - bit9: XOSC_LOSS_STATUS
  503. * - bit16: CLEAR_ALL_RESET_STATUS
  504. */
  505. uint32_t GetResetStatus(void)
  506. {
  507. return (CKGEN->RESET_STATUS);
  508. }
  509. /*!
  510. * @brief clear all reset status
  511. *
  512. * @param[in] none
  513. * @return none
  514. */
  515. void ClearAllResetStatus(void)
  516. {
  517. CKGEN->RESET_STATUS |= (1 << 16);
  518. }
  519. /* ============================================= EOF ============================================== */