lib_clk.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. /**
  2. ******************************************************************************
  3. * @file lib_clk.c
  4. * @author Application Team
  5. * @version V4.4.0
  6. * @date 2018-09-27
  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. /***** ClockType *****/
  72. #define CLK_TYPE_Msk (0xFFUL)
  73. #define CLK_TYPE_ALL CLK_TYPE_Msk
  74. #define CLK_TYPE_AHBSRC (0x01UL) /* AHB Clock source to configure */
  75. #define CLK_TYPE_PLLL (0x02UL) /* PLLL to configure */
  76. #define CLK_TYPE_PLLH (0x04UL) /* PLLH to configure */
  77. #define CLK_TYPE_XTALH (0x08UL) /* XTALH to configure */
  78. #define CLK_TYPE_RTCCLK (0x20UL) /* RTCCLK to configure */
  79. #define CLK_TYPE_HCLK (0x40UL) /* AHB Clock to configure */
  80. #define CLK_TYPE_PCLK (0x80UL) /* APB Clock to configure */
  81. /***** AHBSource *****/
  82. #define CLK_AHBSEL_6_5MRC MISC2_CLKSEL_CLKSEL_RCOH
  83. #define CLK_AHBSEL_6_5MXTAL MISC2_CLKSEL_CLKSEL_XOH
  84. #define CLK_AHBSEL_HSPLL MISC2_CLKSEL_CLKSEL_PLLH
  85. #define CLK_AHBSEL_RTCCLK MISC2_CLKSEL_CLKSEL_RTCCLK
  86. #define CLK_AHBSEL_LSPLL MISC2_CLKSEL_CLKSEL_PLLL
  87. /***** PLLL_ConfTypeDef PLLL *****/
  88. /* PLLL.Source */
  89. #define CLK_PLLLSRC_RCL PMU_CONTROL_PLLL_SEL
  90. #define CLK_PLLLSRC_XTALL (0)
  91. /* PLLL.State */
  92. #define CLK_PLLL_ON ANA_REG3_PLLLPDN
  93. #define CLK_PLLL_OFF (0)
  94. /* PLLL.Frequency */
  95. #define CLK_PLLL_26_2144MHz ANA_REG9_PLLLSEL_26M
  96. #define CLK_PLLL_13_1072MHz ANA_REG9_PLLLSEL_13M
  97. #define CLK_PLLL_6_5536MHz ANA_REG9_PLLLSEL_6_5M
  98. #define CLK_PLLL_3_2768MHz ANA_REG9_PLLLSEL_3_2M
  99. #define CLK_PLLL_1_6384MHz ANA_REG9_PLLLSEL_1_6M
  100. #define CLK_PLLL_0_8192MHz ANA_REG9_PLLLSEL_800K
  101. #define CLK_PLLL_0_4096MHz ANA_REG9_PLLLSEL_400K
  102. #define CLK_PLLL_0_2048MHz ANA_REG9_PLLLSEL_200K
  103. /***** PLLH_ConfTypeDef PLLH *****/
  104. /* PLLH.Source */
  105. #define CLK_PLLHSRC_RCH (0)
  106. #define CLK_PLLHSRC_XTALH PMU_CONTROL_PLLH_SEL
  107. /* PLLH.State */
  108. #define CLK_PLLH_ON ANA_REG3_PLLHPDN
  109. #define CLK_PLLH_OFF (0)
  110. /* PLLH.Frequency */
  111. #define CLK_PLLH_13_1072MHz ANA_REG9_PLLHSEL_X2
  112. #define CLK_PLLH_16_384MHz ANA_REG9_PLLHSEL_X2_5
  113. #define CLK_PLLH_19_6608MHz ANA_REG9_PLLHSEL_X3
  114. #define CLK_PLLH_22_9376MHz ANA_REG9_PLLHSEL_X3_5
  115. #define CLK_PLLH_26_2144MHz ANA_REG9_PLLHSEL_X4
  116. #define CLK_PLLH_29_4912MHz ANA_REG9_PLLHSEL_X4_5
  117. #define CLK_PLLH_32_768MHz ANA_REG9_PLLHSEL_X5
  118. #define CLK_PLLH_36_0448MHz ANA_REG9_PLLHSEL_X5_5
  119. #define CLK_PLLH_39_3216MHz ANA_REG9_PLLHSEL_X6
  120. #define CLK_PLLH_42_5984MHz ANA_REG9_PLLHSEL_X6_5
  121. #define CLK_PLLH_45_8752MHz ANA_REG9_PLLHSEL_X7
  122. #define CLK_PLLH_49_152MHz ANA_REG9_PLLHSEL_X7_5
  123. /* XTALH_ConfTypeDef XTALH */
  124. /* XTALH.State */
  125. #define CLK_XTALH_ON ANA_REG3_XOHPDN
  126. #define CLK_XTALH_OFF (0)
  127. /* RTCCLK Configure */
  128. /* RTCCLK.Source */
  129. #define CLK_RTCCLKSRC_XTALL (0)
  130. #define CLK_RTCCLKSRC_RCL (PMU_CONTROL_RTCLK_SEL)
  131. /* RTCCLK.Divider */
  132. #define CLK_RTCCLKDIV_1 (RTC_PSCA_PSCA_0)
  133. #define CLK_RTCCLKDIV_4 (RTC_PSCA_PSCA_1)
  134. //AHB Periphral
  135. #define CLK_AHBPERIPHRAL_DMA MISC2_HCLKEN_DMA
  136. #define CLK_AHBPERIPHRAL_GPIO MISC2_HCLKEN_GPIO
  137. #define CLK_AHBPERIPHRAL_LCD MISC2_HCLKEN_LCD
  138. #define CLK_AHBPERIPHRAL_CRYPT MISC2_HCLKEN_CRYPT
  139. #define CLK_AHBPERIPHRAL_ALL (MISC2_HCLKEN_DMA \
  140. |MISC2_HCLKEN_GPIO \
  141. |MISC2_HCLKEN_LCD \
  142. |MISC2_HCLKEN_CRYPT)
  143. //APB Periphral
  144. #define CLK_APBPERIPHRAL_DMA MISC2_PCLKEN_DMA
  145. #define CLK_APBPERIPHRAL_I2C MISC2_PCLKEN_I2C
  146. #define CLK_APBPERIPHRAL_SPI1 MISC2_PCLKEN_SPI1
  147. #define CLK_APBPERIPHRAL_UART0 MISC2_PCLKEN_UART0
  148. #define CLK_APBPERIPHRAL_UART1 MISC2_PCLKEN_UART1
  149. #define CLK_APBPERIPHRAL_UART2 MISC2_PCLKEN_UART2
  150. #define CLK_APBPERIPHRAL_UART3 MISC2_PCLKEN_UART3
  151. #define CLK_APBPERIPHRAL_UART4 MISC2_PCLKEN_UART4
  152. #define CLK_APBPERIPHRAL_UART5 MISC2_PCLKEN_UART5
  153. #define CLK_APBPERIPHRAL_ISO78160 MISC2_PCLKEN_ISO78160
  154. #define CLK_APBPERIPHRAL_ISO78161 MISC2_PCLKEN_ISO78161
  155. #define CLK_APBPERIPHRAL_TIMER MISC2_PCLKEN_TIMER
  156. #define CLK_APBPERIPHRAL_MISC MISC2_PCLKEN_MISC
  157. #define CLK_APBPERIPHRAL_MISC2 MISC2_PCLKEN_MISC2
  158. #define CLK_APBPERIPHRAL_PMU MISC2_PCLKEN_PMU
  159. #define CLK_APBPERIPHRAL_RTC MISC2_PCLKEN_RTC
  160. #define CLK_APBPERIPHRAL_ANA MISC2_PCLKEN_ANA
  161. #define CLK_APBPERIPHRAL_U32K0 MISC2_PCLKEN_U32K0
  162. #define CLK_APBPERIPHRAL_U32K1 MISC2_PCLKEN_U32K1
  163. #define CLK_APBPERIPHRAL_SPI2 MISC2_PCLKEN_SPI2
  164. #define CLK_APBPERIPHRAL_ALL (MISC2_PCLKEN_DMA \
  165. |MISC2_PCLKEN_I2C \
  166. |MISC2_PCLKEN_SPI1 \
  167. |MISC2_PCLKEN_UART0 \
  168. |MISC2_PCLKEN_UART1 \
  169. |MISC2_PCLKEN_UART2 \
  170. |MISC2_PCLKEN_UART3 \
  171. |MISC2_PCLKEN_UART4 \
  172. |MISC2_PCLKEN_UART5 \
  173. |MISC2_PCLKEN_ISO78160 \
  174. |MISC2_PCLKEN_ISO78161 \
  175. |MISC2_PCLKEN_TIMER \
  176. |MISC2_PCLKEN_MISC \
  177. |MISC2_PCLKEN_MISC2 \
  178. |MISC2_PCLKEN_PMU \
  179. |MISC2_PCLKEN_RTC \
  180. |MISC2_PCLKEN_ANA \
  181. |MISC2_PCLKEN_U32K0 \
  182. |MISC2_PCLKEN_U32K1 \
  183. |MISC2_PCLKEN_SPI2)
  184. /***** PLLStatus (CLK_GetPLLLockStatus) *****/
  185. #define CLK_STATUS_LOCKL ANA_COMPOUT_LOCKL
  186. #define CLK_STATUS_LOCKH ANA_COMPOUT_LOCKH
  187. /* Private macros ------------------------------------------------------------*/
  188. #define IS_CLK_TYPE(__TYPE__) ((((__TYPE__) & CLK_TYPE_Msk) != 0UL) &&\
  189. (((__TYPE__) & ~CLK_TYPE_Msk) == 0UL))
  190. #define IS_CLK_AHBSRC(__AHBSRC__) (((__AHBSRC__) == CLK_AHBSEL_6_5MRC) ||\
  191. ((__AHBSRC__) == CLK_AHBSEL_6_5MXTAL) ||\
  192. ((__AHBSRC__) == CLK_AHBSEL_HSPLL) ||\
  193. ((__AHBSRC__) == CLK_AHBSEL_RTCCLK) ||\
  194. ((__AHBSRC__) == CLK_AHBSEL_LSPLL))
  195. #define IS_CLK_PLLLSRC(__PLLLSRC__) (((__PLLLSRC__) == CLK_PLLLSRC_RCL) ||\
  196. ((__PLLLSRC__) == CLK_PLLLSRC_XTALL))
  197. #define IS_CLK_PLLLSTA(__PLLLSTA__) (((__PLLLSTA__) == CLK_PLLL_ON) ||\
  198. ((__PLLLSTA__) == CLK_PLLL_OFF))
  199. #define IS_CLK_PLLLFRQ(__PLLLFRQ__) (((__PLLLFRQ__) == CLK_PLLL_26_2144MHz) ||\
  200. ((__PLLLFRQ__) == CLK_PLLL_13_1072MHz) ||\
  201. ((__PLLLFRQ__) == CLK_PLLL_6_5536MHz) ||\
  202. ((__PLLLFRQ__) == CLK_PLLL_3_2768MHz) ||\
  203. ((__PLLLFRQ__) == CLK_PLLL_1_6384MHz) ||\
  204. ((__PLLLFRQ__) == CLK_PLLL_0_8192MHz) ||\
  205. ((__PLLLFRQ__) == CLK_PLLL_0_4096MHz) ||\
  206. ((__PLLLFRQ__) == CLK_PLLL_0_2048MHz))
  207. #define IS_CLK_PLLHSRC(__PLLHSRC__) (((__PLLHSRC__) == CLK_PLLHSRC_RCH) ||\
  208. ((__PLLHSRC__) == CLK_PLLHSRC_XTALH))
  209. #define IS_CLK_PLLHSTA(__PLLHSTA__) (((__PLLHSTA__) == CLK_PLLH_ON) ||\
  210. ((__PLLHSTA__) == CLK_PLLH_OFF))
  211. #define IS_CLK_PLLHFRQ(__PLLHSRC__) (((__PLLHSRC__) == CLK_PLLH_13_1072MHz) ||\
  212. ((__PLLHSRC__) == CLK_PLLH_16_384MHz) ||\
  213. ((__PLLHSRC__) == CLK_PLLH_19_6608MHz) ||\
  214. ((__PLLHSRC__) == CLK_PLLH_22_9376MHz) ||\
  215. ((__PLLHSRC__) == CLK_PLLH_26_2144MHz) ||\
  216. ((__PLLHSRC__) == CLK_PLLH_29_4912MHz) ||\
  217. ((__PLLHSRC__) == CLK_PLLH_32_768MHz) ||\
  218. ((__PLLHSRC__) == CLK_PLLH_36_0448MHz) ||\
  219. ((__PLLHSRC__) == CLK_PLLH_39_3216MHz) ||\
  220. ((__PLLHSRC__) == CLK_PLLH_42_5984MHz) ||\
  221. ((__PLLHSRC__) == CLK_PLLH_45_8752MHz) ||\
  222. ((__PLLHSRC__) == CLK_PLLH_49_152MHz))
  223. #define IS_CLK_XTALHSTA(__XTALHSTA__) (((__XTALHSTA__) == CLK_XTALH_ON) ||\
  224. ((__XTALHSTA__) == CLK_XTALH_OFF))
  225. #define IS_CLK_RTCSRC(__RTCSRC__) (((__RTCSRC__) == CLK_RTCCLKSRC_XTALL) ||\
  226. ((__RTCSRC__) == CLK_RTCCLKSRC_RCL))
  227. #define IS_CLK_RTCDIV(__RTCDIV__) (((__RTCDIV__) == CLK_RTCCLKDIV_1) ||\
  228. ((__RTCDIV__) == CLK_RTCCLKDIV_4))
  229. #define IS_CLK_HCLKDIV(__HCLKDIV__) (((__HCLKDIV__) > 0UL) &&\
  230. ((__HCLKDIV__) < 257UL))
  231. #define IS_CLK_PCLKDIV(__PCLKDIV__) (((__PCLKDIV__) > 0UL) &&\
  232. ((__PCLKDIV__) < 257UL))
  233. #define IS_CLK_AHBPERIPHRAL(__AHBPERIPHRAL__) ((((__AHBPERIPHRAL__) & CLK_AHBPERIPHRAL_ALL) != 0UL) &&\
  234. (((__AHBPERIPHRAL__) & ~CLK_AHBPERIPHRAL_ALL) == 0UL))
  235. #define IS_CLK_APBPERIPHRAL(__APBPERIPHRAL__) ((((__APBPERIPHRAL__) & CLK_APBPERIPHRAL_ALL) != 0UL) &&\
  236. (((__APBPERIPHRAL__) & ~CLK_APBPERIPHRAL_ALL) == 0UL))
  237. #define IS_CLK_PLLLOCK(__PLLLOCK__) (((__PLLLOCK__) == ANA_COMPOUT_LOCKL) ||\
  238. ((__PLLLOCK__) == ANA_COMPOUT_LOCKH))
  239. /* Exported Functions ------------------------------------------------------- */
  240. /* CLK Exported Functions Group1:
  241. Initialization and functions ---------------*/
  242. void CLK_ClockConfig(CLK_InitTypeDef *CLK_ClkInitStruct);
  243. /* CLK Exported Functions Group2:
  244. Peripheral Control -------------------------*/
  245. void CLK_AHBPeriphralCmd(uint32_t Periphral, uint32_t NewState);
  246. void CLK_APBPeriphralCmd(uint32_t Periphral, uint32_t NewState);
  247. /* CLK Exported Functions Group3:
  248. Get clock/configuration information --------*/
  249. uint32_t CLK_GetHCLKFreq(void);
  250. uint32_t CLK_GetPCLKFreq(void);
  251. void CLK_GetClockConfig(CLK_InitTypeDef *CLK_ClkInitStruct);
  252. uint8_t CLK_GetXTALHStatus(void);
  253. uint8_t CLK_GetXTALLStatus(void);
  254. uint8_t CLK_GetPLLLockStatus(uint32_t PLLStatus);
  255. #ifdef __cplusplus
  256. }
  257. #endif
  258. #endif /* __LIB_CLK_H */
  259. /*********************************** END OF FILE ******************************/