lib_scu.h 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  1. /***************************************************************
  2. *Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd.
  3. *文件名: lib_scu.h
  4. *作 者: Liut
  5. *版 本: V1.00
  6. *日 期: 2017/07/14
  7. *描 述: 内核模块库函数头文件
  8. *备 注: 适用于 ES8P508x芯片
  9. 本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
  10. ***************************************************************/
  11. #ifndef __LIBSCU_H
  12. #define __LIBSCU_H
  13. #include "system_ES8P508x.h"
  14. #include "ES8P508x.h"
  15. #include "type.h"
  16. /* NMI不可屏蔽中断选择 */
  17. typedef enum
  18. {
  19. SCU_PINT0_IRQn = 0,
  20. SCU_PINT1_IRQn = 1,
  21. SCU_PINT2_IRQn = 2,
  22. SCU_PINT3_IRQn = 3,
  23. SCU_PINT4_IRQn = 4,
  24. SCU_PINT5_IRQn = 5,
  25. SCU_PINT6_IRQn = 6,
  26. SCU_PINT7_IRQn = 7,
  27. SCU_T16N0_IRQn = 8,
  28. SCU_T16N1_IRQn = 9,
  29. SCU_T16N2_IRQn = 10,
  30. SCU_T16N3_IRQn = 11,
  31. SCU_T32N0_IRQn = 12,
  32. SCU_IWDT_IRQn = 14,
  33. SCU_WWDT_IRQn = 15,
  34. SCU_CCM_IRQn = 16,
  35. SCU_PLK_IRQn = 17,
  36. SCU_LVD_IRQn = 18,
  37. SCU_KINT_IRQn = 19,
  38. SCU_RTC_IRQn = 20,
  39. SCU_ADC_IRQn = 21,
  40. SCU_AES_IRQn = 23,
  41. SCU_UART0_IRQn = 24,
  42. SCU_UART1_IRQn = 25,
  43. SCU_UART2_IRQn = 26,
  44. SCU_UART3_IRQn = 27,
  45. SCU_UART4_IRQn = 28,
  46. SCU_UART5_IRQn = 29,
  47. SCU_SPI0_IRQn = 30,
  48. SCU_I2C0_IRQn = 31,
  49. }SCU_TYPE_NMICS;
  50. /* PWRC复位状态寄存器标志位 */
  51. typedef enum
  52. {
  53. SCU_PWRC_PORF= 0X00001, //POR复位标志位
  54. SCU_PWRC_RRCF = 0X00002, //PORC复位标志位
  55. SCU_PWRC_PORRSTF = 0x00004, //POR总复位标志
  56. SCU_PWRC_BORF = 0x00008, //BOR总复位标志
  57. SCU_PWRC_WWDTRSTF = 0x00010, //WWDT复位标志
  58. SCU_PWRC_IWDTRSTF = 0x00020, //IWDT复位标志
  59. SCU_PWRC_MRSTF = 0x00040, //MRSTn复位标志
  60. SCU_PWRC_SOFTRSTF = 0x00080, //软件复位标志
  61. }SCU_TYPE_PWRC;
  62. /* LVD寄存器标志位 */
  63. typedef enum
  64. {
  65. SCU_LVDFlag_IF = 0x0100, //LVD中断标志
  66. SCU_LVDFlag_Out = 0x8000, //输出状态位
  67. }SCU_TYPE_LVD0CON;
  68. /* 时钟选择 */
  69. typedef enum
  70. {
  71. SCU_SysClk_HRC = 0x0 , //内部20MHZ RC时钟
  72. SCU_SysClk_XTAL = 0x1 , //外部晶振主时钟
  73. SCU_SysClk_PLL = 0x2 , //PLL
  74. }SCU_TYPE_SYSCLK;
  75. /*clk_sel时钟源选择*/
  76. typedef enum
  77. {
  78. CLK_SEL_HRC = 0x0, //HRC 20M
  79. CLK_SEL_LRC = 0x1, //LRC 32KHz
  80. CLK_SEL_XTAL = 0x2, //外接晶振XTAL
  81. }SCU_TYPE_CLK_SEL;
  82. /* PLL时钟源选择 */
  83. typedef enum
  84. {
  85. SCU_PLL_HRC = 0x0 , //PLL时钟源HRC
  86. SCU_PLL_LRC = 0x2 , //PLL时钟源LRC
  87. SCU_PLL_XTAL_32K = 0x3 , //PLL时钟源XTAL
  88. SCU_PLL_XTAL_4M = 0x4 , //PLL时钟源XTAL
  89. SCU_PLL_XTAL_8M = 0x5, //PLL时钟源XTAL
  90. SCU_PLL_XTAL_16M = 0x6, //PLL时钟源XTAL
  91. SCU_PLL_XTAL_20M = 0x7, //PLL时钟源XTAL
  92. } SCU_PLL_Origin;
  93. /* PLL时钟输出频率旋择 */
  94. typedef enum
  95. {
  96. SCU_PLL_32M = 0x0 , //PLL时钟输出为32MHz
  97. SCU_PLL_48M = 0x1 , //PLL时钟输出为48Mhz
  98. } SCU_PLL_Out;
  99. /************SCU模块宏定义***********/
  100. /* SCU写保护控制 */
  101. #define SCU_RegUnLock() (SCU->PROT.Word = 0x55AA6996)
  102. #define SCU_RegLock() (SCU->PROT.Word = 0x00000000)
  103. /* NMI使能控制 */
  104. #define SCU_NMI_Enable() (SCU->NMICON.NMIEN = 0x1)
  105. #define SCU_NMI_Disable() (SCU->NMICON.NMIEN = 0x0)
  106. /*-------LVD模块-------*/
  107. /* LVD使能控制 */
  108. #define SCU_LVD_Enable() (SCU->LVDCON.EN = 0x1)
  109. #define SCU_LVD_Disable() (SCU->LVDCON.EN = 0x0)
  110. /* LVD滤波使能控制 */
  111. #define SCU_LVDFLT_Enable() (SCU->LVDCON.FLTEN = 0x1)
  112. #define SCU_LVDFLT_Disable() (SCU->LVDCON.FLTEN = 0x0)
  113. /* LVD触发电压选择 */
  114. #define SCU_LVDVS_2V0() (SCU->LVDCON.VS = 0x0)
  115. #define SCU_LVDVS_2V1() (SCU->LVDCON.VS = 0x1)
  116. #define SCU_LVDVS_2V2() (SCU->LVDCON.VS = 0x2)
  117. #define SCU_LVDVS_2V4() (SCU->LVDCON.VS = 0x3)
  118. #define SCU_LVDVS_2V6() (SCU->LVDCON.VS = 0x4)
  119. #define SCU_LVDVS_2V8() (SCU->LVDCON.VS = 0x5)
  120. #define SCU_LVDVS_3V0() (SCU->LVDCON.VS = 0x6)
  121. #define SCU_LVDVS_3V6() (SCU->LVDCON.VS = 0x7)
  122. #define SCU_LVDVS_4V() (SCU->LVDCON.VS = 0x8)
  123. #define SCU_LVDVS_4V6() (SCU->LVDCON.VS = 0x9)
  124. #define SCU_LVDVS_2V3() (SCU->LVDCON.VS = 0xA)
  125. #define SCU_LVDVS_LVDIN() (SCU->LVDCON.VS = 0xE)
  126. /* LVD中断使能控制 */
  127. #define SCU_LVDIT_Enable() (SCU->LVDCON.IE = 0x1)
  128. #define SCU_LVDIT_Disable() (SCU->LVDCON.IE = 0x0)
  129. /* LVD中断标志位清除 */
  130. #define SCU_LVDClearIFBit() (SCU->LVDCON.IF = 1)
  131. /* LVD中断产生模式选择 */
  132. #define SCU_LVDIFS_Rise() (SCU->LVDCON.IFS = 0x0) //LVDO上升沿产生中断
  133. #define SCU_LVDIFS_Fall() (SCU->LVDCON.IFS = 0x1) //LVDO下降沿产生中断
  134. #define SCU_LVDIFS_High() (SCU->LVDCON.IFS = 0x2) //LVDO高电平产生中断
  135. #define SCU_LVDIFS_Low() (SCU->LVDCON.IFS = 0x3) //LVDO低电平产生中断
  136. #define SCU_LVDIFS_Change() (SCU->LVDCON.IFS = 0x4) //LVDO电平变化产生中断
  137. /* FLASH访问等待时间选择 */
  138. #define SCU_FlashWait_1Tclk() (SCU->FLASHWAIT.ACCT = 0x0)
  139. #define SCU_FlashWait_2Tclk() (SCU->FLASHWAIT.ACCT = 0x1)
  140. #define SCU_FlashWait_3Tclk() (SCU->FLASHWAIT.ACCT = 0x2)
  141. #define SCU_FlashWait_4Tclk() (SCU->FLASHWAIT.ACCT = 0x3)
  142. #define SCU_FlashWait_5Tclk() (SCU->FLASHWAIT.ACCT = 0x4)
  143. #define SCU_FlashWait_6Tclk() (SCU->FLASHWAIT.ACCT = 0x5)
  144. #define SCU_FlashWait_7Tclk() (SCU->FLASHWAIT.ACCT = 0x6)
  145. #define SCU_FlashWait_8Tclk() (SCU->FLASHWAIT.ACCT = 0x7)
  146. #define SCU_FlashWait_9Tclk() (SCU->FLASHWAIT.ACCT = 0x8)
  147. #define SCU_FlashWait_10Tclk() (SCU->FLASHWAIT.ACCT = 0x9)
  148. #define SCU_FlashWait_11Tclk() (SCU->FLASHWAIT.ACCT = 0xA)
  149. #define SCU_FlashWait_12Tclk() (SCU->FLASHWAIT.ACCT = 0xB)
  150. #define SCU_FlashWait_13Tclk() (SCU->FLASHWAIT.ACCT = 0xC)
  151. #define SCU_FlashWait_14Tclk() (SCU->FLASHWAIT.ACCT = 0xD)
  152. #define SCU_FlashWait_15Tclk() (SCU->FLASHWAIT.ACCT = 0xE)
  153. #define SCU_FlashWait_16Tclk() (SCU->FLASHWAIT.ACCT = 0xF)
  154. /* 系统时钟后分频选择 */
  155. #define SCU_SysClk_Div1() (SCU->SCLKEN0.SYSCLK_DIV = 0)
  156. #define SCU_SysClk_Div2() (SCU->SCLKEN0.SYSCLK_DIV = 1)
  157. #define SCU_SysClk_Div4() (SCU->SCLKEN0.SYSCLK_DIV = 2)
  158. #define SCU_SysClk_Div8() (SCU->SCLKEN0.SYSCLK_DIV = 3)
  159. #define SCU_SysClk_Div16() (SCU->SCLKEN0.SYSCLK_DIV = 4)
  160. #define SCU_SysClk_Div32() (SCU->SCLKEN0.SYSCLK_DIV = 5)
  161. #define SCU_SysClk_Div64() (SCU->SCLKEN0.SYSCLK_DIV = 6)
  162. #define SCU_SysClk_Div128() (SCU->SCLKEN0.SYSCLK_DIV = 7)
  163. /* HRC使能控制 (内部20Mhz) */
  164. #define SCU_HRC_Enable() (SCU->SCLKEN1.HRC_EN = 1)
  165. #define SCU_HRC_Disable() (SCU->SCLKEN1.HRC_EN = 0)
  166. /* XTAL使能控制 */
  167. #define SCU_XTAL_Enable() (SCU->SCLKEN1.XTAL_EN = 1)
  168. #define SCU_XTAL_Disable() (SCU->SCLKEN1.XTAL_EN = 0)
  169. /* PLL模式使能控制 */
  170. #define SCU_PLL_Enable() (SCU->SCLKEN1.PLL_EN = 1)
  171. #define SCU_PLL_Disable() (SCU->SCLKEN1.PLL_EN = 0)
  172. /*-------外设时钟控制-------*/
  173. /* SCU时钟使能控制 */
  174. #define SCU_SCUCLK_Enable() (SCU->PCLKEN0.SCU_EN = 1)
  175. #define SCU_SCUCLK_Disable() (SCU->PCLKEN0.SCU_EN = 0)
  176. /* GPIO时钟使能控制 */
  177. #define SCU_GPIOCLK_Enable() (SCU->PCLKEN0.GPIO_EN = 1)
  178. #define SCU_GPIOCLK_Disable() (SCU->PCLKEN0.GPIO_EN = 0)
  179. /* FLASH IAP时钟使能控制 */
  180. #define SCU_IAPCLK_Enable() (SCU->PCLKEN0.IAP_EN = 1)
  181. #define SCU_IAPCLK_Disable() (SCU->PCLKEN0.IAP_EN = 0)
  182. /* CRC时钟使能控制 */
  183. #define SCU_CRCCLK_Enable() (SCU->PCLKEN0.CRC_EN = 1)
  184. #define SCU_CRCCLK_Disable() (SCU->PCLKEN0.CRC_EN = 0)
  185. /* ADC时钟使能控制 */
  186. #define SCU_ADCCLK_Enable() (SCU->PCLKEN0.ADC_EN = 1)
  187. #define SCU_ADCCLK_Disable() (SCU->PCLKEN0.ADC_EN = 0)
  188. /* RTC时钟使能控制 */
  189. #define SCU_RTCCLK_Enable() (SCU->PCLKEN0.RTC_EN = 1)
  190. #define SCU_RTCCLK_Disable() (SCU->PCLKEN0.RTC_EN = 0)
  191. /* IWDT时钟使能控制 */
  192. #define SCU_IWDTCLK_Enable() (SCU->PCLKEN0.IWDT_EN = 1)
  193. #define SCU_IWDTCLK_Disable() (SCU->PCLKEN0.IWDT_EN = 0)
  194. /* WWDT时钟使能控制 */
  195. #define SCU_WWDTCLK_Enable() (SCU->PCLKEN0.WWDT_EN = 1)
  196. #define SCU_WWDTCLK_Disable() (SCU->PCLKEN0.WWDT_EN = 0)
  197. /* AES时钟使能控制 */
  198. #define SCU_AESCLK_Enable() (SCU->PCLKEN0.AES_EN = 1)
  199. #define SCU_AESCLK_Disable() (SCU->PCLKEN0.AES_EN = 0)
  200. /* T16N0时钟使能控制 */
  201. #define SCU_T16N0CLK_Enable() (SCU->PCLKEN1.T16N0_EN = 1)
  202. #define SCU_T16N0CLK_Disable() (SCU->PCLKEN1.T16N0_EN = 0)
  203. /* T16N1时钟使能控制 */
  204. #define SCU_T16N1CLK_Enable() (SCU->PCLKEN1.T16N1_EN = 1)
  205. #define SCU_T16N1CLK_Disable() (SCU->PCLKEN1.T16N1_EN = 0)
  206. /* T16N2时钟使能控制 */
  207. #define SCU_T16N2CLK_Enable() (SCU->PCLKEN1.T16N2_EN = 1)
  208. #define SCU_T16N2CLK_Disable() (SCU->PCLKEN1.T16N2_EN = 0)
  209. /* T16N3时钟使能控制 */
  210. #define SCU_T16N3CLK_Enable() (SCU->PCLKEN1.T16N3_EN = 1)
  211. #define SCU_T16N3CLK_Disable() (SCU->PCLKEN1.T16N3_EN = 0)
  212. /* T32N0时钟使能控制 */
  213. #define SCU_T32N0CLK_Enable() (SCU->PCLKEN1.T32N0_EN = 1)
  214. #define SCU_T32N0CLK_Disable() (SCU->PCLKEN1.T32N0_EN = 0)
  215. /* UART0时钟使能控制 */
  216. #define SCU_UART0CLK_Enable() (SCU->PCLKEN1.UART0_EN = 1)
  217. #define SCU_UART0CLK_Disable() (SCU->PCLKEN1.UART0_EN = 0)
  218. /* UART1时钟使能控制 */
  219. #define SCU_UART1CLK_Enable() (SCU->PCLKEN1.UART1_EN = 1)
  220. #define SCU_UART1CLK_Disable() (SCU->PCLKEN1.UART1_EN = 0)
  221. /* UART2时钟使能控制 */
  222. #define SCU_UART2CLK_Enable() (SCU->PCLKEN1.UART2_EN = 1)
  223. #define SCU_UART2CLK_Disable() (SCU->PCLKEN1.UART2_EN = 0)
  224. /* UART3时钟使能控制 */
  225. #define SCU_UART3CLK_Enable() (SCU->PCLKEN1.UART3_EN = 1)
  226. #define SCU_UART3CLK_Disable() (SCU->PCLKEN1.UART3_EN = 0)
  227. /* UART4时钟使能控制 */
  228. #define SCU_UART4CLK_Enable() (SCU->PCLKEN1.UART4_EN = 1)
  229. #define SCU_UART4CLK_Disable() (SCU->PCLKEN1.UART4_EN = 0)
  230. /* UART5时钟使能控制 */
  231. #define SCU_UART5CLK_Enable() (SCU->PCLKEN1.UART5_EN = 1)
  232. #define SCU_UART5CLK_Disable() (SCU->PCLKEN1.UART5_EN = 0)
  233. /* SPI0时钟使能控制 */
  234. #define SCU_SPI0CLK_Enable() (SCU->PCLKEN1.SPI0_EN = 1)
  235. #define SCU_SPI0CLK_Disable() (SCU->PCLKEN1.SPI0_EN = 0)
  236. /* IIC0时钟使能控制 */
  237. #define SCU_IIC0CLK_Enable() (SCU->PCLKEN1.I2C0_EN = 1)
  238. #define SCU_IIC0CLK_Disable() (SCU->PCLKEN1.I2C0_EN = 0)
  239. /* 中断向量表重映射使能控制 */
  240. #define SCU_TBLRemap_Enable() (SCU->TBLREMAPEN.EN= 1)
  241. #define SCU_TBLRemap_Disable() (SCU->TBLREMAPEN.EN= 0)
  242. /* 中断向量表偏移寄存器 x最大为2^24=16777216 */
  243. #define SCU_TBL_Offset(x) (SCU->TBLOFF.TBLOFF = (uint32_t)x)
  244. /************SCU模块函数声明***********/
  245. void SCU_OpenXTAL(void);
  246. void SCU_NMISelect(SCU_TYPE_NMICS NMI_Type);
  247. FlagStatus SCU_GetPWRCFlagStatus(SCU_TYPE_PWRC PWRC_Flag);
  248. void SCU_ClearPWRCFlagBit(SCU_TYPE_PWRC PWRC_Flag);
  249. FlagStatus SCU_GetLVDFlagStatus(SCU_TYPE_LVD0CON LVD_Flag);
  250. void SCU_SysClkSelect(SCU_TYPE_SYSCLK Sysclk);
  251. SCU_TYPE_SYSCLK SCU_GetSysClk(void);
  252. FlagStatus SCU_HRCReadyFlag(void);
  253. FlagStatus SCU_XTALReadyFlag(void);
  254. FlagStatus SCU_PLLReadyFlag(void);
  255. void SystemClockConfig(void);
  256. void SystemClockConfig_1(void);
  257. void DeviceClockAllEnable(void);
  258. void DeviceClockAllDisable(void);
  259. void SystemClockSelect(SCU_TYPE_SYSCLK SYSCLKx , SCU_TYPE_CLK_SEL CLK_SEL);
  260. void PLLClock_Config(TYPE_FUNCEN pll_en , SCU_PLL_Origin pll_origin ,SCU_PLL_Out pll_out,TYPE_FUNCEN sys_pll);
  261. #endif
  262. /*************************END OF FILE**********************/