lib_clk.h 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  1. /**
  2. ******************************************************************************
  3. * @file lib_clk.c
  4. * @author Application Team
  5. * @version V1.1.0
  6. * @date 2019-10-28
  7. * @brief Clock library.
  8. ******************************************************************************
  9. * @attention
  10. *
  11. ******************************************************************************
  12. */
  13. #ifndef __LIB_CLK_H
  14. #define __LIB_CLK_H
  15. #ifdef __cplusplus
  16. extern "C" {
  17. #endif
  18. #include "target.h"
  19. /* PLLL Configure */
  20. typedef struct
  21. {
  22. uint32_t Source;
  23. uint32_t State;
  24. uint32_t Frequency;
  25. } PLLL_ConfTypeDef;
  26. /* PLLH Configure */
  27. typedef struct
  28. {
  29. uint32_t Source;
  30. uint32_t State;
  31. uint32_t Frequency;
  32. } PLLH_ConfTypeDef;
  33. /* RCH Configure */
  34. typedef struct
  35. {
  36. uint32_t State;
  37. } RCH_ConfTypeDef;
  38. /* XTALH Configure */
  39. typedef struct
  40. {
  41. uint32_t State;
  42. } XTALH_ConfTypeDef;
  43. /* RTCCLK Configure */
  44. typedef struct
  45. {
  46. uint32_t Source;
  47. uint32_t Divider;
  48. } RTCCLK_ConfTypeDef;
  49. /* HCLK Configure */
  50. typedef struct
  51. {
  52. uint32_t Divider; /* 1 ~ 256 */
  53. } HCLK_ConfTypeDef;
  54. /* PCLK Configure */
  55. typedef struct
  56. {
  57. uint32_t Divider; /* 1 ~ 256 */
  58. } PCLK_ConfTypeDef;
  59. /* Clock Configure */
  60. typedef struct
  61. {
  62. uint32_t ClockType; /* The clock to be configured */
  63. uint32_t AHBSource;
  64. PLLL_ConfTypeDef PLLL;
  65. PLLH_ConfTypeDef PLLH;
  66. XTALH_ConfTypeDef XTALH;
  67. RTCCLK_ConfTypeDef RTCCLK;
  68. HCLK_ConfTypeDef HCLK;
  69. PCLK_ConfTypeDef PCLK;
  70. } CLK_InitTypeDef;
  71. /************** Bits definition for ANA_REG9 register ******************/
  72. #define ANA_REG9_PLLLSEL_26M (0x0U << ANA_REG9_PLLLSEL_Pos)
  73. #define ANA_REG9_PLLLSEL_13M (0x1U << ANA_REG9_PLLLSEL_Pos)
  74. #define ANA_REG9_PLLLSEL_6_5M (0x2U << ANA_REG9_PLLLSEL_Pos)
  75. #define ANA_REG9_PLLLSEL_3_2M (0x3U << ANA_REG9_PLLLSEL_Pos)
  76. #define ANA_REG9_PLLLSEL_1_6M (0x4U << ANA_REG9_PLLLSEL_Pos)
  77. #define ANA_REG9_PLLLSEL_800K (0x5U << ANA_REG9_PLLLSEL_Pos)
  78. #define ANA_REG9_PLLLSEL_400K (0x6U << ANA_REG9_PLLLSEL_Pos)
  79. #define ANA_REG9_PLLLSEL_200K (0x7U << ANA_REG9_PLLLSEL_Pos)
  80. #define ANA_REG9_PLLHSEL_X2 (0xCU << ANA_REG9_PLLHSEL_Pos)
  81. #define ANA_REG9_PLLHSEL_X2_5 (0xDU << ANA_REG9_PLLHSEL_Pos)
  82. #define ANA_REG9_PLLHSEL_X3 (0xEU << ANA_REG9_PLLHSEL_Pos)
  83. #define ANA_REG9_PLLHSEL_X3_5 (0xFU << ANA_REG9_PLLHSEL_Pos)
  84. #define ANA_REG9_PLLHSEL_X4 (0x0U << ANA_REG9_PLLHSEL_Pos)
  85. #define ANA_REG9_PLLHSEL_X4_5 (0x1U << ANA_REG9_PLLHSEL_Pos)
  86. #define ANA_REG9_PLLHSEL_X5 (0x2U << ANA_REG9_PLLHSEL_Pos)
  87. #define ANA_REG9_PLLHSEL_X5_5 (0x3U << ANA_REG9_PLLHSEL_Pos)
  88. #define ANA_REG9_PLLHSEL_X6 (0x4U << ANA_REG9_PLLHSEL_Pos)
  89. #define ANA_REG9_PLLHSEL_X6_5 (0x5U << ANA_REG9_PLLHSEL_Pos)
  90. #define ANA_REG9_PLLHSEL_X7 (0x6U << ANA_REG9_PLLHSEL_Pos)
  91. #define ANA_REG9_PLLHSEL_X7_5 (0x7U << ANA_REG9_PLLHSEL_Pos)
  92. /************** Bits definition for MISC2_CLKSEL register ******************/
  93. #define MISC2_CLKSEL_CLKSEL_RCOH (0x0U << MISC2_CLKSEL_CLKSEL_Pos) /*!< 0x00000000 */
  94. #define MISC2_CLKSEL_CLKSEL_XOH (0x1U << MISC2_CLKSEL_CLKSEL_Pos) /*!< 0x00000001 */
  95. #define MISC2_CLKSEL_CLKSEL_PLLH (0x2U << MISC2_CLKSEL_CLKSEL_Pos) /*!< 0x00000002 */
  96. #define MISC2_CLKSEL_CLKSEL_RTCCLK (0x3U << MISC2_CLKSEL_CLKSEL_Pos) /*!< 0x00000003 */
  97. #define MISC2_CLKSEL_CLKSEL_PLLL (0x4U << MISC2_CLKSEL_CLKSEL_Pos) /*!< 0x00000004 */
  98. /***** ClockType *****/
  99. #define CLK_TYPE_MSk (0xFFUL)
  100. #define CLK_TYPE_ALL CLK_TYPE_MSk
  101. #define CLK_TYPE_AHBSRC (0x01UL) /* AHB Clock source to configure */
  102. #define CLK_TYPE_PLLL (0x02UL) /* PLLL to configure */
  103. #define CLK_TYPE_PLLH (0x04UL) /* PLLH to configure */
  104. #define CLK_TYPE_XTALH (0x08UL) /* XTALH to configure */
  105. #define CLK_TYPE_RTCCLK (0x20UL) /* RTCCLK to configure */
  106. #define CLK_TYPE_HCLK (0x40UL) /* AHB Clock to configure */
  107. #define CLK_TYPE_PCLK (0x80UL) /* APB Clock to configure */
  108. /***** AHBSource *****/
  109. #define CLK_AHBSEL_6_5MRC (0x0U << MISC2_CLKSEL_CLKSEL_Pos)
  110. #define CLK_AHBSEL_6_5MXTAL (0x1U << MISC2_CLKSEL_CLKSEL_Pos)
  111. #define CLK_AHBSEL_HSPLL (0x2U << MISC2_CLKSEL_CLKSEL_Pos)
  112. #define CLK_AHBSEL_RTCCLK (0x3U << MISC2_CLKSEL_CLKSEL_Pos)
  113. #define CLK_AHBSEL_LSPLL (0x4U << MISC2_CLKSEL_CLKSEL_Pos)
  114. /***** PLLL_ConfTypeDef PLLL *****/
  115. /* PLLL.Source */
  116. #define CLK_PLLLSRC_RCL PMU_CONTROL_PLLL_SEL
  117. #define CLK_PLLLSRC_XTALL (0)
  118. /* PLLL.State */
  119. #define CLK_PLLL_ON ANA_REG3_PLLLPDN
  120. #define CLK_PLLL_OFF (0)
  121. /* PLLL.Frequency */
  122. #define CLK_PLLL_26_2144MHz ANA_REG9_PLLLSEL_26M
  123. #define CLK_PLLL_13_1072MHz ANA_REG9_PLLLSEL_13M
  124. #define CLK_PLLL_6_5536MHz ANA_REG9_PLLLSEL_6_5M
  125. #define CLK_PLLL_3_2768MHz ANA_REG9_PLLLSEL_3_2M
  126. #define CLK_PLLL_1_6384MHz ANA_REG9_PLLLSEL_1_6M
  127. #define CLK_PLLL_0_8192MHz ANA_REG9_PLLLSEL_800K
  128. #define CLK_PLLL_0_4096MHz ANA_REG9_PLLLSEL_400K
  129. #define CLK_PLLL_0_2048MHz ANA_REG9_PLLLSEL_200K
  130. /***** PLLH_ConfTypeDef PLLH *****/
  131. /* PLLH.Source */
  132. #define CLK_PLLHSRC_RCH (0)
  133. #define CLK_PLLHSRC_XTALH PMU_CONTROL_PLLH_SEL
  134. /* PLLH.State */
  135. #define CLK_PLLH_ON ANA_REG3_PLLHPDN
  136. #define CLK_PLLH_OFF (0)
  137. /* PLLH.Frequency */
  138. #define CLK_PLLH_13_1072MHz ANA_REG9_PLLHSEL_X2
  139. #define CLK_PLLH_16_384MHz ANA_REG9_PLLHSEL_X2_5
  140. #define CLK_PLLH_19_6608MHz ANA_REG9_PLLHSEL_X3
  141. #define CLK_PLLH_22_9376MHz ANA_REG9_PLLHSEL_X3_5
  142. #define CLK_PLLH_26_2144MHz ANA_REG9_PLLHSEL_X4
  143. #define CLK_PLLH_29_4912MHz ANA_REG9_PLLHSEL_X4_5
  144. #define CLK_PLLH_32_768MHz ANA_REG9_PLLHSEL_X5
  145. #define CLK_PLLH_36_0448MHz ANA_REG9_PLLHSEL_X5_5
  146. #define CLK_PLLH_39_3216MHz ANA_REG9_PLLHSEL_X6
  147. #define CLK_PLLH_42_5984MHz ANA_REG9_PLLHSEL_X6_5
  148. #define CLK_PLLH_45_8752MHz ANA_REG9_PLLHSEL_X7
  149. #define CLK_PLLH_49_152MHz ANA_REG9_PLLHSEL_X7_5
  150. /* XTALH_ConfTypeDef XTALH */
  151. /* XTALH.State */
  152. #define CLK_XTALH_ON ANA_REG3_XOHPDN
  153. #define CLK_XTALH_OFF (0)
  154. /* RTCCLK Configure */
  155. /* RTCCLK.Source */
  156. #define CLK_RTCCLKSRC_XTALL (0)
  157. #define CLK_RTCCLKSRC_RCL (PMU_CONTROL_RTCCLK_SEL)
  158. /* RTCCLK.Divider */
  159. #define CLK_RTCCLKDIV_1 (RTC_PSCA_PSCA_0)
  160. #define CLK_RTCCLKDIV_4 (RTC_PSCA_PSCA_1)
  161. //AHB Periphral
  162. #define CLK_AHBPERIPHRAL_DMA MISC2_HCLKEN_DMA
  163. #define CLK_AHBPERIPHRAL_GPIO MISC2_HCLKEN_GPIO
  164. #define CLK_AHBPERIPHRAL_LCD MISC2_HCLKEN_LCD
  165. #define CLK_AHBPERIPHRAL_CRYPT MISC2_HCLKEN_CRYPT
  166. #define CLK_AHBPERIPHRAL_ALL (MISC2_HCLKEN_DMA \
  167. |MISC2_HCLKEN_GPIO \
  168. |MISC2_HCLKEN_LCD \
  169. |MISC2_HCLKEN_CRYPT)
  170. //APB Periphral
  171. #define CLK_APBPERIPHRAL_DMA MISC2_PCLKEN_DMA
  172. #define CLK_APBPERIPHRAL_I2C MISC2_PCLKEN_I2C
  173. #define CLK_APBPERIPHRAL_SPI1 MISC2_PCLKEN_SPI1
  174. #define CLK_APBPERIPHRAL_UART0 MISC2_PCLKEN_UART0
  175. #define CLK_APBPERIPHRAL_UART1 MISC2_PCLKEN_UART1
  176. #define CLK_APBPERIPHRAL_UART2 MISC2_PCLKEN_UART2
  177. #define CLK_APBPERIPHRAL_UART3 MISC2_PCLKEN_UART3
  178. #define CLK_APBPERIPHRAL_UART4 MISC2_PCLKEN_UART4
  179. #define CLK_APBPERIPHRAL_UART5 MISC2_PCLKEN_UART5
  180. #define CLK_APBPERIPHRAL_ISO78160 MISC2_PCLKEN_ISO78160
  181. #define CLK_APBPERIPHRAL_ISO78161 MISC2_PCLKEN_ISO78161
  182. #define CLK_APBPERIPHRAL_TIMER MISC2_PCLKEN_TIMER
  183. #define CLK_APBPERIPHRAL_MISC MISC2_PCLKEN_MISC
  184. #define CLK_APBPERIPHRAL_MISC2 MISC2_PCLKEN_MISC2
  185. #define CLK_APBPERIPHRAL_PMU MISC2_PCLKEN_PMU
  186. #define CLK_APBPERIPHRAL_RTC MISC2_PCLKEN_RTC
  187. #define CLK_APBPERIPHRAL_ANA MISC2_PCLKEN_ANA
  188. #define CLK_APBPERIPHRAL_U32K0 MISC2_PCLKEN_U32K0
  189. #define CLK_APBPERIPHRAL_U32K1 MISC2_PCLKEN_U32K1
  190. #define CLK_APBPERIPHRAL_SPI2 MISC2_PCLKEN_SPI2
  191. #define CLK_APBPERIPHRAL_ALL (MISC2_PCLKEN_DMA \
  192. |MISC2_PCLKEN_I2C \
  193. |MISC2_PCLKEN_SPI1 \
  194. |MISC2_PCLKEN_UART0 \
  195. |MISC2_PCLKEN_UART1 \
  196. |MISC2_PCLKEN_UART2 \
  197. |MISC2_PCLKEN_UART3 \
  198. |MISC2_PCLKEN_UART4 \
  199. |MISC2_PCLKEN_UART5 \
  200. |MISC2_PCLKEN_ISO78160 \
  201. |MISC2_PCLKEN_ISO78161 \
  202. |MISC2_PCLKEN_TIMER \
  203. |MISC2_PCLKEN_MISC1 \
  204. |MISC2_PCLKEN_MISC2 \
  205. |MISC2_PCLKEN_PMU \
  206. |MISC2_PCLKEN_RTC \
  207. |MISC2_PCLKEN_ANA \
  208. |MISC2_PCLKEN_U32K0 \
  209. |MISC2_PCLKEN_U32K1 \
  210. |MISC2_PCLKEN_SPI2 \
  211. |MISC2_PCLKEN_SPI3)
  212. /***** PLLStatus (CLK_GetPLLLockStatus) *****/
  213. #define CLK_STATUS_LOCKL ANA_CMPOUT_LOCKL
  214. #define CLK_STATUS_LOCKH ANA_CMPOUT_LOCKH
  215. /* Private macros ------------------------------------------------------------*/
  216. #define IS_CLK_TYPE(__TYPE__) ((((__TYPE__) & CLK_TYPE_MSk) != 0UL) &&\
  217. (((__TYPE__) & ~CLK_TYPE_MSk) == 0UL))
  218. #define IS_CLK_AHBSRC(__AHBSRC__) (((__AHBSRC__) == CLK_AHBSEL_6_5MRC) ||\
  219. ((__AHBSRC__) == CLK_AHBSEL_6_5MXTAL) ||\
  220. ((__AHBSRC__) == CLK_AHBSEL_HSPLL) ||\
  221. ((__AHBSRC__) == CLK_AHBSEL_RTCCLK) ||\
  222. ((__AHBSRC__) == CLK_AHBSEL_LSPLL))
  223. #define IS_CLK_PLLLSRC(__PLLLSRC__) (((__PLLLSRC__) == CLK_PLLLSRC_RCL) ||\
  224. ((__PLLLSRC__) == CLK_PLLLSRC_XTALL))
  225. #define IS_CLK_PLLLSTA(__PLLLSTA__) (((__PLLLSTA__) == CLK_PLLL_ON) ||\
  226. ((__PLLLSTA__) == CLK_PLLL_OFF))
  227. #define IS_CLK_PLLLFRQ(__PLLLFRQ__) (((__PLLLFRQ__) == CLK_PLLL_26_2144MHz) ||\
  228. ((__PLLLFRQ__) == CLK_PLLL_13_1072MHz) ||\
  229. ((__PLLLFRQ__) == CLK_PLLL_6_5536MHz) ||\
  230. ((__PLLLFRQ__) == CLK_PLLL_3_2768MHz) ||\
  231. ((__PLLLFRQ__) == CLK_PLLL_1_6384MHz) ||\
  232. ((__PLLLFRQ__) == CLK_PLLL_0_8192MHz) ||\
  233. ((__PLLLFRQ__) == CLK_PLLL_0_4096MHz) ||\
  234. ((__PLLLFRQ__) == CLK_PLLL_0_2048MHz))
  235. #define IS_CLK_PLLHSRC(__PLLHSRC__) (((__PLLHSRC__) == CLK_PLLHSRC_RCH) ||\
  236. ((__PLLHSRC__) == CLK_PLLHSRC_XTALH))
  237. #define IS_CLK_PLLHSTA(__PLLHSTA__) (((__PLLHSTA__) == CLK_PLLH_ON) ||\
  238. ((__PLLHSTA__) == CLK_PLLH_OFF))
  239. #define IS_CLK_PLLHFRQ(__PLLHSRC__) (((__PLLHSRC__) == CLK_PLLH_13_1072MHz) ||\
  240. ((__PLLHSRC__) == CLK_PLLH_16_384MHz) ||\
  241. ((__PLLHSRC__) == CLK_PLLH_19_6608MHz) ||\
  242. ((__PLLHSRC__) == CLK_PLLH_22_9376MHz) ||\
  243. ((__PLLHSRC__) == CLK_PLLH_26_2144MHz) ||\
  244. ((__PLLHSRC__) == CLK_PLLH_29_4912MHz) ||\
  245. ((__PLLHSRC__) == CLK_PLLH_32_768MHz) ||\
  246. ((__PLLHSRC__) == CLK_PLLH_36_0448MHz) ||\
  247. ((__PLLHSRC__) == CLK_PLLH_39_3216MHz) ||\
  248. ((__PLLHSRC__) == CLK_PLLH_42_5984MHz) ||\
  249. ((__PLLHSRC__) == CLK_PLLH_45_8752MHz) ||\
  250. ((__PLLHSRC__) == CLK_PLLH_49_152MHz))
  251. #define IS_CLK_XTALHSTA(__XTALHSTA__) (((__XTALHSTA__) == CLK_XTALH_ON) ||\
  252. ((__XTALHSTA__) == CLK_XTALH_OFF))
  253. #define IS_CLK_RTCSRC(__RTCSRC__) (((__RTCSRC__) == CLK_RTCCLKSRC_XTALL) ||\
  254. ((__RTCSRC__) == CLK_RTCCLKSRC_RCL))
  255. #define IS_CLK_RTCDIV(__RTCDIV__) (((__RTCDIV__) == CLK_RTCCLKDIV_1) ||\
  256. ((__RTCDIV__) == CLK_RTCCLKDIV_4))
  257. #define IS_CLK_HCLKDIV(__HCLKDIV__) (((__HCLKDIV__) > 0UL) &&\
  258. ((__HCLKDIV__) < 257UL))
  259. #define IS_CLK_PCLKDIV(__PCLKDIV__) (((__PCLKDIV__) > 0UL) &&\
  260. ((__PCLKDIV__) < 257UL))
  261. #define IS_CLK_AHBPERIPHRAL(__AHBPERIPHRAL__) ((((__AHBPERIPHRAL__) & CLK_AHBPERIPHRAL_ALL) != 0UL) &&\
  262. (((__AHBPERIPHRAL__) & ~CLK_AHBPERIPHRAL_ALL) == 0UL))
  263. #define IS_CLK_APBPERIPHRAL(__APBPERIPHRAL__) ((((__APBPERIPHRAL__) & CLK_APBPERIPHRAL_ALL) != 0UL) &&\
  264. (((__APBPERIPHRAL__) & ~CLK_APBPERIPHRAL_ALL) == 0UL))
  265. #define IS_CLK_PLLLOCK(__PLLLOCK__) (((__PLLLOCK__) == ANA_CMPOUT_LOCKL) ||\
  266. ((__PLLLOCK__) == ANA_CMPOUT_LOCKH))
  267. /* Exported Functions ------------------------------------------------------- */
  268. /* CLK Exported Functions Group1:
  269. Initialization and functions ---------------*/
  270. void CLK_ClockConfig(CLK_InitTypeDef *CLK_ClkInitStruct);
  271. /* CLK Exported Functions Group2:
  272. Peripheral Control -------------------------*/
  273. void CLK_AHBPeriphralCmd(uint32_t Periphral, uint32_t NewState);
  274. void CLK_APBPeriphralCmd(uint32_t Periphral, uint32_t NewState);
  275. /* CLK Exported Functions Group3:
  276. Get clock/configuration information --------*/
  277. uint32_t CLK_GetHCLKFreq(void);
  278. uint32_t CLK_GetPCLKFreq(void);
  279. uint32_t CLK_GetPLLLFreq(void);
  280. void CLK_GetClockConfig(CLK_InitTypeDef *CLK_ClkInitStruct);
  281. uint8_t CLK_GetXTALHStatus(void);
  282. uint8_t CLK_GetXTALLStatus(void);
  283. uint8_t CLK_GetPLLLockStatus(uint32_t PLLStatus);
  284. #ifdef __cplusplus
  285. }
  286. #endif
  287. #endif /* __LIB_CLK_H */
  288. /*********************************** END OF FILE ******************************/