ciu32f003_std_rcc(3).h 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822
  1. /************************************************************************************************/
  2. /**
  3. * @file ciu32f003_std_rcc.h
  4. * @author MCU Ecosystem Development Team
  5. * @brief RCC STD库驱动头文件。
  6. * 提供RCC相关的STD库操作函数声明、数据类型以及常量的定义。
  7. *
  8. *
  9. **************************************************************************************************
  10. * @attention
  11. * Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
  12. *
  13. **************************************************************************************************
  14. */
  15. /*避免头文件重复引用*/
  16. #ifndef CIU32F003_STD_RCC_H
  17. #define CIU32F003_STD_RCC_H
  18. /************************************************************************************************/
  19. /**
  20. * @addtogroup CIU32F003_STD_Driver
  21. * @{
  22. */
  23. /**
  24. * @defgroup RCC RCC
  25. * @brief 复位和时钟控制器的STD库驱动
  26. * @{
  27. */
  28. /************************************************************************************************/
  29. #ifdef __cplusplus
  30. extern "C" {
  31. #endif
  32. /*------------------------------------------includes--------------------------------------------*/
  33. #include "ciu32f003_std_common.h"
  34. /*--------------------------------------------define--------------------------------------------*/
  35. /************************************************************************************************/
  36. /**
  37. * @defgroup RCC_Constants RCC Constants
  38. * @brief RCC常量定义及宏定义
  39. * @{
  40. *
  41. */
  42. /************************************************************************************************/
  43. /* 系统时钟源选择 */
  44. #define RCC_SYSCLK_SRC_RCHDIV6 RCC_CFG_SYSW_RCHDIV6 /**< 选择RCHDIV6作为系统时钟源 */
  45. #define RCC_SYSCLK_SRC_RCHDIV3 RCC_CFG_SYSW_RCHDIV3 /**< 选择RCHDIV3作为系统时钟源 */
  46. #define RCC_SYSCLK_SRC_RCH RCC_CFG_SYSW_RCH /**< 选择RCH作为系统时钟源 */
  47. #define RCC_SYSCLK_SRC_RCL RCC_CFG_SYSW_RCL /**< 选择RCL作为系统时钟源 */
  48. #define RCC_SYSCLK_SRC_EXTCLK RCC_CFG_SYSW_EXTCLK /**< 选择EXTCLK作为系统时钟源 */
  49. /* 系统时钟源状态定义 */
  50. #define RCC_SYSCLK_SRC_STATUS_RCHDIV6 RCC_CFG_SYSWS_RCHDIV6 /**< 系统时钟为RCHDIV6 */
  51. #define RCC_SYSCLK_SRC_STATUS_RCHDIV3 RCC_CFG_SYSWS_RCHDIV3 /**< 系统时钟为RCHDIV3 */
  52. #define RCC_SYSCLK_SRC_STATUS_RCH RCC_CFG_SYSWS_RCH /**< 系统时钟为RCH */
  53. #define RCC_SYSCLK_SRC_STATUS_RCL RCC_CFG_SYSWS_RCL /**< 系统时钟为RCL */
  54. #define RCC_SYSCLK_SRC_STATUS_EXTCLK RCC_CFG_SYSWS_EXTCLK /**< 系统时钟为EXTCLK */
  55. /* AHB时钟分频参数定义 */
  56. #define RCC_HCLK_DIV1 RCC_CFG_HPRE_1 /**< HCLK不分频 */
  57. #define RCC_HCLK_DIV2 RCC_CFG_HPRE_2 /**< HCLK分频因子 = 2 */
  58. #define RCC_HCLK_DIV4 RCC_CFG_HPRE_4 /**< HCLK分频因子 = 4 */
  59. #define RCC_HCLK_DIV8 RCC_CFG_HPRE_8 /**< HCLK分频因子 = 8 */
  60. #define RCC_HCLK_DIV16 RCC_CFG_HPRE_16 /**< HCLK分频因子 = 16 */
  61. #define RCC_HCLK_DIV32 RCC_CFG_HPRE_32 /**< HCLK分频因子 = 32 */
  62. #define RCC_HCLK_DIV64 RCC_CFG_HPRE_64 /**< HCLK分频因子 = 64 */
  63. #define RCC_HCLK_DIV128 RCC_CFG_HPRE_128 /**< HCLK分频因子 = 128 */
  64. /* APB时钟分频参数定义 */
  65. #define RCC_PCLK_DIV1 RCC_CFG_PPRE_1 /**< APB总线时钟不分频 */
  66. #define RCC_PCLK_DIV2 RCC_CFG_PPRE_2 /**< APB总线时钟分频因子 = 2 */
  67. #define RCC_PCLK_DIV4 RCC_CFG_PPRE_4 /**< APB总线时钟分频因子 = 4 */
  68. #define RCC_PCLK_DIV8 RCC_CFG_PPRE_8 /**< APB总线时钟分频因子 = 8 */
  69. #define RCC_PCLK_DIV16 RCC_CFG_PPRE_16 /**< APB总线时钟分频因子 = 16 */
  70. /* MCO时钟源参数定义 */
  71. #define RCC_MCO_SRC_DISABLE RCC_CFG_MCOSEL_DISABLE /**< MCO输出无效 */
  72. #define RCC_MCO_SRC_SYSCLK RCC_CFG_MCOSEL_SYSCLK /**< MCO选择SYSCLK输出 */
  73. #define RCC_MCO_SRC_RCHDIV6 RCC_CFG_MCOSEL_RCHDIV6 /**< MCO选择RCHDIV6输出 */
  74. #define RCC_MCO_SRC_EXTCLK RCC_CFG_MCOSEL_EXTCLK /**< MCO选择EXTCLK输出 */
  75. #define RCC_MCO_SRC_RCL RCC_CFG_MCOSEL_RCL /**< MCO选择RCL输出 */
  76. /* MCO时钟分频参数定义 */
  77. #define RCC_MCO_DIV1 RCC_CFG_MCOPRE_DIV1 /**< MCO不分频 */
  78. #define RCC_MCO_DIV2 RCC_CFG_MCOPRE_DIV2 /**< MCO分频因子 = 2 */
  79. #define RCC_MCO_DIV4 RCC_CFG_MCOPRE_DIV4 /**< MCO分频因子 = 4 */
  80. #define RCC_MCO_DIV8 RCC_CFG_MCOPRE_DIV8 /**< MCO分频因子 = 8 */
  81. #define RCC_MCO_DIV16 RCC_CFG_MCOPRE_DIV16 /**< MCO分频因子 = 16 */
  82. #define RCC_MCO_DIV32 RCC_CFG_MCOPRE_DIV32 /**< MCO分频因子 = 32 */
  83. #define RCC_MCO_DIV64 RCC_CFG_MCOPRE_DIV64 /**< MCO分频因子 = 64 */
  84. #define RCC_MCO_DIV128 RCC_CFG_MCOPRE_DIV128 /**< MCO分频因子 = 128 */
  85. /* RCC中断控制位定义 */
  86. #define RCC_INTERRUPT_RCL_READY RCC_IER_RCL_RDYIE /**< RCL Ready的中断控制位 */
  87. #define RCC_INTERRUPT_RCH_READY RCC_IER_RCH_RDYIE /**< RCH Ready的中断控制位 */
  88. /* RCC中断标志位定义 */
  89. #define RCC_FLAG_RCL_READY RCC_ISR_RCL_RDYF /**< RCL Ready的中断标志位 */
  90. #define RCC_FLAG_RCH_READY RCC_ISR_RCH_RDYF /**< RCH Ready的中断标志位 */
  91. /* RCC清除控制位定义 */
  92. #define RCC_CLEAR_RCL_READY RCC_ICR_RCL_RDYC /**< RCL Ready的清除控制位 */
  93. #define RCC_CLEAR_RCH_READY RCC_ICR_RCH_RDYC /**< RCH Ready的清除控制位 */
  94. /* IO端口时钟选择 */
  95. #define RCC_PERIPH_CLK_GPIOA RCC_IOPEN_GPIOAEN /**< GPIOA 时钟控制位 */
  96. #define RCC_PERIPH_CLK_GPIOB RCC_IOPEN_GPIOBEN /**< GPIOB 时钟控制位 */
  97. #define RCC_PERIPH_CLK_GPIOC RCC_IOPEN_GPIOCEN /**< GPIOC 时钟控制位 */
  98. /* IO端口复位选择 */
  99. #define RCC_PERIPH_RESET_GPIOA RCC_IOPRST_GPIOA_RST /**< GPIOA端口复位控制位 */
  100. #define RCC_PERIPH_RESET_GPIOB RCC_IOPRST_GPIOB_RST /**< GPIOB端口复位控制位 */
  101. #define RCC_PERIPH_RESET_GPIOC RCC_IOPRST_GPIOC_RST /**< GPIOC端口复位控制位 */
  102. /* AHB外设时钟选择 */
  103. #define RCC_PERIPH_CLK_CRC RCC_AHBEN_CRCEN /**< AHB外设CRC时钟控制位 */
  104. /* AHB外设复位选择 */
  105. #define RCC_PERIPH_RESET_CRC RCC_AHBRST_CRC_RST /**< AHB外设CRC复位控制位 */
  106. /* APB外设时钟选择 */
  107. #define RCC_PERIPH_CLK_TIM3 RCC_APBEN1_TIM3EN /**< APB外设TIM3时钟控制位 */
  108. #define RCC_PERIPH_CLK_UART2 RCC_APBEN1_UART2EN /**< APB外设UART2时钟控制位 */
  109. #define RCC_PERIPH_CLK_I2C1 RCC_APBEN1_I2C1EN /**< APB外设I2C1时钟控制位 */
  110. #define RCC_PERIPH_CLK_PMU RCC_APBEN1_PMUEN /**< APB外设PMU时钟控制位 */
  111. #define RCC_PERIPH_CLK_LPTIM1 RCC_APBEN1_LPTIM1EN /**< APB外设LPTIM1时钟控制位 */
  112. #define RCC_PERIPH_CLK_COMP RCC_APBEN2_COMPEN /**< APB外设COMP时钟控制位 */
  113. #define RCC_PERIPH_CLK_TIM1 RCC_APBEN2_TIM1EN /**< APB外设TIM1时钟控制位 */
  114. #define RCC_PERIPH_CLK_SPI1 RCC_APBEN2_SPI1EN /**< APB外设SPI1时钟控制位 */
  115. #define RCC_PERIPH_CLK_UART1 RCC_APBEN2_UART1EN /**< APB外设UART1时钟控制位 */
  116. #define RCC_PERIPH_CLK_ADC RCC_APBEN2_ADCEN /**< APB外设ADC时钟控制位 */
  117. #define RCC_PERIPH_CLK_DBG RCC_APBEN2_DBGEN /**< APB外设DBG时钟控制位 */
  118. /* APB外设复位选择 */
  119. #define RCC_PERIPH_RESET_TIM3 RCC_APBRST1_TIM3_RST /**< APB外设TIM3复位控制位 */
  120. #define RCC_PERIPH_RESET_UART2 RCC_APBRST1_UART2_RST /**< APB外设UART2复位控制位 */
  121. #define RCC_PERIPH_RESET_I2C1 RCC_APBRST1_I2C1_RST /**< APB外设I2C1复位控制位 */
  122. #define RCC_PERIPH_RESET_LPTIM1 RCC_APBRST1_LPTIM1_RST /**< APB外设LPTIM1复位控制位 */
  123. #define RCC_PERIPH_RESET_COMP RCC_APBRST2_COMP_RST /**< APB外设COMP复位制位 */
  124. #define RCC_PERIPH_RESET_TIM1 RCC_APBRST2_TIM1_RST /**< APB外设TIM1复位控制位 */
  125. #define RCC_PERIPH_RESET_SPI1 RCC_APBRST2_SPI1_RST /**< APB外设SPI1复位控制位 */
  126. #define RCC_PERIPH_RESET_UART1 RCC_APBRST2_UART1_RST /**< APB外设UART复位控制位 */
  127. #define RCC_PERIPH_RESET_ADC RCC_APBRST2_ADC_RST /**< APB外设ADC复位控制位 */
  128. #define RCC_PERIPH_RESET_DBG RCC_APBRST2_DBG_RST /**< APB外设DBG复位控制位 */
  129. /* LPTIM1异步时钟源选择 */
  130. #define RCC_LPTIM1_ASYNC_CLK_SRC_PCLK RCC_CLKSEL_LPTIM1_SEL_PCLK /**< PCLK时钟作为LPTIM1时钟 */
  131. #define RCC_LPTIM1_ASYNC_CLK_SRC_RCL RCC_CLKSEL_LPTIM1_SEL_RCL /**< RCL时钟作为LPTIM1时钟 */
  132. #define RCC_LPTIM1_ASYNC_CLK_SRC_MCO RCC_CLKSEL_LPTIM1_SEL_MCO /**< MCO时钟作为LPTIM1时钟 */
  133. /* COMP1异步时钟源选择 */
  134. #define RCC_COMP1_ASYNC_CLK_SRC_PCLK RCC_CLKSEL_COMP1_SEL_PCLK /**< PCLK时钟作为COMP1时钟 */
  135. #define RCC_COMP1_ASYNC_CLK_SRC_RCL RCC_CLKSEL_COMP1_SEL_RCL /**< RCL时钟作为COMP1时钟 */
  136. /* COMP2异步时钟源选择 */
  137. #define RCC_COMP2_ASYNC_CLK_SRC_PCLK RCC_CLKSEL_COMP2_SEL_PCLK /**< PCLK时钟作为COMP2时钟 */
  138. #define RCC_COMP2_ASYNC_CLK_SRC_RCL RCC_CLKSEL_COMP2_SEL_RCL /**< RCL时钟作为COMP2时钟 */
  139. /* 复位标志定义 */
  140. #define RCC_RESET_FLAG_LOCKUP RCC_CSR2_LOCKUP_RSTF /**< LOCKUP复位标志 */
  141. #define RCC_RESET_FLAG_NRST RCC_CSR2_NRST_RSTF /**< NRST引脚复位标志 */
  142. #define RCC_RESET_FLAG_PMU RCC_CSR2_PMU_RSTF /**< POR/PDR、BOR复位标志 */
  143. #define RCC_RESET_FLAG_SW RCC_CSR2_SW_RSTF /**< 软件复位标志 */
  144. #define RCC_RESET_FLAG_IWDG RCC_CSR2_IWDG_RSTF /**< IWDG复位标志 */
  145. #define RCC_RESET_FLAG_LPM RCC_CSR2_LPM_RSTF /**< 低功耗复位标志 */
  146. #define RCC_RESET_FLAG_ALL (0xFFUL<<RCC_CSR2_LOCKUP_RSTF_POS) /**< 所有复位标志 */
  147. /**
  148. * @}
  149. */
  150. /*-------------------------------------------functions------------------------------------------*/
  151. /************************************************************************************************/
  152. /**
  153. * @defgroup RCC_External_Functions RCC External Functions
  154. * @brief RCC对外函数
  155. * @{
  156. *
  157. */
  158. /************************************************************************************************/
  159. /**
  160. * @brief 使能RCH时钟
  161. * @note 使能RCH后,软件应等待RCHRDY标志置位后,再使用该时钟
  162. * @retval 无
  163. */
  164. __STATIC_INLINE void std_rcc_rch_enable(void)
  165. {
  166. RCC->CSR1 |= RCC_CSR1_RCHON;
  167. }
  168. /**
  169. * @brief 关闭RCH时钟
  170. * @note 如果RCH为系统时钟源,则其不能被停止。此时用户应先将系统时钟源切换为其他时钟,再关闭该时钟源
  171. * @note 当关闭RCH时,需等待RCHRDY标志清零
  172. * @retval 无
  173. */
  174. __STATIC_INLINE void std_rcc_rch_disable(void)
  175. {
  176. RCC->CSR1 &= (~RCC_CSR1_RCHON);
  177. }
  178. /**
  179. * @brief 获取RCH ready标志
  180. * @retval uint32_t 返回RCH RDY标志状态
  181. * @arg 非0: 表示RCH ready已置位
  182. * @arg 0:表示RCH ready未置位
  183. */
  184. __STATIC_INLINE uint32_t std_rcc_get_rch_ready(void)
  185. {
  186. return(RCC->CSR1 & RCC_CSR1_RCHRDY);
  187. }
  188. /**
  189. * @brief 设置系统时钟源
  190. * @param clocksource 系统时钟源
  191. * @arg RCC_SYSCLK_SRC_RCHDIV6
  192. * @arg RCC_SYSCLK_SRC_RCHDIV3
  193. * @arg RCC_SYSCLK_SRC_RCH
  194. * @arg RCC_SYSCLK_SRC_RCL
  195. * @arg RCC_SYSCLK_SRC_EXTCLK
  196. * @retval 无
  197. */
  198. __STATIC_INLINE void std_rcc_set_sysclk_source(uint32_t clocksource)
  199. {
  200. MODIFY_REG(RCC->CFG, RCC_CFG_SYSW, clocksource);
  201. }
  202. /**
  203. * @brief 获取系统时钟源信息
  204. * @retval uint32_t 系统时钟源
  205. * @arg RCC_SYSCLK_SRC_STATUS_RCHDIV6
  206. * @arg RCC_SYSCLK_SRC_STATUS_RCHDIV3
  207. * @arg RCC_SYSCLK_SRC_STATUS_RCH
  208. * @arg RCC_SYSCLK_SRC_STATUS_RCL
  209. * @arg RCC_SYSCLK_SRC_STATUS_EXTCLK
  210. */
  211. __STATIC_INLINE uint32_t std_rcc_get_sysclk_source(void)
  212. {
  213. return(RCC->CFG & RCC_CFG_SYSWS);
  214. }
  215. /**
  216. * @brief 设置AHB时钟分频因子
  217. * @param ahb_div AHB分频因子
  218. * @arg RCC_HCLK_DIV1
  219. * @arg RCC_HCLK_DIV2
  220. * @arg ...
  221. * @arg RCC_HCLK_DIV128
  222. * @retval 无
  223. */
  224. __STATIC_INLINE void std_rcc_set_ahbdiv(uint32_t ahb_div)
  225. {
  226. MODIFY_REG(RCC->CFG, RCC_CFG_HPRE, ahb_div);
  227. }
  228. /**
  229. * @brief 获取AHB时钟分频因子
  230. * @retval uint32_t HCLK时钟分频因子
  231. * @arg RCC_HCLK_DIV1
  232. * @arg RCC_HCLK_DIV2
  233. * @arg ...
  234. * @arg RCC_HCLK_DIV128
  235. */
  236. __STATIC_INLINE uint32_t std_rcc_get_ahbdiv(void)
  237. {
  238. return(RCC->CFG & RCC_CFG_HPRE);
  239. }
  240. /**
  241. * @brief 设置APB时钟分频因子
  242. * @param apb_div APB分频因子
  243. * @arg RCC_PCLK_DIV1
  244. * @arg RCC_PCLK_DIV2
  245. * @arg ...
  246. * @arg RCC_PCLK_DIV16
  247. * @retval 无
  248. */
  249. __STATIC_INLINE void std_rcc_set_apbdiv(uint32_t apb_div)
  250. {
  251. MODIFY_REG(RCC->CFG, RCC_CFG_PPRE, apb_div);
  252. }
  253. /**
  254. * @brief 获取APB时钟分频因子
  255. * @retval uint32_t PCLK1时钟分频因子
  256. * @arg RCC_PCLK_DIV1
  257. * @arg RCC_PCLK_DIV2
  258. * @arg ...
  259. * @arg RCC_PCLK_DIV16
  260. */
  261. __STATIC_INLINE uint32_t std_rcc_get_apbdiv(void)
  262. {
  263. return(RCC->CFG & RCC_CFG_PPRE);
  264. }
  265. /**
  266. * @brief 配置MCO输出信息
  267. * @param mco_source MCO输出源选择
  268. * @arg RCC_MCO_SRC_SYSCLK
  269. * @arg RCC_MCO_SRC_RCHDIV6
  270. * @arg RCC_MCO_SRC_EXTCLK
  271. * @arg RCC_MCO_SRC_RCL
  272. * @param mco_psc MCO输出分频因子
  273. * @arg RCC_MCO_DIV1
  274. * @arg RCC_MCO_DIV2
  275. * @arg ...
  276. * @arg RCC_MCO_DIV128
  277. * @retval 无
  278. */
  279. __STATIC_INLINE void std_rcc_mco_config(uint32_t mco_source, uint32_t mco_psc)
  280. {
  281. MODIFY_REG(RCC->CFG, RCC_CFG_MCOSEL | RCC_CFG_MCOPRE, mco_source | mco_psc);
  282. }
  283. /**
  284. * @brief 使能EXTCLK时钟
  285. * @retval 无
  286. */
  287. __STATIC_INLINE void std_rcc_extclk_enable(void)
  288. {
  289. RCC->CSR1 |= RCC_CSR1_EXTCLKON;
  290. }
  291. /**
  292. * @brief 关闭EXTCLK时钟
  293. * @retval 无
  294. */
  295. __STATIC_INLINE void std_rcc_extclk_disable(void)
  296. {
  297. RCC->CSR1 &= (~RCC_CSR1_EXTCLKON);
  298. }
  299. /**
  300. * @brief 使能RCC中断
  301. * @param interrupt 使能RCC中断源的信息
  302. * @arg RCC_INTERRUPT_RCL_READY
  303. * @arg RCC_INTERRUPT_RCH_READY
  304. * @retval 无
  305. */
  306. __STATIC_INLINE void std_rcc_interrupt_enable(uint32_t interrupt)
  307. {
  308. RCC->IER |= (interrupt);
  309. }
  310. /**
  311. * @brief 关闭RCC中断
  312. * @param interrupt 关闭RCC中断源的信息
  313. * @arg RCC_INTERRUPT_RCL_READY
  314. * @arg RCC_INTERRUPT_RCH_READY
  315. * @retval 无
  316. */
  317. __STATIC_INLINE void std_rcc_interrupt_disable(uint32_t interrupt)
  318. {
  319. RCC->IER &= (~(interrupt));
  320. }
  321. /**
  322. * @brief 获取RCC中断使能状态
  323. * @param interrupt RCC中断源信息
  324. * @arg RCC_INTERRUPT_RCL_READY
  325. * @arg RCC_INTERRUPT_RCH_READY
  326. * @retval uint32_t 返回输入中断标志置位状态
  327. * @arg 非0: 表示指定的中断处于使能状态
  328. * @arg 0:表示指定的中断处于禁止状态
  329. */
  330. __STATIC_INLINE uint32_t std_rcc_get_interrupt_enable(uint32_t interrupt)
  331. {
  332. return(RCC->IER & (interrupt));
  333. }
  334. /**
  335. * @brief 获取RCC中断标志状态
  336. * @param flag RCC中断标志信息
  337. * @arg RCC_FLAG_RCL_READY
  338. * @arg RCC_FLAG_RCH_READY
  339. * @retval uint32_t 返回输入中断标志置位状态
  340. * @arg 非0: 表示指定的中断已置位
  341. * @arg 0:表示指定的中断未置位
  342. */
  343. __STATIC_INLINE uint32_t std_rcc_get_flag(uint32_t flag)
  344. {
  345. return(RCC->ISR & (flag));
  346. }
  347. /**
  348. * @brief 清除RCC标志
  349. * @param flags 清除标志位
  350. * @arg RCC_CLEAR_RCL_READY
  351. * @arg RCC_CLEAR_RCH_READY
  352. * @retval 无
  353. */
  354. __STATIC_INLINE void std_rcc_clear_flag(uint32_t flags)
  355. {
  356. RCC->ICR = (flags);
  357. }
  358. /**
  359. * @brief 使能RCL时钟
  360. * @note 使能RCL后,软件应等待RCLRDY标志置位后,再使用该时钟
  361. * @retval 无
  362. */
  363. __STATIC_INLINE void std_rcc_rcl_enable(void)
  364. {
  365. RCC->CSR2 |= RCC_CSR2_RCLON;
  366. }
  367. /**
  368. * @brief 关闭RCL时钟
  369. * @note 如果RCL为系统时钟源,则其不能被停止。此时用户应先将系统时钟源切换为其他时钟,再关闭该时钟源
  370. * @note 当关闭RCL时,RCLRDY标志会在RCL关闭后自动清零
  371. * @retval 无
  372. */
  373. __STATIC_INLINE void std_rcc_rcl_disable(void)
  374. {
  375. RCC->CSR2 &= (~RCC_CSR2_RCLON);
  376. }
  377. /**
  378. * @brief 获取RCL ready标志
  379. * @retval uint32_t 返回RCL RDY标志状态
  380. * @arg 非0: 表示RCL ready已置位
  381. * @arg 0:表示RCL ready未置位
  382. */
  383. __STATIC_INLINE uint32_t std_rcc_get_rcl_ready(void)
  384. {
  385. return(RCC->CSR2 & RCC_CSR2_RCLRDY);
  386. }
  387. /**
  388. * @brief 获取复位标志
  389. * @param reset_flag 指定要获取的复位标志
  390. * @arg RCC_RESET_FLAG_LOCKUP
  391. * @arg RCC_RESET_FLAG_NRST
  392. * @arg RCC_RESET_FLAG_PMU
  393. * @arg RCC_RESET_FLAG_SW
  394. * @arg RCC_RESET_FLAG_IWDG
  395. * @arg RCC_RESET_FLAG_LPM
  396. * @arg RCC_RESET_FLAG_ALL
  397. * @retval uint32_t 返回状态标志
  398. * @arg 非0: 表示指定的复位标志已置位
  399. * @arg 0:表示指定的复位标志未置位
  400. */
  401. __STATIC_INLINE uint32_t std_rcc_get_reset_flag(uint32_t reset_flag)
  402. {
  403. return(RCC->CSR2 & (reset_flag));
  404. }
  405. /**
  406. * @brief 清除复位标志
  407. * @note 该函数将清除所有复位标志
  408. * @retval 无
  409. */
  410. __STATIC_INLINE void std_rcc_clear_reset_flags(void)
  411. {
  412. RCC->CSR2 |= RCC_CSR2_RMVF;
  413. }
  414. /**
  415. * @brief GPIO端口时钟使能
  416. * @param gpiox_clock 指定使能的GPIO时钟
  417. * @arg RCC_PERIPH_CLK_GPIOA
  418. * @arg RCC_PERIPH_CLK_GPIOB
  419. * @arg RCC_PERIPH_CLK_GPIOC
  420. * @retval 无
  421. */
  422. __STATIC_INLINE void std_rcc_gpio_clk_enable(uint32_t gpiox_clock)
  423. {
  424. RCC->IOPEN |= gpiox_clock;
  425. /* RCC外围时钟启用后的延迟 */
  426. __NOP(); __NOP(); __NOP();
  427. }
  428. /**
  429. * @brief GPIO端口时钟禁止
  430. * @param gpiox_clock 指定禁止的GPIO时钟
  431. * @arg RCC_PERIPH_CLK_GPIOA
  432. * @arg RCC_PERIPH_CLK_GPIOB
  433. * @arg RCC_PERIPH_CLK_GPIOC
  434. * @retval 无
  435. */
  436. __STATIC_INLINE void std_rcc_gpio_clk_disable(uint32_t gpiox_clock)
  437. {
  438. RCC->IOPEN &= (~(gpiox_clock));
  439. /* RCC外围时钟启用后的延迟 */
  440. __NOP(); __NOP(); __NOP();
  441. }
  442. /**
  443. * @brief GPIO端口复位
  444. * @param gpiox_rst 指定复位的GPIO端口
  445. * @arg RCC_PERIPH_RESET_GPIOA
  446. * @arg RCC_PERIPH_RESET_GPIOB
  447. * @arg RCC_PERIPH_RESET_GPIOC
  448. * @retval 无
  449. */
  450. __STATIC_INLINE void std_rcc_gpio_reset(uint32_t gpiox_rst)
  451. {
  452. RCC->IOPRST |= (gpiox_rst);
  453. RCC->IOPRST &= (~(gpiox_rst));
  454. }
  455. /**
  456. * @brief AHB外设时钟使能
  457. * @param periph_clock 指定使能的AHB外设时钟
  458. * @arg RCC_PERIPH_CLK_CRC
  459. * @retval 无
  460. */
  461. __STATIC_INLINE void std_rcc_ahb_clk_enable(uint32_t periph_clock)
  462. {
  463. RCC->AHBEN |= periph_clock;
  464. /* RCC外围时钟启用后的延迟 */
  465. __NOP(); __NOP(); __NOP();
  466. }
  467. /**
  468. * @brief AHB外设时钟禁止
  469. * @param periph_clock 指定禁止的AHB外设时钟
  470. * @arg RCC_PERIPH_CLK_CRC
  471. * @retval 无
  472. */
  473. __STATIC_INLINE void std_rcc_ahb_clk_disable(uint32_t periph_clock)
  474. {
  475. RCC->AHBEN &= (~(periph_clock));
  476. }
  477. /**
  478. * @brief AHB外设复位
  479. * @param periph_rst 指定复位的AHB外设
  480. * @arg RCC_PERIPH_RESET_CRC
  481. * @retval 无
  482. */
  483. __STATIC_INLINE void std_rcc_ahb_reset(uint32_t periph_rst)
  484. {
  485. RCC->AHBRST |= (periph_rst);
  486. RCC->AHBRST &= (~(periph_rst));
  487. }
  488. /**
  489. * @brief APB外设1时钟使能
  490. * @param periph_clock 指定使能的APB外设1时钟
  491. * @arg RCC_PERIPH_CLK_TIM3
  492. * @arg RCC_PERIPH_CLK_UART2
  493. * @arg RCC_PERIPH_CLK_I2C1
  494. * @arg RCC_PERIPH_CLK_PMU
  495. * @arg RCC_PERIPH_CLK_LPTIM1
  496. * @retval 无
  497. */
  498. __STATIC_INLINE void std_rcc_apb1_clk_enable(uint32_t periph_clock)
  499. {
  500. RCC->APBEN1 |= periph_clock;
  501. /* RCC外围时钟启用后的延迟 */
  502. __NOP(); __NOP(); __NOP();
  503. }
  504. /**
  505. * @brief APB外设1时钟禁止
  506. * @param periph_clock 指定禁止的APB外设1时钟
  507. * @arg RCC_PERIPH_CLK_TIM3
  508. * @arg RCC_PERIPH_CLK_UART2
  509. * @arg RCC_PERIPH_CLK_I2C1
  510. * @arg RCC_PERIPH_CLK_PMU
  511. * @arg RCC_PERIPH_CLK_LPTIM1
  512. * @retval 无
  513. */
  514. __STATIC_INLINE void std_rcc_apb1_clk_disable(uint32_t periph_clock)
  515. {
  516. RCC->APBEN1 &= (~(periph_clock));
  517. }
  518. /**
  519. * @brief APB外设1复位
  520. * @param periph_rst 指定复位的APB外设1
  521. * @arg RCC_PERIPH_RESET_TIM3
  522. * @arg RCC_PERIPH_RESET_UART2
  523. * @arg RCC_PERIPH_RESET_I2C1
  524. * @arg RCC_PERIPH_RESET_LPTIM1
  525. * @retval 无
  526. */
  527. __STATIC_INLINE void std_rcc_apb1_reset(uint32_t periph_rst)
  528. {
  529. RCC->APBRST1 |= (periph_rst);
  530. RCC->APBRST1 &= (~(periph_rst));
  531. }
  532. /**
  533. * @brief APB外设2时钟使能
  534. * @param periph_clock 指定使能的APB外设2时钟
  535. * @arg RCC_PERIPH_CLK_COMP
  536. * @arg RCC_PERIPH_CLK_TIM1
  537. * @arg RCC_PERIPH_CLK_SPI1
  538. * @arg RCC_PERIPH_CLK_UART1
  539. * @arg RCC_PERIPH_CLK_ADC
  540. * @arg RCC_PERIPH_CLK_DBG
  541. * @retval 无
  542. */
  543. __STATIC_INLINE void std_rcc_apb2_clk_enable(uint32_t periph_clock)
  544. {
  545. RCC->APBEN2 |= periph_clock;
  546. /* RCC外围时钟启用后的延迟 */
  547. __NOP(); __NOP(); __NOP();
  548. }
  549. /**
  550. * @brief APB外设2时钟禁止
  551. * @param periph_clock 指定禁止的APB外设2时钟
  552. * @arg RCC_PERIPH_CLK_COMP
  553. * @arg RCC_PERIPH_CLK_TIM1
  554. * @arg RCC_PERIPH_CLK_SPI1
  555. * @arg RCC_PERIPH_CLK_UART1
  556. * @arg RCC_PERIPH_CLK_ADC
  557. * @arg RCC_PERIPH_CLK_DBG
  558. * @retval 无
  559. */
  560. __STATIC_INLINE void std_rcc_apb2_clk_disable(uint32_t periph_clock)
  561. {
  562. RCC->APBEN2 &= (~(periph_clock));
  563. }
  564. /**
  565. * @brief APB外设2复位
  566. * @param periph_rst 指定复位的APB外设2
  567. * @arg RCC_PERIPH_RESET_COMP
  568. * @arg RCC_PERIPH_RESET_TIM1
  569. * @arg RCC_PERIPH_RESET_SPI1
  570. * @arg RCC_PERIPH_RESET_UART1
  571. * @arg RCC_PERIPH_RESET_ADC
  572. * @arg RCC_PERIPH_RESET_DBG
  573. * @retval 无
  574. */
  575. __STATIC_INLINE void std_rcc_apb2_reset(uint32_t periph_rst)
  576. {
  577. RCC->APBRST2 |= (periph_rst);
  578. RCC->APBRST2 &= (~(periph_rst));
  579. }
  580. /**
  581. * @brief 使能LOCKUP复位
  582. * @retval 无
  583. */
  584. __STATIC_INLINE void std_rcc_lockup_reset_enable(void)
  585. {
  586. RCC->CSR2 |= RCC_CSR2_LOCKUP_RSTEN;
  587. }
  588. /**
  589. * @brief 禁止LOCKUP复位
  590. * @retval 无
  591. */
  592. __STATIC_INLINE void std_rcc_lockup_reset_disable(void)
  593. {
  594. RCC->CSR2 &= (~RCC_CSR2_LOCKUP_RSTEN);
  595. }
  596. /**
  597. * @brief LPTIM1时钟源选择
  598. * @param lptim1clk_select LPTIM1时钟源
  599. * @arg RCC_LPTIM1_ASYNC_CLK_SRC_PCLK
  600. * @arg RCC_LPTIM1_ASYNC_CLK_SRC_RCL
  601. * @arg RCC_LPTIM1_ASYNC_CLK_SRC_MCO
  602. * @retval 无
  603. */
  604. __STATIC_INLINE void std_rcc_set_lptim1clk_source(uint32_t lptim1clk_select)
  605. {
  606. MODIFY_REG(RCC->CLKSEL, RCC_CLKSEL_LPTIM1_SEL, (lptim1clk_select));
  607. }
  608. /**
  609. * @brief 获取LPTIM1时钟源
  610. * @retval uint32_t 返回LPTIM1时钟源信息
  611. * @arg RCC_LPTIM1_ASYNC_CLK_SRC_PCLK1
  612. * @arg RCC_LPTIM1_ASYNC_CLK_SRC_RCL
  613. * @arg RCC_LPTIM1_ASYNC_CLK_SRC_MCO
  614. */
  615. __STATIC_INLINE uint32_t std_rcc_get_lptim1clk_source(void)
  616. {
  617. return(RCC->CLKSEL & RCC_CLKSEL_LPTIM1_SEL);
  618. }
  619. /**
  620. * @brief COMP1时钟源选择
  621. * @param comp1clk_select COMP1时钟源
  622. * @arg RCC_COMP1_ASYNC_CLK_SRC_PCLK
  623. * @arg RCC_COMP1_ASYNC_CLK_SRC_RCL
  624. * @retval 无
  625. */
  626. __STATIC_INLINE void std_rcc_set_comp1clk_source(uint32_t comp1clk_select)
  627. {
  628. MODIFY_REG(RCC->CLKSEL, RCC_CLKSEL_COMP1_SEL, (comp1clk_select));
  629. }
  630. /**
  631. * @brief 获取COMP1时钟源
  632. * @retval uint32_t 返回COMP1时钟源信息
  633. * @arg RCC_COMP1_ASYNC_CLK_SRC_PCLK
  634. * @arg RCC_COMP1_ASYNC_CLK_SRC_RCL
  635. */
  636. __STATIC_INLINE uint32_t std_rcc_get_comp1clk_source(void)
  637. {
  638. return(RCC->CLKSEL & RCC_CLKSEL_COMP1_SEL);
  639. }
  640. /**
  641. * @brief COMP2时钟源选择
  642. * @param comp2clk_select COMP2时钟源
  643. * @arg RCC_COMP2_ASYNC_CLK_SRC_PCLK
  644. * @arg RCC_COMP2_ASYNC_CLK_SRC_RCL
  645. * @retval 无
  646. */
  647. __STATIC_INLINE void std_rcc_set_comp2clk_source(uint32_t comp2clk_select)
  648. {
  649. MODIFY_REG(RCC->CLKSEL, RCC_CLKSEL_COMP2_SEL, (comp2clk_select));
  650. }
  651. /**
  652. * @brief 获取COMP2时钟源
  653. * @retval uint32_t 返回COMP2时钟源信息
  654. * @arg RCC_COMP2_ASYNC_CLK_SRC_PCLK
  655. * @arg RCC_COMP2_ASYNC_CLK_SRC_RCL
  656. */
  657. __STATIC_INLINE uint32_t std_rcc_get_comp2clk_source(void)
  658. {
  659. return(RCC->CLKSEL & RCC_CLKSEL_COMP2_SEL);
  660. }
  661. /**
  662. * @brief 写RCL校准值
  663. * @param cal_value RCL校准值
  664. * @retval 无
  665. */
  666. __STATIC_INLINE void std_rcc_write_rcl_calibration(uint32_t cal_value)
  667. {
  668. RCC->RCLCAL = cal_value;
  669. }
  670. /**
  671. * @brief 读取RCL校准值
  672. * @retval uint32_t RCL校准值
  673. */
  674. __STATIC_INLINE uint32_t std_rcc_read_rcl_calibration(void)
  675. {
  676. return(RCC->RCLCAL);
  677. }
  678. /**
  679. * @brief 写RCH时钟粗调值
  680. * @param cal_value RCH时钟粗调值
  681. * @retval 无
  682. */
  683. __STATIC_INLINE void std_rcc_write_rch_coarse_calibration(uint32_t cal_value)
  684. {
  685. MODIFY_REG(RCC->RCHCAL, RCC_RCHCAL_RCH_CAL_COARSE, cal_value << RCC_RCHCAL_RCH_CAL_COARSE_POS);
  686. }
  687. /**
  688. * @brief 读取RCH时钟粗调值
  689. * @retval uint32_t RCH时钟粗调值
  690. */
  691. __STATIC_INLINE uint32_t std_rcc_read_rch_coarse_calibration(void)
  692. {
  693. return((RCC->RCHCAL & RCC_RCHCAL_RCH_CAL_COARSE) >> RCC_RCHCAL_RCH_CAL_COARSE_POS);
  694. }
  695. /**
  696. * @brief 写RCH时钟微调值
  697. * @param trim_value RCH时钟微调值
  698. * @retval 无
  699. */
  700. __STATIC_INLINE void std_rcc_write_rch_fine_calibration(uint32_t trim_value)
  701. {
  702. MODIFY_REG(RCC->RCHCAL, RCC_RCHCAL_RCH_CAL_FINE, trim_value);
  703. }
  704. /**
  705. * @brief 读取RCH时钟微调值
  706. * @retval uint32_t RCH时钟微调值
  707. */
  708. __STATIC_INLINE uint32_t std_rcc_read_rch_fine_calibration(void)
  709. {
  710. return(RCC->RCHCAL & RCC_RCHCAL_RCH_CAL_FINE);
  711. }
  712. /* 获取时钟频率函数 */
  713. uint32_t std_rcc_get_sysclkfreq(void);
  714. uint32_t std_rcc_get_hclkfreq(void);
  715. uint32_t std_rcc_get_pclkfreq(void);
  716. /**
  717. * @}
  718. */
  719. #ifdef __cplusplus
  720. }
  721. #endif
  722. /**
  723. * @}
  724. */
  725. /**
  726. * @}
  727. */
  728. #endif /* CIU32F003_STD_RCC_H */