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.

252 lines
9.4 KiB

4 years ago
  1. /*********************************************************
  2. *Copyright (C), 2015, Shanghai Eastsoft Microelectronics Co., Ltd.
  3. *: lib_scu.h
  4. * : AE Team
  5. * : V1.01
  6. * : 2021/06/09
  7. * : SCU模块库函数头文件
  8. * :
  9. 使
  10. **********************************************************/
  11. #ifndef __LIBSCU_H__
  12. #define __LIBSCU_H__
  13. #include "ES8P5066.h"
  14. #include "lib_gpio.h"
  15. #include "type.h"
  16. /* NMI不可屏蔽中断选择 */
  17. typedef enum
  18. {
  19. SCU_NMIIRQ_PINT0 = 0,
  20. SCU_NMIIRQ_PINT1 = 1,
  21. SCU_NMIIRQ_PINT2 = 2,
  22. SCU_NMIIRQ_PINT3 = 3,
  23. SCU_NMIIRQ_PINT4 = 4,
  24. SCU_NMIIRQ_PINT5 = 5,
  25. SCU_NMIIRQ_PINT6 = 6,
  26. SCU_NMIIRQ_PINT7 = 7,
  27. SCU_NMIIRQ_T16N0 = 8,
  28. SCU_NMIIRQ_T16N1 = 9,
  29. SCU_NMIIRQ_T16N2 = 10,
  30. SCU_NMIIRQ_T16N3 = 11,
  31. SCU_NMIIRQ_T32N0 = 12,
  32. SCU_NMIIRQ_WWDTINT = 15,
  33. SCU_NMIIRQ_IWDTINT = 16,
  34. SCU_NMIIRQ_KINT = 18,
  35. SCU_NMIIRQ_ADCINT = 19,
  36. SCU_NMIIRQ_LVDINT = 21,
  37. SCU_NMIIRQ_UART0 = 23,
  38. SCU_NMIIRQ_UART1 = 24,
  39. SCU_NMIIRQ_UART2 = 25,
  40. SCU_NMIIRQ_SPI1INT = 28,
  41. SCU_NMIIRQ_IIC0INT = 29,
  42. SCU_NMIIRQ_CCMINT = 31,
  43. } SCU_TYPE_NMICS;
  44. /* PWRC复位状态寄存器标志位 */
  45. typedef enum
  46. {
  47. SCU_PWRC_PORF = (1 << 0), /* POR总复位标志 */
  48. SCU_PWRC_PORRCF = (1 << 1), /* PORRC复位标志 */
  49. SCU_PWRC_PORRSTF = (1 << 2), /* PORRST复位标志 */
  50. SCU_PWRC_BORF = (1 << 3), /* BOR复位标志 */
  51. SCU_PWRC_WDTRSTF = (1 << 4), /* WDT复位标志 */
  52. SCU_PWRC_MRSTF = (1 << 5), /* MRSTn丢失标志位 */
  53. SCU_PWRC_SOFTRSTF = (1 << 6), /* 软件丢失标志位 */
  54. SCU_PWRC_POR_LOST = (1 << 7), /* POR丢失标志位 */
  55. SCU_PWRC_CFGRST = (1 << 8), /* 配置字读取 */
  56. SCU_PWRC_LKRSTF = (1 << 9), /* LOCKUP复位 */
  57. } SCU_TYPE_PWRC;
  58. /* LVD寄存器标志位 */
  59. typedef enum
  60. {
  61. SCU_LVDFlag_IF = (1 << 8), /* LVD中断标志 */
  62. SCU_LVDFlag_IE = (1 << 9), /* LVD中断使能标志 */
  63. SCU_LVDFlag_Out = (1 << 15), /* 输出状态位 */
  64. } SCU_TYPE_LVDCON;
  65. /* 时钟选择 */
  66. typedef enum
  67. {
  68. SCU_CLK_HRC = 0x0, /* HRC时钟 */
  69. SCU_CLK_LRC = 0x1, /* LRC时钟:32KHZ */
  70. SCU_CLK_XTAL = 0x2, /* XTAL时钟 */
  71. } SCU_TYPE_SYSCLK;
  72. /* 外设时钟 */
  73. typedef enum
  74. {
  75. SCU_SUCCLK = 0x00000001,
  76. SCU_GPIOCLK = 0x00000002,
  77. SCU_IAPCLK = 0x00000004,
  78. SCU_RESERVED0 = 0x00000008,
  79. SCU_ADCCLK = 0x00000010,
  80. SCU_RESERVED1 = 0x00000020,
  81. SCU_WWDTCLK = 0x00000040,
  82. SCU_IWDTCLK = 0x00000080,
  83. SCU_T16N0CLK = 0x00000100,
  84. SCU_T16N1CLK = 0x00000200,
  85. SCU_T16N2CLK = 0x00000400,
  86. SCU_T16N3CLK = 0x00000800,
  87. SCU_T32N0CLK = 0x00001000,
  88. SCU_RESERVED2 = 0x00002000,
  89. SCU_RESERVED3 = 0x00004000,
  90. SCU_RESERVED4 = 0x00008000,
  91. SCU_UART0CLK = 0x00010000,
  92. SCU_UART1CLK = 0x00020000,
  93. SCU_UART2CLK = 0x00040000,
  94. SCU_RESERVED5 = 0x00080000,
  95. SCU_RESERVED6 = 0x00100000,
  96. SCU_RESERVED7 = 0x00200000,
  97. SCU_RESERVED8 = 0x00400000,
  98. SCU_RESERVED9 = 0x00800000,
  99. SCU_RESERVED10 = 0x01000000,
  100. SCU_SPI1CLK = 0x02000000,
  101. SCU_RESERVED11 = 0x04000000,
  102. SCU_RESERVED12 = 0x08000000,
  103. SCU_I2C0CLK = 0x10000000,
  104. } SUC_TYPE_Periph;
  105. /* HRC时钟输出频率旋择 */
  106. typedef enum
  107. {
  108. SCU_HRC_2M = 0x0, /* HRC时钟输出为2MHz */
  109. SCU_HRC_16M = 0x1, /* HRC时钟输出为16Mhz */
  110. SCU_HRC_32M = 0x2, /* HRC时钟输出为32Mhz */
  111. SCU_HRC_48M = 0x3, /* HRC时钟输出为48Mhz */
  112. } SCU_HRC_FRE;
  113. /************SCU模块宏定义***********/
  114. /* SCU写保护控制 */
  115. #define SCU_RegUnLock() (SCU->PROT.Word = 0x55AA6996)
  116. #define SCU_RegLock() (SCU->PROT.Word = 0x00000000)
  117. /* NMI使能控制 */
  118. #define SCU_NMI_Enable() (SCU->NMICON.NMIEN = 0x1)
  119. #define SCU_NMI_Disable() (SCU->NMICON.NMIEN = 0x0)
  120. /*-------LVD模块-------*/
  121. /* LVD使能控制 */
  122. #define SCU_LVD_Enable() (SCU->LVDCON.EN = 0x1)
  123. #define SCU_LVD_Disable() (SCU->LVDCON.EN = 0x0)
  124. /* LVD滤波使能控制 */
  125. #define SCU_LVDFLT_Enable() (SCU->LVDCON.FLTEN = 0x1)
  126. #define SCU_LVDFLT_Disable() (SCU->LVDCON.FLTEN = 0x0)
  127. /* LVD触发电压选择 */
  128. #define SCU_LVDVS_2V2() (SCU->LVDCON.VS = 0x0)
  129. #define SCU_LVDVS_2V4() (SCU->LVDCON.VS = 0x1)
  130. #define SCU_LVDVS_2V6() (SCU->LVDCON.VS = 0x2)
  131. #define SCU_LVDVS_2V8() (SCU->LVDCON.VS = 0x3)
  132. #define SCU_LVDVS_3V() (SCU->LVDCON.VS = 0x4)
  133. #define SCU_LVDVS_3V6() (SCU->LVDCON.VS = 0x5)
  134. #define SCU_LVDVS_4V1() (SCU->LVDCON.VS = 0x6)
  135. #define SCU_LVDVS_4V7() (SCU->LVDCON.VS = 0x7)
  136. /* LVD中断使能控制 */
  137. #define SCU_LVDIT_Enable() (SCU->LVDCON.IE = 0x1)
  138. #define SCU_LVDIT_Disable() (SCU->LVDCON.IE = 0x0)
  139. /* LVD中断标志位清除 */
  140. #define SCU_LVDClearIFBit() (SCU->LVDCON.Word |= 0x01 << 8)
  141. /* LVD中断产生模式选择 */
  142. #define SCU_LVDIFS_Rise() (SCU->LVDCON.IFS = 0x0) /* LVDO上升沿产生中断 */
  143. #define SCU_LVDIFS_Fall() (SCU->LVDCON.IFS = 0x1) /* LVDO下降沿产生中断 */
  144. #define SCU_LVDIFS_High() (SCU->LVDCON.IFS = 0x2) /* LVDO高电平产生中断 */
  145. #define SCU_LVDIFS_Low() (SCU->LVDCON.IFS = 0x3) /* LVDO低电平产生中断 */
  146. #define SCU_LVDIFS_Change() (SCU->LVDCON.IFS = 0x4) /* LVDO电平变化产生中断 */
  147. #define SCU_LVDIFS_Get() (SCU->LVDCON.IFS) /* 获取LVDO的值 */
  148. /* LVD输出状态获取 */
  149. #define SCU_LVDO_Get() (SCU->LVDCON.LVDO) /* 被监测电压高于电压阈值返回0 */
  150. /* 系统唤醒时间控制 */
  151. #define SCU_WAKEUPTIME(X) (SCU->WAKEUPTIME.WAKEUPTIME = ((X) & 0xFFF))
  152. /* 深度睡眠下系统时钟控制 */
  153. #define SCU_MOSC_EN(X) (SCU->WAKEUPTIME.MOSC_EN = ((X) & 0x1))
  154. /* 系统时钟滤波器使能 */
  155. #define SCU_CLKFLT_EN(X) (SCU->WAKEUPTIME.CLKFLT_EN = ((X) & 0x1))
  156. /* VR工作时钟控制 */
  157. #define SCU_VROSCEN(X) (SCU->WAKEUPTIME.VROSCEN = ((X) & 0x1))
  158. /* 深度睡眠下SRAM低功耗使能 */
  159. #define SCU_STPRTNEN(X) (SCU->WAKEUPTIME.STPRTNEN = ((X) & 0x1))
  160. /* 深度睡眠下LDO电压输出 */
  161. #define SCU_LDOLP_VOSEL(X) (SCU->WAKEUPTIME.LDOLP_VOSEL = ((X) & 0x11))
  162. /* 深度睡眠下LDO低功耗使能 */
  163. #define SCU_LP_STOP(X) (SCU->WAKEUPTIME.LP_STOP = ((X) & 0x1))
  164. /* 深度睡眠下BG低功耗使能 */
  165. #define SCU_BG_STOP(X) (SCU->WAKEUPTIME.BG_STOP = ((X) & 0x1))
  166. /* 深度睡眠下FLASH STOP使能 */
  167. #define SCU_FLS_STOP(X) (SCU->WAKEUPTIME.FLS_STOP = ((X) & 0x1))
  168. /* FLASH访问等待时间选择 */
  169. #define SCU_FlashWait_1Tclk() (SCU->FLASHWAIT.ACCT = 0x0)
  170. #define SCU_FlashWait_2Tclk() (SCU->FLASHWAIT.ACCT = 0x1)
  171. #define SCU_FlashWait_3Tclk() (SCU->FLASHWAIT.ACCT = 0x2)
  172. #define SCU_FlashWait_4Tclk() (SCU->FLASHWAIT.ACCT = 0x3)
  173. #define SCU_FlashWait_5Tclk() (SCU->FLASHWAIT.ACCT = 0x4)
  174. #define SCU_FlashWait_6Tclk() (SCU->FLASHWAIT.ACCT = 0x5)
  175. #define SCU_FlashWait_7Tclk() (SCU->FLASHWAIT.ACCT = 0x6)
  176. #define SCU_FlashWait_8Tclk() (SCU->FLASHWAIT.ACCT = 0x7)
  177. #define SCU_FlashWait_9Tclk() (SCU->FLASHWAIT.ACCT = 0x8)
  178. #define SCU_FlashWait_10Tclk() (SCU->FLASHWAIT.ACCT = 0x9)
  179. #define SCU_FlashWait_11Tclk() (SCU->FLASHWAIT.ACCT = 0xA)
  180. #define SCU_FlashWait_12Tclk() (SCU->FLASHWAIT.ACCT = 0xB)
  181. #define SCU_FlashWait_13Tclk() (SCU->FLASHWAIT.ACCT = 0xC)
  182. #define SCU_FlashWait_14Tclk() (SCU->FLASHWAIT.ACCT = 0xD)
  183. #define SCU_FlashWait_15Tclk() (SCU->FLASHWAIT.ACCT = 0xE)
  184. #define SCU_FlashWait_16Tclk() (SCU->FLASHWAIT.ACCT = 0xF)
  185. /* 系统时钟后分频选择 */
  186. #define SCU_SysClk_Div1() (SCU->SCLKEN0.SYSCLK_DIV = 0)
  187. #define SCU_SysClk_Div2() (SCU->SCLKEN0.SYSCLK_DIV = 1)
  188. #define SCU_SysClk_Div4() (SCU->SCLKEN0.SYSCLK_DIV = 2)
  189. #define SCU_SysClk_Div8() (SCU->SCLKEN0.SYSCLK_DIV = 3)
  190. #define SCU_SysClk_Div16() (SCU->SCLKEN0.SYSCLK_DIV = 4)
  191. #define SCU_SysClk_Div32() (SCU->SCLKEN0.SYSCLK_DIV = 5)
  192. #define SCU_SysClk_Div64() (SCU->SCLKEN0.SYSCLK_DIV = 6)
  193. #define SCU_SysClk_Div128() (SCU->SCLKEN0.SYSCLK_DIV = 7)
  194. /* 外部时钟低功耗模式 */
  195. #define SCU_XTAL_LP_Enable() (SCU->SCLKEN0.XTAL_LP = 0)
  196. #define SCU_XTAL_LP_Disable() (SCU->SCLKEN0.XTAL_LP = 1)
  197. /* 中断向量表重映射使能控制 */
  198. #define SCU_TBLRemap_Enable() (SCU->TBLREMAPEN.EN= 1)
  199. #define SCU_TBLRemap_Disable() (SCU->TBLREMAPEN.EN= 0)
  200. /* 中断向量表偏移寄存器 x最大为2^24=16777216 */
  201. #define SCU_TBL_Offset(x) (SCU->TBLOFF.TBLOFF = (uint32_t)x)
  202. /************SCU模块函数声明***********/
  203. void SCU_NMISelect(SCU_TYPE_NMICS NMI_Type);
  204. FlagStatus SCU_GetPWRCFlagStatus(SCU_TYPE_PWRC PWRC_Flag);
  205. void SCU_ClearPWRCFlagBit(SCU_TYPE_PWRC PWRC_Flag);
  206. void SCU_OpenXTAL(void);
  207. FlagStatus SCU_GetLVDFlagStatus(SCU_TYPE_LVDCON LVD_Flag);
  208. void SCU_SysClkSelect(SCU_TYPE_SYSCLK Sysclk);
  209. SCU_TYPE_SYSCLK SCU_GetSysClk(void);
  210. void DeviceClockAllEnable(void);
  211. void DeviceClockAllDisable(void);
  212. void DeviceClockAllEnableButIAP(void);
  213. void DeviceClock_Config(SUC_TYPE_Periph tppe_periph, TYPE_FUNCEN NewState);
  214. void HRC_Config(TYPE_FUNCEN hrc_en, SCU_HRC_FRE hrc_fre, TYPE_FUNCEN sys_hrc);
  215. void SCU_MultTimerEnable(SCU_TIMEREN_Typedef SCU_TimerMask);
  216. void SCU_MultTimerDisable(SCU_TIMERDIS_Typedef SCU_TimerMask);
  217. #endif