You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

304 lines
8.9 KiB

4 years ago
  1. /*********************************************************
  2. *Copyright (C), 2015, Shanghai Eastsoft Microelectronics Co., Ltd.
  3. *: lib_scu.c
  4. * : AE Team
  5. * : V1.01
  6. * : 2021/06/09
  7. * : SCU模块库函数
  8. * : 使
  9. **********************************************************/
  10. #include "lib_scu.h"
  11. /***************************************************************
  12. SCU_NMISelect
  13. NMI不可屏蔽中断
  14. ***************************************************************/
  15. void SCU_NMISelect(SCU_TYPE_NMICS NMI_Type)
  16. {
  17. SCU_RegUnLock();
  18. SCU->NMICON.NMICS = NMI_Type;
  19. SCU_RegLock() ;
  20. return;
  21. }
  22. /***************************************************************
  23. SCU_GetPWRCFlagStatus
  24. PWRC复位状态寄存器标志位状态
  25. PWRC寄存器标志位
  26. RESET/SET
  27. ***************************************************************/
  28. FlagStatus SCU_GetPWRCFlagStatus(SCU_TYPE_PWRC PWRC_Flag)
  29. {
  30. FlagStatus bitstatus = RESET;
  31. SCU_RegUnLock();
  32. if ((SCU->PWRC.Word & (uint32_t)PWRC_Flag) != (uint32_t)RESET)
  33. bitstatus = SET;
  34. SCU_RegLock() ;
  35. return bitstatus;
  36. }
  37. /***************************************************************
  38. SCU_ClearPWRCFlagBit
  39. PWRC复位状态寄存器标志位
  40. PWRC寄存器标志位
  41. ***************************************************************/
  42. void SCU_ClearPWRCFlagBit(SCU_TYPE_PWRC PWRC_Flag)
  43. {
  44. SCU_RegUnLock() ;
  45. SCU->PWRC.Word &= ~((uint32_t)PWRC_Flag);
  46. SCU_RegLock() ;
  47. return;
  48. }
  49. /***************************************************************
  50. SCU_GetLVDFlagStatus
  51. LVDD寄存器标志位状态
  52. LVD寄存器标志位
  53. RESET/SET
  54. ***************************************************************/
  55. FlagStatus SCU_GetLVDFlagStatus(SCU_TYPE_LVDCON LVD_Flag)
  56. {
  57. FlagStatus bitstatus = RESET;
  58. SCU_RegLock() ;
  59. if ((SCU->LVDCON.Word & (uint32_t)LVD_Flag) != (uint32_t)RESET)
  60. bitstatus = SET;
  61. return bitstatus;
  62. }
  63. /***************************************************************
  64. SCU_SysClkSelect
  65. ***************************************************************/
  66. void SCU_SysClkSelect(SCU_TYPE_SYSCLK Sysclk)
  67. {
  68. SCU_RegUnLock() ;
  69. SCU->SCLKEN0.CLK_SEL = Sysclk;
  70. SCU_RegLock() ;
  71. return;
  72. }
  73. /***************************************************************
  74. SCU_GetSysClk
  75. ***************************************************************/
  76. SCU_TYPE_SYSCLK SCU_GetSysClk(void)
  77. {
  78. return (SCU_TYPE_SYSCLK)(SCU->SCLKEN0.CLK_SEL);
  79. }
  80. /***************************************************************
  81. SCU_OpenXTAL
  82. :
  83. ***************************************************************/
  84. void SCU_OpenXTAL(void)
  85. {
  86. SCU_RegUnLock();
  87. SCU->SCLKEN1.XTAL_EN = 1;
  88. while (SCU->SCLKEN1.XTAL_RDY == 0); /* 等待外部时钟稳定 */
  89. SCU_RegLock() ;
  90. }
  91. /***************************************************************
  92. DeviceClockAllEnable
  93. ***************************************************************/
  94. void DeviceClockAllEnable(void)
  95. {
  96. uint32_t prot_tmp;
  97. prot_tmp = SCU->PROT.PROT;
  98. if (prot_tmp != 0) /* 写保护了 */
  99. SCU_RegUnLock(); /* 解锁 */
  100. SCU->PCLKEN.Word = 0xFFFFFFFF; /* 打开所有外设时钟 */
  101. if (prot_tmp != 0) /* 写保护了 */
  102. SCU_RegLock(); /* 打开写保护 */
  103. return;
  104. }
  105. /***************************************************************
  106. DeviceClockAllDisable
  107. ***************************************************************/
  108. void DeviceClockAllDisable(void)
  109. {
  110. uint32_t prot_temp;
  111. prot_temp = SCU->PROT.PROT;
  112. if (prot_temp != 0) /* 写保护了 */
  113. SCU_RegUnLock(); /* 解锁 */
  114. SCU->PCLKEN.Word = 0x00000000; /* 关闭所有外设时钟,scu无法关闭 */
  115. if (prot_temp != 0) /* 写保护了 */
  116. SCU_RegLock(); /* 打开写保护 */
  117. return;
  118. }
  119. /***************************************************************
  120. : DeviceClockAllEnableButIAP
  121. : IAP模块以外所有外设时钟
  122. :
  123. :
  124. :
  125. ***************************************************************/
  126. void DeviceClockAllEnableButIAP(void)
  127. {
  128. uint32_t prot_tmp;
  129. prot_tmp = SCU->PROT.PROT;
  130. if (prot_tmp != 0) /* 写保护已开 */
  131. SCU_RegUnLock(); /* 解锁写保护 */
  132. SCU->PCLKEN.Word = 0xFFFFFFFB; /* 打开除IAP以外所有外设时钟 */
  133. if (prot_tmp != 0) /* 写保护已开 */
  134. SCU_RegLock(); /* 打开写保护 */
  135. return;
  136. }
  137. /***************************************************************
  138. DeviceClock_Config
  139. 使
  140. tppe_periph NewState Disable或Enable
  141. ***************************************************************/
  142. void DeviceClock_Config(SUC_TYPE_Periph tppe_periph, TYPE_FUNCEN NewState)
  143. {
  144. SCU_RegUnLock();
  145. if (NewState != Disable)
  146. {
  147. SCU->PCLKEN.Word |= tppe_periph;
  148. }
  149. else
  150. {
  151. SCU->PCLKEN.Word &= ~tppe_periph;
  152. }
  153. SCU_RegLock();
  154. return;
  155. }
  156. /***************************************************************
  157. HRC_Config
  158. HRC时钟配置HRC默认16MHz
  159. hrc_en:HRC
  160. hrc_frehrc时钟频率选择
  161. sys_hrc使HRC时钟
  162. 2MHz16MHz32MHz48MHz
  163. ***************************************************************/
  164. void HRC_Config(TYPE_FUNCEN hrc_en, SCU_HRC_FRE hrc_fre, TYPE_FUNCEN sys_hrc)
  165. {
  166. SCU_RegUnLock();
  167. if (hrc_en == Enable)
  168. {
  169. /* 如果内部高速时钟未开启或不稳定,则重新开启HRC等待HRC稳定 */
  170. if (SCU->SCLKEN1.HRC_RDY == 0)
  171. {
  172. SCU->SCLKEN1.XTAL_EN = 0x0;
  173. SCU->SCLKEN1.HRC_EN = 0x1;
  174. while (SCU->SCLKEN1.HRC_RDY == 0x0); /* 等待HRC稳定 */
  175. }
  176. /* 配置合适的FLASH读取访问等待时间 */
  177. SCU->FLASHWAIT.ACCT = 0x01; /* 2Tclk完成FLASH读取 */
  178. /* 设置HRC时钟频率 */
  179. SCU->SCLKEN1.HRC_FRE = hrc_fre;
  180. /* 设置系统时钟源 */
  181. if (sys_hrc == Enable)
  182. {
  183. SCU->SCLKEN0.CLK_SEL = 0x00;
  184. while (SCU->SCLKEN1.HRC_RDY == 0); /* 等待HRC稳定 */
  185. }
  186. else
  187. {
  188. while (SCU->SCLKEN1.HRC_RDY == 0); /* 等待HRC稳定 */
  189. }
  190. }
  191. else
  192. {
  193. /* 关闭HRC切换到LRC时钟频率 */
  194. SCU->SCLKEN1.XTAL_EN = 0x0;
  195. SCU->SCLKEN1.HRC_EN = 0x0;
  196. /* 设置系统时钟源 */
  197. SCU->SCLKEN0.CLK_SEL = 0x01;
  198. }
  199. SCU_RegLock();
  200. return;
  201. }
  202. /***************************************************************
  203. SCU_MultTimerEnable
  204. (T16N0/1/2/3,P32N0)
  205. SCU_TimerMaskT16N0/1/2/3T32N0的任意组合
  206. ***************************************************************/
  207. void SCU_MultTimerEnable(SCU_TIMEREN_Typedef SCU_TimerMask)
  208. {
  209. SCU_RegUnLock();
  210. SCU->TIMEREN.Word = SCU_TimerMask.Word;
  211. SCU_RegLock();
  212. }
  213. /***************************************************************
  214. SCU_MultTimerDisable
  215. (T16N0/1/2/3,P32N0)
  216. SCU_TimerMaskT16N0/1/2/3T32N0的任意组合
  217. ***************************************************************/
  218. void SCU_MultTimerDisable(SCU_TIMERDIS_Typedef SCU_TimerMask)
  219. {
  220. SCU_RegUnLock();
  221. SCU->TIMERDIS.Word = SCU_TimerMask.Word;
  222. SCU_RegLock();
  223. }