gd32f3x0_rcu.h 54 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781
  1. /*!
  2. \file gd32f3x0_rcu.h
  3. \brief definitions for the RCU
  4. */
  5. /*
  6. Copyright (C) 2017 GigaDevice
  7. 2017-06-06, V1.0.0, firmware for GD32F3x0
  8. */
  9. #ifndef GD32F3X0_RCU_H
  10. #define GD32F3X0_RCU_H
  11. #include "gd32f3x0.h"
  12. /* RCU definitions */
  13. #define RCU RCU_BASE
  14. /* registers definitions */
  15. #define RCU_CTL0 REG32(RCU + 0x00U) /*!< control register 0 */
  16. #define RCU_CFG0 REG32(RCU + 0x04U) /*!< configuration register 0 */
  17. #define RCU_INT REG32(RCU + 0x08U) /*!< interrupt register */
  18. #define RCU_APB2RST REG32(RCU + 0x0CU) /*!< APB2 reset register */
  19. #define RCU_APB1RST REG32(RCU + 0x10U) /*!< APB1 reset register */
  20. #define RCU_AHBEN REG32(RCU + 0x14U) /*!< AHB enable register */
  21. #define RCU_APB2EN REG32(RCU + 0x18U) /*!< APB2 enable register */
  22. #define RCU_APB1EN REG32(RCU + 0x1CU) /*!< APB1 enable register */
  23. #define RCU_BDCTL REG32(RCU + 0x20U) /*!< backup domain control register */
  24. #define RCU_RSTSCK REG32(RCU + 0x24U) /*!< reset source /clock register */
  25. #define RCU_AHBRST REG32(RCU + 0x28U) /*!< AHB reset register */
  26. #define RCU_CFG1 REG32(RCU + 0x2CU) /*!< configuration register 1 */
  27. #define RCU_CFG2 REG32(RCU + 0x30U) /*!< configuration register 2 */
  28. #define RCU_CTL1 REG32(RCU + 0x34U) /*!< control register 1 */
  29. #define RCU_ADDCTL REG32(RCU + 0xC0U) /*!< additional clock control register */
  30. #define RCU_ADDINT REG32(RCU + 0xCCU) /*!< additional clock interrupt register */
  31. #define RCU_ADDAPB1EN REG32(RCU + 0xF8U) /*!< APB1 additional enable register */
  32. #define RCU_ADDAPB1RST REG32(RCU + 0xFCU) /*!< APB1 additional reset register */
  33. #define RCU_VKEY REG32(RCU + 0x100U) /*!< voltage key register */
  34. #define RCU_DSV REG32(RCU + 0x134U) /*!< deep-sleep mode voltage register */
  35. /* bits definitions */
  36. /* RCU_CTL0 */
  37. #define RCU_CTL0_IRC8MEN BIT(0) /*!< internal high speed oscillator enable */
  38. #define RCU_CTL0_IRC8MSTB BIT(1) /*!< IRC8M high speed internal oscillator stabilization flag */
  39. #define RCU_CTL0_IRC8MADJ BITS(3,7) /*!< high speed internal oscillator clock trim adjust value */
  40. #define RCU_CTL0_IRC8MCALIB BITS(8,15) /*!< high speed internal oscillator calibration value register */
  41. #define RCU_CTL0_HXTALEN BIT(16) /*!< external high speed oscillator enable */
  42. #define RCU_CTL0_HXTALSTB BIT(17) /*!< external crystal oscillator clock stabilization flag */
  43. #define RCU_CTL0_HXTALBPS BIT(18) /*!< external crystal oscillator clock bypass mode enable */
  44. #define RCU_CTL0_CKMEN BIT(19) /*!< HXTAL clock monitor enable */
  45. #define RCU_CTL0_PLLEN BIT(24) /*!< PLL enable */
  46. #define RCU_CTL0_PLLSTB BIT(25) /*!< PLL clock stabilization flag */
  47. /* RCU_CFG0 */
  48. #define RCU_CFG0_SCS BITS(0,1) /*!< system clock switch */
  49. #define RCU_CFG0_SCSS BITS(2,3) /*!< system clock switch status */
  50. #define RCU_CFG0_AHBPSC BITS(4,7) /*!< AHB prescaler selection */
  51. #define RCU_CFG0_APB1PSC BITS(8,10) /*!< APB1 prescaler selection */
  52. #define RCU_CFG0_APB2PSC BITS(11,13) /*!< APB2 prescaler selection */
  53. #define RCU_CFG0_ADCPSC BITS(14,15) /*!< ADC clock prescaler selection */
  54. #define RCU_CFG0_PLLSEL BIT(16) /*!< PLL clock source selection */
  55. #define RCU_CFG0_PLLPREDV BIT(17) /*!< divider for PLL source clock selection */
  56. #define RCU_CFG0_PLLMF (BIT(27) | BITS(18,21)) /*!< PLL multiply factor */
  57. #define RCU_CFG0_USBFSPSC BITS(22,23) /*!< USBFS clock prescaler selection */
  58. #define RCU_CFG0_CKOUTSEL BITS(24,26) /*!< CK_OUT clock source selection */
  59. #define RCU_CFG0_PLLMF4 BIT(27) /*!< bit 4 of PLLMF */
  60. #define RCU_CFG0_CKOUTDIV BITS(28,30) /*!< CK_OUT divider which the CK_OUT frequency can be reduced */
  61. #define RCU_CFG0_PLLDV BIT(31) /*!< CK_PLL divide by 1 or 2 */
  62. /* RCU_INT */
  63. #define RCU_INT_IRC40KSTBIF BIT(0) /*!< IRC40K stabilization interrupt flag */
  64. #define RCU_INT_LXTALSTBIF BIT(1) /*!< LXTAL stabilization interrupt flag */
  65. #define RCU_INT_IRC8MSTBIF BIT(2) /*!< IRC8M stabilization interrupt flag */
  66. #define RCU_INT_HXTALSTBIF BIT(3) /*!< HXTAL stabilization interrupt flag */
  67. #define RCU_INT_PLLSTBIF BIT(4) /*!< PLL stabilization interrupt flag */
  68. #define RCU_INT_IRC28MSTBIF BIT(5) /*!< IRC28M stabilization interrupt flag */
  69. #define RCU_INT_CKMIF BIT(7) /*!< HXTAL clock stuck interrupt flag */
  70. #define RCU_INT_IRC40KSTBIE BIT(8) /*!< IRC40K stabilization interrupt enable */
  71. #define RCU_INT_LXTALSTBIE BIT(9) /*!< LXTAL stabilization interrupt enable */
  72. #define RCU_INT_IRC8MSTBIE BIT(10) /*!< IRC8M stabilization interrupt enable */
  73. #define RCU_INT_HXTALSTBIE BIT(11) /*!< HXTAL stabilization interrupt enable */
  74. #define RCU_INT_PLLSTBIE BIT(12) /*!< PLL stabilization interrupt enable */
  75. #define RCU_INT_IRC28MSTBIE BIT(13) /*!< IRC28M stabilization interrupt enable */
  76. #define RCU_INT_IRC40KSTBIC BIT(16) /*!< IRC40K stabilization interrupt clear */
  77. #define RCU_INT_LXTALSTBIC BIT(17) /*!< LXTAL stabilization interrupt clear */
  78. #define RCU_INT_IRC8MSTBIC BIT(18) /*!< IRC8M stabilization interrupt clear */
  79. #define RCU_INT_HXTALSTBIC BIT(19) /*!< HXTAL stabilization interrupt clear */
  80. #define RCU_INT_PLLSTBIC BIT(20) /*!< PLL stabilization interrupt clear */
  81. #define RCU_INT_IRC28MSTBIC BIT(21) /*!< IRC28M stabilization interrupt clear */
  82. #define RCU_INT_CKMIC BIT(23) /*!< HXTAL clock stuck interrupt clear */
  83. /* RCU_APB2RST */
  84. #define RCU_APB2RST_CFGRST BIT(0) /*!< system configuration reset */
  85. #define RCU_APB2RST_ADCRST BIT(9) /*!< ADC reset */
  86. #define RCU_APB2RST_TIMER0RST BIT(11) /*!< TIMER0 reset */
  87. #define RCU_APB2RST_SPI0RST BIT(12) /*!< SPI0 reset */
  88. #define RCU_APB2RST_USART0RST BIT(14) /*!< USART0 reset */
  89. #define RCU_APB2RST_TIMER14RST BIT(16) /*!< TIMER14 reset */
  90. #define RCU_APB2RST_TIMER15RST BIT(17) /*!< TIMER15 reset */
  91. #define RCU_APB2RST_TIMER16RST BIT(18) /*!< TIMER16 reset */
  92. /* RCU_APB1RST */
  93. #define RCU_APB1RST_TIMER1RST BIT(0) /*!< TIMER1 timer reset */
  94. #define RCU_APB1RST_TIMER2RST BIT(1) /*!< TIMER2 timer reset */
  95. #define RCU_APB1RST_TIMER5RST BIT(4) /*!< TIMER5 timer reset */
  96. #define RCU_APB1RST_TIMER13RST BIT(8) /*!< TIMER13 timer reset */
  97. #define RCU_APB1RST_WWDGTRST BIT(11) /*!< window watchdog timer reset */
  98. #define RCU_APB1RST_SPI1RST BIT(14) /*!< SPI1 reset */
  99. #define RCU_APB1RST_SPI2RST BIT(15) /*!< SPI2 reset */
  100. #define RCU_APB1RST_USART1RST BIT(17) /*!< USART1 reset */
  101. #define RCU_APB1RST_I2C0RST BIT(21) /*!< I2C0 reset */
  102. #define RCU_APB1RST_I2C1RST BIT(22) /*!< I2C1 reset */
  103. #define RCU_APB1RST_PMURST BIT(28) /*!< power control reset */
  104. #define RCU_APB1RST_DACRST BIT(29) /*!< DAC reset */
  105. #define RCU_APB1RST_CECRST BIT(30) /*!< HDMI CEC reset */
  106. /* RCU_AHBEN */
  107. #define RCU_AHBEN_DMAEN BIT(0) /*!< DMA clock enable */
  108. #define RCU_AHBEN_SRAMSPEN BIT(2) /*!< SRAM interface clock enable */
  109. #define RCU_AHBEN_FMCSPEN BIT(4) /*!< FMC clock enable */
  110. #define RCU_AHBEN_CRCEN BIT(6) /*!< CRC clock enable */
  111. #define RCU_AHBEN_USBFS BIT(12) /*!< USBFS clock enable */
  112. #define RCU_AHBEN_PAEN BIT(17) /*!< GPIO port A clock enable */
  113. #define RCU_AHBEN_PBEN BIT(18) /*!< GPIO port B clock enable */
  114. #define RCU_AHBEN_PCEN BIT(19) /*!< GPIO port C clock enable */
  115. #define RCU_AHBEN_PDEN BIT(20) /*!< GPIO port D clock enable */
  116. #define RCU_AHBEN_PFEN BIT(22) /*!< GPIO port F clock enable */
  117. #define RCU_AHBEN_TSIEN BIT(24) /*!< TSI clock enable */
  118. /* RCU_APB2EN */
  119. #define RCU_APB2EN_CFGCMPEN BIT(0) /*!< system configuration and comparator clock enable */
  120. #define RCU_APB2EN_ADCEN BIT(9) /*!< ADC interface clock enable */
  121. #define RCU_APB2EN_TIMER0EN BIT(11) /*!< TIMER0 timer clock enable */
  122. #define RCU_APB2EN_SPI0EN BIT(12) /*!< SPI0 clock enable */
  123. #define RCU_APB2EN_USART0EN BIT(14) /*!< USART0 clock enable */
  124. #define RCU_APB2EN_TIMER14EN BIT(16) /*!< TIMER14 timer clock enable */
  125. #define RCU_APB2EN_TIMER15EN BIT(17) /*!< TIMER15 timer clock enable */
  126. #define RCU_APB2EN_TIMER16EN BIT(18) /*!< TIMER16 timer clock enable */
  127. /* RCU_APB1EN */
  128. #define RCU_APB1EN_TIMER1EN BIT(0) /*!< TIMER1 timer clock enable */
  129. #define RCU_APB1EN_TIMER2EN BIT(1) /*!< TIMER2 timer clock enable */
  130. #define RCU_APB1EN_TIMER5EN BIT(4) /*!< TIMER5 timer clock enable */
  131. #define RCU_APB1EN_TIMER13EN BIT(8) /*!< TIMER13 timer clock enable */
  132. #define RCU_APB1EN_WWDGTEN BIT(11) /*!< window watchdog timer clock enable */
  133. #define RCU_APB1EN_SPI1EN BIT(14) /*!< SPI1 clock enable */
  134. #define RCU_APB1EN_SPI2EN BIT(15) /*!< SPI2 clock enable */
  135. #define RCU_APB1EN_USART1EN BIT(17) /*!< USART1 clock enable */
  136. #define RCU_APB1EN_I2C0EN BIT(21) /*!< I2C0 clock enable */
  137. #define RCU_APB1EN_I2C1EN BIT(22) /*!< I2C1 clock enable */
  138. #define RCU_APB1EN_PMUEN BIT(28) /*!< power interface clock enable */
  139. #define RCU_APB1EN_DACEN BIT(29) /*!< DAC interface clock enable */
  140. #define RCU_APB1EN_CECEN BIT(30) /*!< HDMI CEC interface clock enable */
  141. /* RCU_BDCTL */
  142. #define RCU_BDCTL_LXTALEN BIT(0) /*!< LXTAL enable */
  143. #define RCU_BDCTL_LXTALSTB BIT(1) /*!< external low-speed oscillator stabilization */
  144. #define RCU_BDCTL_LXTALBPS BIT(2) /*!< LXTAL bypass mode enable */
  145. #define RCU_BDCTL_LXTALDRI BITS(3,4) /*!< LXTAL drive capability */
  146. #define RCU_BDCTL_RTCSRC BITS(8,9) /*!< RTC clock entry selection */
  147. #define RCU_BDCTL_RTCEN BIT(15) /*!< RTC clock enable */
  148. #define RCU_BDCTL_BKPRST BIT(16) /*!< backup domain reset */
  149. /* RCU_RSTSCK */
  150. #define RCU_RSTSCK_IRC40KEN BIT(0) /*!< IRC40K enable */
  151. #define RCU_RSTSCK_IRC40KSTB BIT(1) /*!< IRC40K stabilization */
  152. #define RCU_RSTSCK_V12RSTF BIT(23) /*!< V12 domain power reset flag */
  153. #define RCU_RSTSCK_RSTFC BIT(24) /*!< reset flag clear */
  154. #define RCU_RSTSCK_OBLRSTF BIT(25) /*!< option byte loader reset flag */
  155. #define RCU_RSTSCK_EPRSTF BIT(26) /*!< external pin reset flag */
  156. #define RCU_RSTSCK_PORRSTF BIT(27) /*!< power reset flag */
  157. #define RCU_RSTSCK_SWRSTF BIT(28) /*!< software reset flag */
  158. #define RCU_RSTSCK_FWDGTRSTF BIT(29) /*!< free watchdog timer reset flag */
  159. #define RCU_RSTSCK_WWDGTRSTF BIT(30) /*!< window watchdog timer reset flag */
  160. #define RCU_RSTSCK_LPRSTF BIT(31) /*!< low-power reset flag */
  161. /* RCU_AHBRST */
  162. #define RCU_AHBRST_USBFSRST BIT(12) /*!< USBFS reset */
  163. #define RCU_AHBRST_PARST BIT(17) /*!< GPIO port A reset */
  164. #define RCU_AHBRST_PBRST BIT(18) /*!< GPIO port B reset */
  165. #define RCU_AHBRST_PCRST BIT(19) /*!< GPIO port C reset */
  166. #define RCU_AHBRST_PDRST BIT(20) /*!< GPIO port D reset */
  167. #define RCU_AHBRST_PFRST BIT(22) /*!< GPIO port F reset */
  168. #define RCU_AHBRST_TSIRST BIT(24) /*!< TSI unit reset */
  169. /* RCU_CFG1 */
  170. #define RCU_CFG1_PREDV BITS(0,3) /*!< CK_HXTAL divider previous PLL */
  171. #define RCU_CFG1_PLLPRESEL BIT(30) /*!< PLL clock source preselection */
  172. #define RCU_CFG1_PLLMF5 BIT(31) /*!< bit 5 of PLLMF */
  173. /* RCU_CFG2 */
  174. #define RCU_CFG2_USART0SEL BITS(0,1) /*!< CK_USART0 clock source selection */
  175. #define RCU_CFG2_CECSEL BIT(6) /*!< CK_CEC clock source selection */
  176. #define RCU_CFG2_ADCSEL BIT(8) /*!< CK_ADC clock source selection */
  177. #define RCU_CFG2_IRC28MDIV BIT(16) /*!< CK_IRC28M divider 2 or not */
  178. #define RCU_CFG2_USBFSPSC2 BIT(30) /*!< bit 2 of USBFSPSC */
  179. #define RCU_CFG2_ADCPSC2 BIT(31) /*!< bit 2 of ADCPSC */
  180. /* RCU_CTL1 */
  181. #define RCU_CTL1_IRC28MEN BIT(0) /*!< IRC28M internal 28M RC oscillator enable */
  182. #define RCU_CTL1_IRC28MSTB BIT(1) /*!< IRC28M internal 28M RC oscillator stabilization flag */
  183. #define RCU_CTL1_IRC28MADJ BITS(3,7) /*!< internal 28M RC oscillator clock trim adjust value */
  184. #define RCU_CTL1_IRC28MCALIB BITS(8,15) /*!< internal 28M RC oscillator calibration value register */
  185. /* RCU_ADDCTL */
  186. #define RCU_ADDCTL_CK48MSEL BIT(0) /*!< 48M clock selection */
  187. #define RCU_ADDCTL_IRC48MEN BIT(16) /*!< IRC48M internal 48M RC oscillator enable */
  188. #define RCU_ADDCTL_IRC48MSTB BIT(17) /*!< internal 48M RC oscillator stabilization flag */
  189. #define RCU_ADDCTL_IRC48MCALIB BITS(24,31) /*!< internal 48M RC oscillator calibration value register */
  190. /* RCU_ADDINT */
  191. #define RCU_ADDINT_IRC48MSTBIF BIT(6) /*!< IRC48M stabilization interrupt flag */
  192. #define RCU_ADDINT_IRC48MSTBIE BIT(14) /*!< IRC48M stabilization interrupt enable */
  193. #define RCU_ADDINT_IRC48MSTBIC BIT(22) /*!< IRC48M stabilization interrupt clear */
  194. /* RCU_ADDAPB1EN */
  195. #define RCU_ADDAPB1EN_I2C2EN BIT(0) /*!< I2C2 unit clock enable */
  196. #define RCU_ADDAPB1EN_CTCEN BIT(27) /*!< CTC unit clock enable */
  197. /* RCU_ADDAPB1RST */
  198. #define RCU_ADDAPB1RST_I2C2RST BIT(0) /*!< I2C2 unit reset */
  199. #define RCU_ADDAPB1RST_CTCRST BIT(27) /*!< CTC unit reset */
  200. /* RCU_VKEY */
  201. #define RCU_VKEY_KEY BITS(0,31) /*!< key of RCU_DSV register */
  202. /* RCU_DSV */
  203. #define RCU_DSV_DSLPVS BITS(0,1) /*!< deep-sleep mode voltage select */
  204. /* constants definitions */
  205. /* define the peripheral clock enable bit position and its register index offset */
  206. #define RCU_REGIDX_BIT(regidx, bitpos) (((uint32_t)(regidx)<<6) | (uint32_t)(bitpos))
  207. #define RCU_REG_VAL(periph) (REG32(RCU + ((uint32_t)(periph)>>6)))
  208. #define RCU_BIT_POS(val) ((uint32_t)(val) & 0x1FU)
  209. /* define the voltage key unlock value */
  210. #define RCU_VKEY_UNLOCK ((uint32_t)0x1A2B3C4D)
  211. /* register index */
  212. typedef enum
  213. {
  214. /* peripherals enable */
  215. IDX_AHBEN = 0x14U,
  216. IDX_APB2EN = 0x18U,
  217. IDX_APB1EN = 0x1CU,
  218. IDX_ADDAPB1EN = 0xF8U,
  219. /* peripherals reset */
  220. IDX_AHBRST = 0x28U,
  221. IDX_APB2RST = 0x0CU,
  222. IDX_APB1RST = 0x10U,
  223. IDX_ADDAPB1RST = 0xFCU,
  224. /* clock stabilization */
  225. IDX_CTL0 = 0x00U,
  226. IDX_BDCTL = 0x20U,
  227. IDX_CTL1 = 0x34U,
  228. IDX_ADDCTL = 0xC0U,
  229. /* peripheral reset */
  230. IDX_RSTSCK = 0x24U,
  231. /* clock stabilization and stuck interrupt */
  232. IDX_INT = 0x08U,
  233. IDX_ADDINT = 0xCCU,
  234. /* configuration register */
  235. IDX_CFG0 = 0x04U,
  236. IDX_CFG2 = 0x30U
  237. }reg_idx;
  238. /* peripheral clock enable */
  239. typedef enum
  240. {
  241. /* AHB peripherals */
  242. RCU_DMA = RCU_REGIDX_BIT(IDX_AHBEN, 0U), /*!< DMA clock */
  243. RCU_CRC = RCU_REGIDX_BIT(IDX_AHBEN, 6U), /*!< CRC clock */
  244. RCU_GPIOA = RCU_REGIDX_BIT(IDX_AHBEN, 17U), /*!< GPIOA clock */
  245. RCU_GPIOB = RCU_REGIDX_BIT(IDX_AHBEN, 18U), /*!< GPIOB clock */
  246. RCU_GPIOC = RCU_REGIDX_BIT(IDX_AHBEN, 19U), /*!< GPIOC clock */
  247. RCU_GPIOD = RCU_REGIDX_BIT(IDX_AHBEN, 20U), /*!< GPIOD clock */
  248. RCU_GPIOF = RCU_REGIDX_BIT(IDX_AHBEN, 22U), /*!< GPIOF clock */
  249. RCU_TSI = RCU_REGIDX_BIT(IDX_AHBEN, 24U), /*!< TSI clock */
  250. /* APB2 peripherals */
  251. RCU_CFGCMP = RCU_REGIDX_BIT(IDX_APB2EN, 0U), /*!< CFGCMP clock */
  252. RCU_ADC = RCU_REGIDX_BIT(IDX_APB2EN, 9U), /*!< ADC clock */
  253. RCU_TIMER0 = RCU_REGIDX_BIT(IDX_APB2EN, 11U), /*!< TIMER0 clock */
  254. RCU_SPI0 = RCU_REGIDX_BIT(IDX_APB2EN, 12U), /*!< SPI0 clock */
  255. RCU_USART0 = RCU_REGIDX_BIT(IDX_APB2EN, 14U), /*!< USART0 clock */
  256. RCU_TIMER14 = RCU_REGIDX_BIT(IDX_APB2EN, 16U), /*!< TIMER14 clock */
  257. RCU_TIMER15 = RCU_REGIDX_BIT(IDX_APB2EN, 17U), /*!< TIMER15 clock */
  258. RCU_TIMER16 = RCU_REGIDX_BIT(IDX_APB2EN, 18U), /*!< TIMER16 clock */
  259. /* APB1 peripherals */
  260. RCU_TIMER1 = RCU_REGIDX_BIT(IDX_APB1EN, 0U), /*!< TIMER1 clock */
  261. RCU_TIMER2 = RCU_REGIDX_BIT(IDX_APB1EN, 1U), /*!< TIMER2 clock */
  262. RCU_TIMER13 = RCU_REGIDX_BIT(IDX_APB1EN, 8U), /*!< TIMER13 clock */
  263. RCU_WWDGT = RCU_REGIDX_BIT(IDX_APB1EN, 11U), /*!< WWDGT clock */
  264. RCU_SPI1 = RCU_REGIDX_BIT(IDX_APB1EN, 14U), /*!< SPI1 clock */
  265. RCU_SPI2 = RCU_REGIDX_BIT(IDX_APB1EN, 15U), /*!< SPI2 clock */
  266. RCU_USART1 = RCU_REGIDX_BIT(IDX_APB1EN, 17U), /*!< USART1 clock */
  267. RCU_I2C0 = RCU_REGIDX_BIT(IDX_APB1EN, 21U), /*!< I2C0 clock */
  268. RCU_I2C1 = RCU_REGIDX_BIT(IDX_APB1EN, 22U), /*!< I2C1 clock */
  269. RCU_PMU = RCU_REGIDX_BIT(IDX_APB1EN, 28U), /*!< PMU clock */
  270. #if defined(GD32F350)
  271. RCU_DAC = RCU_REGIDX_BIT(IDX_APB1EN, 29U), /*!< DAC clock */
  272. RCU_CEC = RCU_REGIDX_BIT(IDX_APB1EN, 30U), /*!< CEC clock */
  273. RCU_TIMER5 = RCU_REGIDX_BIT(IDX_APB1EN, 4U), /*!< TIMER5 clock */
  274. RCU_USBFS = RCU_REGIDX_BIT(IDX_AHBEN, 12U), /*!< USBFS clock */
  275. #endif /* GD32F350 */
  276. RCU_RTC = RCU_REGIDX_BIT(IDX_BDCTL, 15U), /*!< RTC clock */
  277. /* RCU_ADDAPB1EN */
  278. RCU_I2C2 = RCU_REGIDX_BIT(IDX_ADDAPB1EN, 0U), /*!< I2C2 clock */
  279. RCU_CTC = RCU_REGIDX_BIT(IDX_ADDAPB1EN, 27U) /*!< CTC clock */
  280. }rcu_periph_enum;
  281. /* peripheral clock enable when sleep mode*/
  282. typedef enum
  283. {
  284. /* AHB peripherals */
  285. RCU_SRAM_SLP = RCU_REGIDX_BIT(IDX_AHBEN, 2U), /*!< SRAM clock */
  286. RCU_FMC_SLP = RCU_REGIDX_BIT(IDX_AHBEN, 4U), /*!< FMC clock */
  287. }rcu_periph_sleep_enum;
  288. /* peripherals reset */
  289. typedef enum
  290. {
  291. /* AHB peripherals reset */
  292. RCU_GPIOARST = RCU_REGIDX_BIT(IDX_AHBRST, 17U), /*!< GPIOA reset */
  293. RCU_GPIOBRST = RCU_REGIDX_BIT(IDX_AHBRST, 18U), /*!< GPIOB reset */
  294. RCU_GPIOCRST = RCU_REGIDX_BIT(IDX_AHBRST, 19U), /*!< GPIOC reset */
  295. RCU_GPIODRST = RCU_REGIDX_BIT(IDX_AHBRST, 20U), /*!< GPIOD reset */
  296. RCU_GPIOFRST = RCU_REGIDX_BIT(IDX_AHBRST, 22U), /*!< GPIOF reset */
  297. RCU_TSIRST = RCU_REGIDX_BIT(IDX_AHBRST, 24U), /*!< TSI reset */
  298. /* APB2 peripherals reset */
  299. RCU_CFGCMPRST = RCU_REGIDX_BIT(IDX_APB2RST, 0U), /*!< CFGCMP reset */
  300. RCU_ADCRST = RCU_REGIDX_BIT(IDX_APB2RST, 9U), /*!< ADC reset */
  301. RCU_TIMER0RST = RCU_REGIDX_BIT(IDX_APB2RST, 11U), /*!< TIMER0 reset */
  302. RCU_SPI0RST = RCU_REGIDX_BIT(IDX_APB2RST, 12U), /*!< SPI0 reset */
  303. RCU_USART0RST = RCU_REGIDX_BIT(IDX_APB2RST, 14U), /*!< USART0 reset */
  304. RCU_TIMER14RST = RCU_REGIDX_BIT(IDX_APB2RST, 16U), /*!< TIMER14 reset */
  305. RCU_TIMER15RST = RCU_REGIDX_BIT(IDX_APB2RST, 17U), /*!< TIMER15 reset */
  306. RCU_TIMER16RST = RCU_REGIDX_BIT(IDX_APB2RST, 18U), /*!< TIMER16 reset */
  307. /* APB1 peripherals reset */
  308. RCU_TIMER1RST = RCU_REGIDX_BIT(IDX_APB1RST, 0U), /*!< TIMER1 reset */
  309. RCU_TIMER2RST = RCU_REGIDX_BIT(IDX_APB1RST, 1U), /*!< TIMER2 reset */
  310. RCU_TIMER13RST = RCU_REGIDX_BIT(IDX_APB1RST, 8U), /*!< TIMER13 reset */
  311. RCU_WWDGTRST = RCU_REGIDX_BIT(IDX_APB1RST, 11U), /*!< WWDGT reset */
  312. RCU_SPI1RST = RCU_REGIDX_BIT(IDX_APB1RST, 14U), /*!< SPI1 reset */
  313. RCU_SPI2RST = RCU_REGIDX_BIT(IDX_APB1RST, 15U), /*!< SPI2 reset */
  314. RCU_USART1RST = RCU_REGIDX_BIT(IDX_APB1RST, 17U), /*!< USART1 reset */
  315. RCU_I2C0RST = RCU_REGIDX_BIT(IDX_APB1RST, 21U), /*!< I2C0 reset */
  316. RCU_I2C1RST = RCU_REGIDX_BIT(IDX_APB1RST, 22U), /*!< I2C1 reset */
  317. RCU_PMURST = RCU_REGIDX_BIT(IDX_APB1RST, 28U), /*!< PMU reset */
  318. #if defined(GD32F350)
  319. RCU_DACRST = RCU_REGIDX_BIT(IDX_APB1RST, 29U), /*!< DAC reset */
  320. RCU_CECRST = RCU_REGIDX_BIT(IDX_APB1RST, 30U), /*!< CEC reset */
  321. RCU_TIMER5RST = RCU_REGIDX_BIT(IDX_APB1RST, 4U), /*!< TIMER5 reset */
  322. RCU_USBFSRST = RCU_REGIDX_BIT(IDX_AHBRST, 12U), /*!< USBFS reset */
  323. #endif /* GD32F350 */
  324. /* RCU_ADDAPB1RST */
  325. RCU_I2C2RST = RCU_REGIDX_BIT(IDX_ADDAPB1RST, 0U), /*!< I2C2 reset */
  326. RCU_CTCRST = RCU_REGIDX_BIT(IDX_ADDAPB1RST, 27U), /*!< CTC reset */
  327. }rcu_periph_reset_enum;
  328. /* clock stabilization and peripheral reset flags */
  329. typedef enum
  330. {
  331. RCU_FLAG_IRC40KSTB = RCU_REGIDX_BIT(IDX_RSTSCK, 1U), /*!< IRC40K stabilization flags */
  332. RCU_FLAG_LXTALSTB = RCU_REGIDX_BIT(IDX_BDCTL, 1U), /*!< LXTAL stabilization flags */
  333. RCU_FLAG_IRC8MSTB = RCU_REGIDX_BIT(IDX_CTL0, 1U), /*!< IRC8M stabilization flags */
  334. RCU_FLAG_HXTALSTB = RCU_REGIDX_BIT(IDX_CTL0, 17U), /*!< HXTAL stabilization flags */
  335. RCU_FLAG_PLLSTB = RCU_REGIDX_BIT(IDX_CTL0, 25U), /*!< PLL stabilization flags */
  336. RCU_FLAG_IRC28MSTB = RCU_REGIDX_BIT(IDX_CTL1, 1U), /*!< IRC28M stabilization flags */
  337. RCU_FLAG_IRC48MSTB = RCU_REGIDX_BIT(IDX_ADDCTL, 17U), /*!< IRC48M stabilization flags */
  338. RCU_FLAG_V12RST = RCU_REGIDX_BIT(IDX_RSTSCK, 23U), /*!< V12 reset flags */
  339. RCU_FLAG_OBLRST = RCU_REGIDX_BIT(IDX_RSTSCK, 25U), /*!< OBL reset flags */
  340. RCU_FLAG_EPRST = RCU_REGIDX_BIT(IDX_RSTSCK, 26U), /*!< EPR reset flags */
  341. RCU_FLAG_PORRST = RCU_REGIDX_BIT(IDX_RSTSCK, 27U), /*!< power reset flags */
  342. RCU_FLAG_SWRST = RCU_REGIDX_BIT(IDX_RSTSCK, 28U), /*!< SW reset flags */
  343. RCU_FLAG_FWDGTRST = RCU_REGIDX_BIT(IDX_RSTSCK, 29U), /*!< FWDGT reset flags */
  344. RCU_FLAG_WWDGTRST = RCU_REGIDX_BIT(IDX_RSTSCK, 30U), /*!< WWDGT reset flags */
  345. RCU_FLAG_LPRST = RCU_REGIDX_BIT(IDX_RSTSCK, 31U) /*!< LP reset flags */
  346. }rcu_flag_enum;
  347. /* clock stabilization and ckm interrupt flags */
  348. typedef enum
  349. {
  350. RCU_INT_FLAG_IRC40KSTB = RCU_REGIDX_BIT(IDX_INT, 0U), /*!< IRC40K stabilization interrupt flag */
  351. RCU_INT_FLAG_LXTALSTB = RCU_REGIDX_BIT(IDX_INT, 1U), /*!< LXTAL stabilization interrupt flag */
  352. RCU_INT_FLAG_IRC8MSTB = RCU_REGIDX_BIT(IDX_INT, 2U), /*!< IRC8M stabilization interrupt flag */
  353. RCU_INT_FLAG_HXTALSTB = RCU_REGIDX_BIT(IDX_INT, 3U), /*!< HXTAL stabilization interrupt flag */
  354. RCU_INT_FLAG_PLLSTB = RCU_REGIDX_BIT(IDX_INT, 4U), /*!< PLL stabilization interrupt flag */
  355. RCU_INT_FLAG_IRC28MSTB = RCU_REGIDX_BIT(IDX_INT, 5U), /*!< IRC28M stabilization interrupt flag */
  356. RCU_INT_FLAG_CKM = RCU_REGIDX_BIT(IDX_INT, 7U), /*!< CKM interrupt flag */
  357. RCU_INT_FLAG_IRC48MSTB = RCU_REGIDX_BIT(IDX_ADDCTL, 6U) /*!< IRC48M stabilization interrupt flag */
  358. }rcu_int_flag_enum;
  359. /* clock stabilization and stuck interrupt flags clear */
  360. typedef enum
  361. {
  362. RCU_INT_FLAG_IRC40KSTB_CLR = RCU_REGIDX_BIT(IDX_INT, 16U), /*!< IRC40K stabilization interrupt flags clear */
  363. RCU_INT_FLAG_LXTALSTB_CLR = RCU_REGIDX_BIT(IDX_INT, 17U), /*!< LXTAL stabilization interrupt flags clear */
  364. RCU_INT_FLAG_IRC8MSTB_CLR = RCU_REGIDX_BIT(IDX_INT, 18U), /*!< IRC8M stabilization interrupt flags clear */
  365. RCU_INT_FLAG_HXTALSTB_CLR = RCU_REGIDX_BIT(IDX_INT, 19U), /*!< HXTAL stabilization interrupt flags clear */
  366. RCU_INT_FLAG_PLLSTB_CLR = RCU_REGIDX_BIT(IDX_INT, 20U), /*!< PLL stabilization interrupt flags clear */
  367. RCU_INT_FLAG_IRC28MSTB_CLR = RCU_REGIDX_BIT(IDX_INT, 21U), /*!< IRC28M stabilization interrupt flags clear */
  368. RCU_INT_FLAG_CKM_CLR = RCU_REGIDX_BIT(IDX_INT, 23U), /*!< CKM interrupt flags clear */
  369. RCU_INT_FLAG_IRC48MSTB_CLR = RCU_REGIDX_BIT(IDX_ADDCTL, 22U) /*!< IRC48M stabilization interrupt flag clear */
  370. }rcu_int_flag_clear_enum;
  371. /* clock stabilization interrupt enable or disable */
  372. typedef enum
  373. {
  374. RCU_INT_IRC40KSTB = RCU_REGIDX_BIT(IDX_INT, 8U), /*!< IRC40K stabilization interrupt */
  375. RCU_INT_LXTALSTB = RCU_REGIDX_BIT(IDX_INT, 9U), /*!< LXTAL stabilization interrupt */
  376. RCU_INT_IRC8MSTB = RCU_REGIDX_BIT(IDX_INT, 10U), /*!< IRC8M stabilization interrupt */
  377. RCU_INT_HXTALSTB = RCU_REGIDX_BIT(IDX_INT, 11U), /*!< HXTAL stabilization interrupt */
  378. RCU_INT_PLLSTB = RCU_REGIDX_BIT(IDX_INT, 12U), /*!< PLL stabilization interrupt */
  379. RCU_INT_IRC28MSTB = RCU_REGIDX_BIT(IDX_INT, 13U), /*!< IRC28M stabilization interrupt */
  380. RCU_INT_IRC48MSTB = RCU_REGIDX_BIT(IDX_ADDINT, 14U) /*!< IRC48M stabilization interrupt */
  381. }rcu_int_enum;
  382. /* ADC clock source */
  383. typedef enum
  384. {
  385. RCU_ADCCK_IRC28M_DIV2 = 0U, /*!< ADC clock source select IRC28M/2 */
  386. RCU_ADCCK_IRC28M, /*!< ADC clock source select IRC28M */
  387. RCU_ADCCK_APB2_DIV2, /*!< ADC clock source select APB2/2 */
  388. RCU_ADCCK_APB2_DIV3, /*!< ADC clock source select APB2/3 */
  389. RCU_ADCCK_APB2_DIV4, /*!< ADC clock source select APB2/4 */
  390. RCU_ADCCK_APB2_DIV5, /*!< ADC clock source select APB2/5 */
  391. RCU_ADCCK_APB2_DIV6, /*!< ADC clock source select APB2/6 */
  392. RCU_ADCCK_APB2_DIV7, /*!< ADC clock source select APB2/7 */
  393. RCU_ADCCK_APB2_DIV8, /*!< ADC clock source select APB2/8 */
  394. RCU_ADCCK_APB2_DIV9 /*!< ADC clock source select APB2/9 */
  395. }rcu_adc_clock_enum;
  396. /* oscillator types */
  397. typedef enum
  398. {
  399. RCU_HXTAL = RCU_REGIDX_BIT(IDX_CTL0, 16U), /*!< HXTAL */
  400. RCU_LXTAL = RCU_REGIDX_BIT(IDX_BDCTL, 0U), /*!< LXTAL */
  401. RCU_IRC8M = RCU_REGIDX_BIT(IDX_CTL0, 0U), /*!< IRC8M */
  402. RCU_IRC28M = RCU_REGIDX_BIT(IDX_CTL1, 0U), /*!< IRC28M */
  403. RCU_IRC48M = RCU_REGIDX_BIT(IDX_ADDCTL, 16U), /*!< IRC48M */
  404. RCU_IRC40K = RCU_REGIDX_BIT(IDX_RSTSCK, 0U), /*!< IRC40K */
  405. RCU_PLL_CK = RCU_REGIDX_BIT(IDX_CTL0, 24U) /*!< PLL */
  406. }rcu_osci_type_enum;
  407. /* rcu clock frequency */
  408. typedef enum
  409. {
  410. CK_SYS = 0U, /*!< system clock */
  411. CK_AHB, /*!< AHB clock */
  412. CK_APB1, /*!< APB1 clock */
  413. CK_APB2, /*!< APB2 clock */
  414. CK_ADC, /*!< ADC clock */
  415. CK_CEC, /*!< CEC clock */
  416. CK_USART /*!< USART clock */
  417. }rcu_clock_freq_enum;
  418. /* system clock source select */
  419. #define CFG0_SCS(regval) (BITS(0,1) & ((uint32_t)(regval) << 0))
  420. #define RCU_CKSYSSRC_IRC8M CFG0_SCS(0) /*!< system clock source select IRC8M */
  421. #define RCU_CKSYSSRC_HXTAL CFG0_SCS(1) /*!< system clock source select HXTAL */
  422. #define RCU_CKSYSSRC_PLL CFG0_SCS(2) /*!< system clock source select PLL */
  423. /* system clock source select status */
  424. #define CFG0_SCSS(regval) (BITS(2,3) & ((uint32_t)(regval) << 2))
  425. #define RCU_SCSS_IRC8M CFG0_SCSS(0) /*!< system clock source select IRC8M */
  426. #define RCU_SCSS_HXTAL CFG0_SCSS(1) /*!< system clock source select HXTAL */
  427. #define RCU_SCSS_PLL CFG0_SCSS(2) /*!< system clock source select PLL */
  428. /* AHB prescaler selection */
  429. #define CFG0_AHBPSC(regval) (BITS(4,7) & ((uint32_t)(regval) << 4))
  430. #define RCU_AHB_CKSYS_DIV1 CFG0_AHBPSC(0) /*!< AHB prescaler select CK_SYS */
  431. #define RCU_AHB_CKSYS_DIV2 CFG0_AHBPSC(8) /*!< AHB prescaler select CK_SYS/2 */
  432. #define RCU_AHB_CKSYS_DIV4 CFG0_AHBPSC(9) /*!< AHB prescaler select CK_SYS/4 */
  433. #define RCU_AHB_CKSYS_DIV8 CFG0_AHBPSC(10) /*!< AHB prescaler select CK_SYS/8 */
  434. #define RCU_AHB_CKSYS_DIV16 CFG0_AHBPSC(11) /*!< AHB prescaler select CK_SYS/16 */
  435. #define RCU_AHB_CKSYS_DIV64 CFG0_AHBPSC(12) /*!< AHB prescaler select CK_SYS/64 */
  436. #define RCU_AHB_CKSYS_DIV128 CFG0_AHBPSC(13) /*!< AHB prescaler select CK_SYS/128 */
  437. #define RCU_AHB_CKSYS_DIV256 CFG0_AHBPSC(14) /*!< AHB prescaler select CK_SYS/256 */
  438. #define RCU_AHB_CKSYS_DIV512 CFG0_AHBPSC(15) /*!< AHB prescaler select CK_SYS/512 */
  439. /* APB1 prescaler selection */
  440. #define CFG0_APB1PSC(regval) (BITS(8,10) & ((uint32_t)(regval) << 8))
  441. #define RCU_APB1_CKAHB_DIV1 CFG0_APB1PSC(0) /*!< APB1 prescaler select CK_AHB */
  442. #define RCU_APB1_CKAHB_DIV2 CFG0_APB1PSC(4) /*!< APB1 prescaler select CK_AHB/2 */
  443. #define RCU_APB1_CKAHB_DIV4 CFG0_APB1PSC(5) /*!< APB1 prescaler select CK_AHB/4 */
  444. #define RCU_APB1_CKAHB_DIV8 CFG0_APB1PSC(6) /*!< APB1 prescaler select CK_AHB/8 */
  445. #define RCU_APB1_CKAHB_DIV16 CFG0_APB1PSC(7) /*!< APB1 prescaler select CK_AHB/16 */
  446. /* APB2 prescaler selection */
  447. #define CFG0_APB2PSC(regval) (BITS(11,13) & ((uint32_t)(regval) << 11))
  448. #define RCU_APB2_CKAHB_DIV1 CFG0_APB2PSC(0) /*!< APB2 prescaler select CK_AHB */
  449. #define RCU_APB2_CKAHB_DIV2 CFG0_APB2PSC(4) /*!< APB2 prescaler select CK_AHB/2 */
  450. #define RCU_APB2_CKAHB_DIV4 CFG0_APB2PSC(5) /*!< APB2 prescaler select CK_AHB/4 */
  451. #define RCU_APB2_CKAHB_DIV8 CFG0_APB2PSC(6) /*!< APB2 prescaler select CK_AHB/8 */
  452. #define RCU_APB2_CKAHB_DIV16 CFG0_APB2PSC(7) /*!< APB2 prescaler select CK_AHB/16 */
  453. /* ADC clock prescaler selection */
  454. #define CFG0_ADCPSC(regval) (BITS(14,15) & ((uint32_t)(regval) << 14))
  455. #define RCU_ADC_CKAPB2_DIV2 CFG0_ADCPSC(0) /*!< ADC clock prescaler select CK_APB2/2 */
  456. #define RCU_ADC_CKAPB2_DIV4 CFG0_ADCPSC(1) /*!< ADC clock prescaler select CK_APB2/4 */
  457. #define RCU_ADC_CKAPB2_DIV6 CFG0_ADCPSC(2) /*!< ADC clock prescaler select CK_APB2/6 */
  458. #define RCU_ADC_CKAPB2_DIV8 CFG0_ADCPSC(3) /*!< ADC clock prescaler select CK_APB2/8 */
  459. /* PLL clock source selection */
  460. #define RCU_PLLSRC_IRC8M_DIV2 (uint32_t)0x00000000U /*!< PLL clock source select IRC8M/2 */
  461. #define RCU_PLLSRC_HXTAL_IRC48M RCU_CFG0_PLLSEL /*!< PLL clock source select HXTAL or IRC48M*/
  462. /* PLL clock source preselection */
  463. #define RCU_PLLPRESEL_HXTAL (uint32_t)0x00000000U /*!< PLL clock source preselection HXTAL */
  464. #define RCU_PLLPRESEL_IRC48M RCU_CFG1_PLLPRESEL /*!< PLL clock source preselection IRC48M */
  465. /* HXTAL or IRC48M divider for PLL source clock selection */
  466. #define RCU_PLLPREDV (uint32_t)0x00000000U /*!< HXTAL or IRC48M clock selected */
  467. #define RCU_PLLPREDV_DIV2 RCU_CFG0_PLLPREDV /*!< (HXTAL or IRC48M) /2 clock selected */
  468. /* PLL multiply factor */
  469. #define CFG0_PLLMF(regval) (BITS(18,21) & ((uint32_t)(regval) << 18))
  470. #define RCU_PLL_MUL2 CFG0_PLLMF(0) /*!< PLL source clock multiply by 2 */
  471. #define RCU_PLL_MUL3 CFG0_PLLMF(1) /*!< PLL source clock multiply by 3 */
  472. #define RCU_PLL_MUL4 CFG0_PLLMF(2) /*!< PLL source clock multiply by 4 */
  473. #define RCU_PLL_MUL5 CFG0_PLLMF(3) /*!< PLL source clock multiply by 5 */
  474. #define RCU_PLL_MUL6 CFG0_PLLMF(4) /*!< PLL source clock multiply by 6 */
  475. #define RCU_PLL_MUL7 CFG0_PLLMF(5) /*!< PLL source clock multiply by 7 */
  476. #define RCU_PLL_MUL8 CFG0_PLLMF(6) /*!< PLL source clock multiply by 8 */
  477. #define RCU_PLL_MUL9 CFG0_PLLMF(7) /*!< PLL source clock multiply by 9 */
  478. #define RCU_PLL_MUL10 CFG0_PLLMF(8) /*!< PLL source clock multiply by 10 */
  479. #define RCU_PLL_MUL11 CFG0_PLLMF(9) /*!< PLL source clock multiply by 11 */
  480. #define RCU_PLL_MUL12 CFG0_PLLMF(10) /*!< PLL source clock multiply by 12 */
  481. #define RCU_PLL_MUL13 CFG0_PLLMF(11) /*!< PLL source clock multiply by 13 */
  482. #define RCU_PLL_MUL14 CFG0_PLLMF(12) /*!< PLL source clock multiply by 14 */
  483. #define RCU_PLL_MUL15 CFG0_PLLMF(13) /*!< PLL source clock multiply by 15 */
  484. #define RCU_PLL_MUL16 CFG0_PLLMF(14) /*!< PLL source clock multiply by 16 */
  485. #define RCU_PLL_MUL17 (RCU_CFG0_PLLMF4 | CFG0_PLLMF(0)) /*!< PLL source clock multiply by 17 */
  486. #define RCU_PLL_MUL18 (RCU_CFG0_PLLMF4 | CFG0_PLLMF(1)) /*!< PLL source clock multiply by 18 */
  487. #define RCU_PLL_MUL19 (RCU_CFG0_PLLMF4 | CFG0_PLLMF(2)) /*!< PLL source clock multiply by 19 */
  488. #define RCU_PLL_MUL20 (RCU_CFG0_PLLMF4 | CFG0_PLLMF(3)) /*!< PLL source clock multiply by 20 */
  489. #define RCU_PLL_MUL21 (RCU_CFG0_PLLMF4 | CFG0_PLLMF(4)) /*!< PLL source clock multiply by 21 */
  490. #define RCU_PLL_MUL22 (RCU_CFG0_PLLMF4 | CFG0_PLLMF(5)) /*!< PLL source clock multiply by 22 */
  491. #define RCU_PLL_MUL23 (RCU_CFG0_PLLMF4 | CFG0_PLLMF(6)) /*!< PLL source clock multiply by 23 */
  492. #define RCU_PLL_MUL24 (RCU_CFG0_PLLMF4 | CFG0_PLLMF(7)) /*!< PLL source clock multiply by 24 */
  493. #define RCU_PLL_MUL25 (RCU_CFG0_PLLMF4 | CFG0_PLLMF(8)) /*!< PLL source clock multiply by 25 */
  494. #define RCU_PLL_MUL26 (RCU_CFG0_PLLMF4 | CFG0_PLLMF(9)) /*!< PLL source clock multiply by 26 */
  495. #define RCU_PLL_MUL27 (RCU_CFG0_PLLMF4 | CFG0_PLLMF(10)) /*!< PLL source clock multiply by 27 */
  496. #define RCU_PLL_MUL28 (RCU_CFG0_PLLMF4 | CFG0_PLLMF(11)) /*!< PLL source clock multiply by 28 */
  497. #define RCU_PLL_MUL29 (RCU_CFG0_PLLMF4 | CFG0_PLLMF(12)) /*!< PLL source clock multiply by 29 */
  498. #define RCU_PLL_MUL30 (RCU_CFG0_PLLMF4 | CFG0_PLLMF(13)) /*!< PLL source clock multiply by 30 */
  499. #define RCU_PLL_MUL31 (RCU_CFG0_PLLMF4 | CFG0_PLLMF(14)) /*!< PLL source clock multiply by 31 */
  500. #define RCU_PLL_MUL32 (RCU_CFG0_PLLMF4 | CFG0_PLLMF(15)) /*!< PLL source clock multiply by 32 */
  501. #define RCU_PLL_MUL33 (CFG0_PLLMF(0) | RCU_CFG1_PLLMF5) /*!< PLL source clock multiply by 33 */
  502. #define RCU_PLL_MUL34 (CFG0_PLLMF(1) | RCU_CFG1_PLLMF5) /*!< PLL source clock multiply by 34 */
  503. #define RCU_PLL_MUL35 (CFG0_PLLMF(2) | RCU_CFG1_PLLMF5) /*!< PLL source clock multiply by 35 */
  504. #define RCU_PLL_MUL36 (CFG0_PLLMF(3) | RCU_CFG1_PLLMF5) /*!< PLL source clock multiply by 36 */
  505. #define RCU_PLL_MUL37 (CFG0_PLLMF(4) | RCU_CFG1_PLLMF5) /*!< PLL source clock multiply by 37 */
  506. #define RCU_PLL_MUL38 (CFG0_PLLMF(5) | RCU_CFG1_PLLMF5) /*!< PLL source clock multiply by 38 */
  507. #define RCU_PLL_MUL39 (CFG0_PLLMF(6) | RCU_CFG1_PLLMF5) /*!< PLL source clock multiply by 39 */
  508. #define RCU_PLL_MUL40 (CFG0_PLLMF(7) | RCU_CFG1_PLLMF5) /*!< PLL source clock multiply by 40 */
  509. #define RCU_PLL_MUL41 (CFG0_PLLMF(8) | RCU_CFG1_PLLMF5) /*!< PLL source clock multiply by 41 */
  510. #define RCU_PLL_MUL42 (CFG0_PLLMF(9) | RCU_CFG1_PLLMF5) /*!< PLL source clock multiply by 42 */
  511. #define RCU_PLL_MUL43 (CFG0_PLLMF(10) | RCU_CFG1_PLLMF5) /*!< PLL source clock multiply by 43 */
  512. #define RCU_PLL_MUL44 (CFG0_PLLMF(11) | RCU_CFG1_PLLMF5) /*!< PLL source clock multiply by 44 */
  513. #define RCU_PLL_MUL45 (CFG0_PLLMF(12) | RCU_CFG1_PLLMF5) /*!< PLL source clock multiply by 45 */
  514. #define RCU_PLL_MUL46 (CFG0_PLLMF(13) | RCU_CFG1_PLLMF5) /*!< PLL source clock multiply by 46 */
  515. #define RCU_PLL_MUL47 (CFG0_PLLMF(14) | RCU_CFG1_PLLMF5) /*!< PLL source clock multiply by 47 */
  516. #define RCU_PLL_MUL48 (CFG0_PLLMF(15) | RCU_CFG1_PLLMF5) /*!< PLL source clock multiply by 48 */
  517. #define RCU_PLL_MUL49 (RCU_CFG0_PLLMF4 | RCU_CFG1_PLLMF5) /*!< PLL source clock multiply by 49 */
  518. #define RCU_PLL_MUL50 (RCU_PLL_MUL18 | RCU_CFG1_PLLMF5) /*!< PLL source clock multiply by 50 */
  519. #define RCU_PLL_MUL51 (RCU_PLL_MUL19 | RCU_CFG1_PLLMF5) /*!< PLL source clock multiply by 51 */
  520. #define RCU_PLL_MUL52 (RCU_PLL_MUL20 | RCU_CFG1_PLLMF5) /*!< PLL source clock multiply by 52 */
  521. #define RCU_PLL_MUL53 (RCU_PLL_MUL21 | RCU_CFG1_PLLMF5) /*!< PLL source clock multiply by 53 */
  522. #define RCU_PLL_MUL54 (RCU_PLL_MUL22 | RCU_CFG1_PLLMF5) /*!< PLL source clock multiply by 54 */
  523. #define RCU_PLL_MUL55 (RCU_PLL_MUL23 | RCU_CFG1_PLLMF5) /*!< PLL source clock multiply by 55 */
  524. #define RCU_PLL_MUL56 (RCU_PLL_MUL24 | RCU_CFG1_PLLMF5) /*!< PLL source clock multiply by 56 */
  525. #define RCU_PLL_MUL57 (RCU_PLL_MUL25 | RCU_CFG1_PLLMF5) /*!< PLL source clock multiply by 57 */
  526. #define RCU_PLL_MUL58 (RCU_PLL_MUL26 | RCU_CFG1_PLLMF5) /*!< PLL source clock multiply by 58 */
  527. #define RCU_PLL_MUL59 (RCU_PLL_MUL27 | RCU_CFG1_PLLMF5) /*!< PLL source clock multiply by 59 */
  528. #define RCU_PLL_MUL60 (RCU_PLL_MUL28 | RCU_CFG1_PLLMF5) /*!< PLL source clock multiply by 60 */
  529. #define RCU_PLL_MUL61 (RCU_PLL_MUL29 | RCU_CFG1_PLLMF5) /*!< PLL source clock multiply by 61 */
  530. #define RCU_PLL_MUL62 (RCU_PLL_MUL30 | RCU_CFG1_PLLMF5) /*!< PLL source clock multiply by 62 */
  531. #define RCU_PLL_MUL63 (RCU_PLL_MUL31 | RCU_CFG1_PLLMF5) /*!< PLL source clock multiply by 63 */
  532. #define RCU_PLL_MUL64 (RCU_PLL_MUL32 | RCU_CFG1_PLLMF5) /*!< PLL source clock multiply by 64 */
  533. /* USBFS clock prescaler selection */
  534. #define CFG0_USBFSPSC(regval) (BITS(22,23) & ((uint32_t)(regval) << 22))
  535. #define RCU_USBFS_CKPLL_DIV1_5 CFG0_USBFSPSC(0) /*!< USBFS clock prescaler select CK_PLL/1.5 */
  536. #define RCU_USBFS_CKPLL_DIV1 CFG0_USBFSPSC(1) /*!< USBFS clock prescaler select CK_PLL */
  537. #define RCU_USBFS_CKPLL_DIV2_5 CFG0_USBFSPSC(2) /*!< USBFS clock prescaler select CK_PLL/2.5 */
  538. #define RCU_USBFS_CKPLL_DIV2 CFG0_USBFSPSC(3) /*!< USBFS clock prescaler select CK_PLL/2 */
  539. #define RCU_USBFS_CKPLL_DIV3 RCU_CFG2_USBFSPSC2 /*!< USBFS clock prescaler select CK_PLL/3 */
  540. #define RCU_USBFS_CKPLL_DIV3_5 (CFG0_USBFSPSC(1)|RCU_CFG2_USBFSPSC2) /*!< USBFS clock prescaler select CK_PLL/3.5 */
  541. /* CK_OUT clock source selection */
  542. #define CFG0_CKOUTSEL(regval) (BITS(24,26) & ((uint32_t)(regval) << 24))
  543. #define RCU_CKOUTSRC_NONE CFG0_CKOUTSEL(0) /*!< no clock selected */
  544. #define RCU_CKOUTSRC_IRC28M CFG0_CKOUTSEL(1) /*!< CK_OUT clock source select IRC28M */
  545. #define RCU_CKOUTSRC_IRC40K CFG0_CKOUTSEL(2) /*!< CK_OUT clock source select IRC40K */
  546. #define RCU_CKOUTSRC_LXTAL CFG0_CKOUTSEL(3) /*!< CK_OUT clock source select LXTAL */
  547. #define RCU_CKOUTSRC_CKSYS CFG0_CKOUTSEL(4) /*!< CK_OUT clock source select CKSYS */
  548. #define RCU_CKOUTSRC_IRC8M CFG0_CKOUTSEL(5) /*!< CK_OUT clock source select IRC8M */
  549. #define RCU_CKOUTSRC_HXTAL CFG0_CKOUTSEL(6) /*!< CK_OUT clock source select HXTAL */
  550. #define RCU_CKOUTSRC_CKPLL_DIV1 (RCU_CFG0_PLLDV | CFG0_CKOUTSEL(7)) /*!< CK_OUT clock source select CK_PLL */
  551. #define RCU_CKOUTSRC_CKPLL_DIV2 CFG0_CKOUTSEL(7) /*!< CK_OUT clock source select CK_PLL/2 */
  552. /* CK_OUT divider */
  553. #define CFG0_CKOUTDIV(regval) (BITS(28,30) & ((uint32_t)(regval) << 28))
  554. #define RCU_CKOUT_DIV1 CFG0_CKOUTDIV(0) /*!< CK_OUT is divided by 1 */
  555. #define RCU_CKOUT_DIV2 CFG0_CKOUTDIV(1) /*!< CK_OUT is divided by 2 */
  556. #define RCU_CKOUT_DIV4 CFG0_CKOUTDIV(2) /*!< CK_OUT is divided by 4 */
  557. #define RCU_CKOUT_DIV8 CFG0_CKOUTDIV(3) /*!< CK_OUT is divided by 8 */
  558. #define RCU_CKOUT_DIV16 CFG0_CKOUTDIV(4) /*!< CK_OUT is divided by 16 */
  559. #define RCU_CKOUT_DIV32 CFG0_CKOUTDIV(5) /*!< CK_OUT is divided by 32 */
  560. #define RCU_CKOUT_DIV64 CFG0_CKOUTDIV(6) /*!< CK_OUT is divided by 64 */
  561. #define RCU_CKOUT_DIV128 CFG0_CKOUTDIV(7) /*!< CK_OUT is divided by 128 */
  562. /* CK_PLL divide by 1 or 2 for CK_OUT */
  563. #define RCU_PLLDV_CKPLL_DIV2 (uint32_t)0x00000000U /*!< CK_PLL divide by 2 for CK_OUT */
  564. #define RCU_PLLDV_CKPLL RCU_CFG0_PLLDV /*!< CK_PLL divide by 1 for CK_OUT */
  565. /* LXTAL drive capability */
  566. #define BDCTL_LXTALDRI(regval) (BITS(3,4) & ((uint32_t)(regval) << 3))
  567. #define RCU_LXTAL_LOWDRI BDCTL_LXTALDRI(0) /*!< lower driving capability */
  568. #define RCU_LXTAL_MED_LOWDRI BDCTL_LXTALDRI(1) /*!< medium low driving capability */
  569. #define RCU_LXTAL_MED_HIGHDRI BDCTL_LXTALDRI(2) /*!< medium high driving capability */
  570. #define RCU_LXTAL_HIGHDRI BDCTL_LXTALDRI(3) /*!< higher driving capability */
  571. /* RTC clock entry selection */
  572. #define BDCTL_RTCSRC(regval) (BITS(8,9) & ((uint32_t)(regval) << 8))
  573. #define RCU_RTCSRC_NONE BDCTL_RTCSRC(0) /*!< no clock selected */
  574. #define RCU_RTCSRC_LXTAL BDCTL_RTCSRC(1) /*!< LXTAL selected as RTC source clock */
  575. #define RCU_RTCSRC_IRC40K BDCTL_RTCSRC(2) /*!< IRC40K selected as RTC source clock */
  576. #define RCU_RTCSRC_HXTAL_DIV32 BDCTL_RTCSRC(3) /*!< HXTAL/32 selected as RTC source clock */
  577. /* CK_HXTAL divider previous PLL */
  578. #define CFG1_PREDV(regval) (BITS(0,3) & ((uint32_t)(regval) << 0))
  579. #define RCU_PLL_PREDV1 CFG1_PREDV(0) /*!< PLL not divided */
  580. #define RCU_PLL_PREDV2 CFG1_PREDV(1) /*!< PLL divided by 2 */
  581. #define RCU_PLL_PREDV3 CFG1_PREDV(2) /*!< PLL divided by 3 */
  582. #define RCU_PLL_PREDV4 CFG1_PREDV(3) /*!< PLL divided by 4 */
  583. #define RCU_PLL_PREDV5 CFG1_PREDV(4) /*!< PLL divided by 5 */
  584. #define RCU_PLL_PREDV6 CFG1_PREDV(5) /*!< PLL divided by 6 */
  585. #define RCU_PLL_PREDV7 CFG1_PREDV(6) /*!< PLL divided by 7 */
  586. #define RCU_PLL_PREDV8 CFG1_PREDV(7) /*!< PLL divided by 8 */
  587. #define RCU_PLL_PREDV9 CFG1_PREDV(8) /*!< PLL divided by 9 */
  588. #define RCU_PLL_PREDV10 CFG1_PREDV(9) /*!< PLL divided by 10 */
  589. #define RCU_PLL_PREDV11 CFG1_PREDV(10) /*!< PLL divided by 11 */
  590. #define RCU_PLL_PREDV12 CFG1_PREDV(11) /*!< PLL divided by 12 */
  591. #define RCU_PLL_PREDV13 CFG1_PREDV(12) /*!< PLL divided by 13 */
  592. #define RCU_PLL_PREDV14 CFG1_PREDV(13) /*!< PLL divided by 14 */
  593. #define RCU_PLL_PREDV15 CFG1_PREDV(14) /*!< PLL divided by 15 */
  594. #define RCU_PLL_PREDV16 CFG1_PREDV(15) /*!< PLL divided by 16 */
  595. /* USART0 clock source selection */
  596. #define CFG2_USART0SEL(regval) (BITS(0,1) & ((uint32_t)(regval) << 0))
  597. #define RCU_USART0SRC_CKAPB2 CFG2_USART0SEL(0) /*!< CK_USART0 select CK_APB2 */
  598. #define RCU_USART0SRC_CKSYS CFG2_USART0SEL(1) /*!< CK_USART0 select CK_SYS */
  599. #define RCU_USART0SRC_LXTAL CFG2_USART0SEL(2) /*!< CK_USART0 select LXTAL */
  600. #define RCU_USART0SRC_IRC8M CFG2_USART0SEL(3) /*!< CK_USART0 select IRC8M */
  601. /* CEC clock source selection */
  602. #define RCU_CECSRC_IRC8M_DIV244 (uint32_t)0x00000000U /*!< CK_CEC clock source select IRC8M/244 */
  603. #define RCU_CECSRC_LXTAL RCU_CFG2_CECSEL /*!< CK_CEC clock source select LXTAL */
  604. /* ADC clock source selection */
  605. #define RCU_ADCSRC_IRC28M (uint32_t)0x00000000U /*!< ADC clock source select */
  606. #define RCU_ADCSRC_APB2DIV RCU_CFG2_ADCSEL /*!< ADC clock source select */
  607. /* IRC28M clock divider for ADC */
  608. #define RCU_ADC_IRC28M_DIV2 (uint32_t)0x00000000U /*!< IRC28M/2 select to ADC clock */
  609. #define RCU_ADC_IRC28M_DIV1 RCU_CFG2_IRC28MDIV /*!< IRC28M select to ADC clock */
  610. /* CK48M clock source selection */
  611. #define RCU_CK48MSRC_PLL48M ((uint32_t)0x00000000U) /*!< CK48M source clock select PLL48M */
  612. #define RCU_CK48MSRC_IRC48M RCU_ADDCTL_CK48MSEL /*!< CK48M source clock select IRC48M */
  613. /* Deep-sleep mode voltage */
  614. #define DSV_DSLPVS(regval) (BITS(0,1) & ((uint32_t)(regval) << 0))
  615. #define RCU_DEEPSLEEP_V_1_0 DSV_DSLPVS(0) /*!< core voltage is 1.0V in deep-sleep mode */
  616. #define RCU_DEEPSLEEP_V_0_9 DSV_DSLPVS(1) /*!< core voltage is 0.9V in deep-sleep mode */
  617. #define RCU_DEEPSLEEP_V_0_8 DSV_DSLPVS(2) /*!< core voltage is 0.8V in deep-sleep mode */
  618. #define RCU_DEEPSLEEP_V_0_7 DSV_DSLPVS(3) /*!< core voltage is 0.7V in deep-sleep mode */
  619. /* function declarations */
  620. /* deinitialize the RCU */
  621. void rcu_deinit(void);
  622. /* enable the peripherals clock */
  623. void rcu_periph_clock_enable(rcu_periph_enum periph);
  624. /* disable the peripherals clock */
  625. void rcu_periph_clock_disable(rcu_periph_enum periph);
  626. /* enable the peripherals clock when sleep mode */
  627. void rcu_periph_clock_sleep_enable(rcu_periph_sleep_enum periph);
  628. /* disable the peripherals clock when sleep mode */
  629. void rcu_periph_clock_sleep_disable(rcu_periph_sleep_enum periph);
  630. /* reset the peripherals */
  631. void rcu_periph_reset_enable(rcu_periph_reset_enum periph_reset);
  632. /* disable reset the peripheral */
  633. void rcu_periph_reset_disable(rcu_periph_reset_enum periph_reset);
  634. /* reset the BKP */
  635. void rcu_bkp_reset_enable(void);
  636. /* disable the BKP reset */
  637. void rcu_bkp_reset_disable(void);
  638. /* configure the system clock source */
  639. void rcu_system_clock_source_config(uint32_t ck_sys);
  640. /* get the system clock source */
  641. uint32_t rcu_system_clock_source_get(void);
  642. /* configure the AHB prescaler selection */
  643. void rcu_ahb_clock_config(uint32_t ck_ahb);
  644. /* configure the APB1 prescaler selection */
  645. void rcu_apb1_clock_config(uint32_t ck_apb1);
  646. /* configure the APB2 prescaler selection */
  647. void rcu_apb2_clock_config(uint32_t ck_apb2);
  648. /* configure the ADC clock source and prescaler selection */
  649. void rcu_adc_clock_config(rcu_adc_clock_enum ck_adc);
  650. /* configure the USBFS prescaler selection */
  651. void rcu_usbfs_clock_config(uint32_t ck_usbfs);
  652. /* configure the CK_OUT clock source and divider */
  653. void rcu_ckout_config(uint32_t ckout_src, uint32_t ckout_div);
  654. /* configure the PLL clock source preselection */
  655. void rcu_pll_preselection_config(uint32_t pll_presel);
  656. /* configure the PLL clock source selection and PLL multiply factor */
  657. void rcu_pll_config(uint32_t pll_src, uint32_t pll_mul);
  658. /* configure the USART clock source selection */
  659. void rcu_usart_clock_config(uint32_t ck_usart);
  660. /* configure the CEC clock source selection */
  661. void rcu_cec_clock_config(uint32_t ck_cec);
  662. /* configure the RTC clock source selection */
  663. void rcu_rtc_clock_config(uint32_t rtc_clock_source);
  664. /* configure the CK48M clock selection */
  665. void rcu_ck48m_clock_config(uint32_t ck48m_clock_source);
  666. /* configure the HXTAL divider used as input of PLL */
  667. void rcu_hxtal_prediv_config(uint32_t hxtal_prediv);
  668. /* configure the LXTAL drive capability */
  669. void rcu_lxtal_drive_capability_config(uint32_t lxtal_dricap);
  670. /* get the clock stabilization and periphral reset flags */
  671. FlagStatus rcu_flag_get(rcu_flag_enum flag);
  672. /* clear the reset flag */
  673. void rcu_all_reset_flag_clear(void);
  674. /* get the clock stabilization interrupt and ckm flags */
  675. FlagStatus rcu_interrupt_flag_get(rcu_int_flag_enum int_flag);
  676. /* clear the interrupt flags */
  677. void rcu_interrupt_flag_clear(rcu_int_flag_clear_enum int_flag_clear);
  678. /* enable the stabilization interrupt */
  679. void rcu_interrupt_enable(rcu_int_enum stab_int);
  680. /* disable the stabilization interrupt */
  681. void rcu_interrupt_disable(rcu_int_enum stab_int);
  682. /* wait until oscillator stabilization flags is SET */
  683. ErrStatus rcu_osci_stab_wait(rcu_osci_type_enum osci);
  684. /* turn on the oscillator */
  685. void rcu_osci_on(rcu_osci_type_enum osci);
  686. /* turn off the oscillator */
  687. void rcu_osci_off(rcu_osci_type_enum osci);
  688. /* enable the oscillator bypass mode */
  689. void rcu_osci_bypass_mode_enable(rcu_osci_type_enum osci);
  690. /* disable the oscillator bypass mode */
  691. void rcu_osci_bypass_mode_disable(rcu_osci_type_enum osci);
  692. /* enable the HXTAL clock monitor */
  693. void rcu_hxtal_clock_monitor_enable(void);
  694. /* disable the HXTAL clock monitor */
  695. void rcu_hxtal_clock_monitor_disable(void);
  696. /* set the IRC8M adjust value */
  697. void rcu_irc8m_adjust_value_set(uint8_t irc8m_adjval);
  698. /* set the IRC28M adjust value */
  699. void rcu_irc28m_adjust_value_set(uint8_t irc28m_adjval);
  700. /* unlock the voltage key */
  701. void rcu_voltage_key_unlock(void);
  702. /* set the deep sleep mode voltage */
  703. void rcu_deepsleep_voltage_set(uint32_t dsvol);
  704. /* get the system clock, bus and peripheral clock frequency */
  705. uint32_t rcu_clock_freq_get(rcu_clock_freq_enum clock);
  706. #endif /* GD32F3X0_RCU_H */