hal_rcc.h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329
  1. ////////////////////////////////////////////////////////////////////////////////
  2. /// @file hal_rcc.h
  3. /// @author AE TEAM
  4. /// @brief THIS FILE CONTAINS ALL THE FUNCTIONS PROTOTYPES FOR THE RCC
  5. /// FIRMWARE LIBRARY.
  6. ////////////////////////////////////////////////////////////////////////////////
  7. /// @attention
  8. ///
  9. /// THE EXISTING FIRMWARE IS ONLY FOR REFERENCE, WHICH IS DESIGNED TO PROVIDE
  10. /// CUSTOMERS WITH CODING INFORMATION ABOUT THEIR PRODUCTS SO THEY CAN SAVE
  11. /// TIME. THEREFORE, MINDMOTION SHALL NOT BE LIABLE FOR ANY DIRECT, INDIRECT OR
  12. /// CONSEQUENTIAL DAMAGES ABOUT ANY CLAIMS ARISING OUT OF THE CONTENT OF SUCH
  13. /// HARDWARE AND/OR THE USE OF THE CODING INFORMATION CONTAINED HEREIN IN
  14. /// CONNECTION WITH PRODUCTS MADE BY CUSTOMERS.
  15. ///
  16. /// <H2><CENTER>&COPY; COPYRIGHT MINDMOTION </CENTER></H2>
  17. ////////////////////////////////////////////////////////////////////////////////
  18. // Define to prevent recursive inclusion
  19. #ifndef __HAL_RCC_H
  20. #define __HAL_RCC_H
  21. // Files includes
  22. #include "types.h"
  23. #include "reg_common.h"
  24. #include "mm32_reg.h"
  25. ////////////////////////////////////////////////////////////////////////////////
  26. /// @addtogroup MM32_Hardware_Abstract_Layer
  27. /// @{
  28. ////////////////////////////////////////////////////////////////////////////////
  29. /// @defgroup RCC_HAL
  30. /// @brief RCC HAL modules
  31. /// @{
  32. ////////////////////////////////////////////////////////////////////////////////
  33. /// @defgroup RCC_Exported_Types
  34. /// @{
  35. ////////////////////////////////////////////////////////////////////////////////
  36. /// @defgroup RCC_Exported_Constants
  37. /// @{
  38. /// @}
  39. ////////////////////////////////////////////////////////////////////////////////
  40. /// @defgroup RCC_Exported_Enumeration
  41. /// @{
  42. ////////////////////////////////////////////////////////////////////////////////
  43. /// @brief HSE configuration
  44. ////////////////////////////////////////////////////////////////////////////////
  45. typedef enum {
  46. RCC_HSE_OFF = 0, // HSE OFF
  47. RCC_HSE_ON = RCC_CR_HSEON, // HSE ON
  48. RCC_HSE_Bypass = RCC_CR_HSEBYP // HSE Bypass
  49. } RCCHSE_TypeDef;
  50. ////////////////////////////////////////////////////////////////////////////////
  51. /// @brief Used for flags
  52. ////////////////////////////////////////////////////////////////////////////////
  53. typedef enum {
  54. CR_REG_INDEX = 1, //
  55. BDCR_REG_INDEX = 2, //
  56. CSR_REG_INDEX = 3, //
  57. RCC_FLAG_MASK = 0x1FU //
  58. } RCC_RegisterFlag_TypeDef;
  59. ////////////////////////////////////////////////////////////////////////////////
  60. /// @brief RCC Flag
  61. ////////////////////////////////////////////////////////////////////////////////
  62. typedef enum {
  63. // Flags in the CR register
  64. RCC_FLAG_HSIRDY = ((u8)((CR_REG_INDEX << 5U) | RCC_CR_HSIRDY_Pos)), ///< Internal High Speed clock ready flag
  65. RCC_FLAG_HSERDY = ((u8)((CR_REG_INDEX << 5U) | RCC_CR_HSERDY_Pos)), ///< External High Speed clock ready flag
  66. RCC_FLAG_PLLRDY = ((u8)((CR_REG_INDEX << 5U) | RCC_CR_PLLRDY_Pos)), ///< PLL clock ready flag
  67. // Flags in the CSR register
  68. RCC_FLAG_LSIRDY = ((u8)((CSR_REG_INDEX << 5U) | RCC_CSR_LSIRDY_Pos)), ///< Internal Low Speed oscillator Ready
  69. RCC_FLAG_PINRST = ((u8)((CSR_REG_INDEX << 5U) | RCC_CSR_PINRSTF_Pos)), ///< PIN reset flag
  70. RCC_FLAG_PORRST = ((u8)((CSR_REG_INDEX << 5U) | RCC_CSR_PORRSTF_Pos)), ///< POR/PDR reset flag
  71. RCC_FLAG_SFTRST = ((u8)((CSR_REG_INDEX << 5U) | RCC_CSR_SFTRSTF_Pos)), ///< Software Reset flag
  72. RCC_FLAG_IWDGRST = ((u8)((CSR_REG_INDEX << 5U) | RCC_CSR_IWDGRSTF_Pos)), ///< Independent Watchdog reset flag
  73. RCC_FLAG_WWDGRST = ((u8)((CSR_REG_INDEX << 5U) | RCC_CSR_WWDGRSTF_Pos)), ///< Window watchdog reset flag
  74. // Flags in the BDCR register
  75. RCC_FLAG_LSERDY = ((u8)((BDCR_REG_INDEX << 5U) | RCC_BDCR_LSERDY_Pos)) ///< External Low Speed oscillator Ready
  76. } RCC_FLAG_TypeDef;
  77. ////////////////////////////////////////////////////////////////////////////////
  78. /// @brief System clock source
  79. ////////////////////////////////////////////////////////////////////////////////
  80. typedef enum {
  81. RCC_HSI = 0, // Set HSI as systemCLOCK
  82. RCC_HSE = 1, // Set HSE as systemCLOCK
  83. RCC_PLL = 2, // Set PLL as systemCLOCK
  84. RCC_LSI = 3 // Set LSI as systemCLOCK
  85. } SYSCLK_TypeDef;
  86. ////////////////////////////////////////////////////////////////////////////////
  87. /// @brief PLL entry clock source
  88. ////////////////////////////////////////////////////////////////////////////////
  89. typedef enum {
  90. RCC_HSI_Div4 = 0,
  91. RCC_HSI_Div = 0,
  92. RCC_HSE_Div1 = RCC_PLLCFGR_PLLSRC,
  93. RCC_HSE_Div2 = (RCC_PLLCFGR_PLLXTPRE | RCC_PLLCFGR_PLLSRC),
  94. } RCC_PLLSource_TypeDef;
  95. ////////////////////////////////////////////////////////////////////////////////
  96. /// @brief PLL multiplication factor
  97. ////////////////////////////////////////////////////////////////////////////////
  98. typedef enum {
  99. RCC_PLLMul_2 = 0x00000000U,
  100. RCC_PLLMul_3 = 0x00040000U,
  101. RCC_PLLMul_4 = 0x00080000U,
  102. RCC_PLLMul_5 = 0x000C0000U,
  103. RCC_PLLMul_6 = 0x00100000U,
  104. RCC_PLLMul_7 = 0x00140000U,
  105. RCC_PLLMul_8 = 0x00180000U,
  106. RCC_PLLMul_9 = 0x001C0000U,
  107. RCC_PLLMul_10 = 0x00200000U,
  108. RCC_PLLMul_11 = 0x00240000U,
  109. RCC_PLLMul_12 = 0x00280000U,
  110. RCC_PLLMul_13 = 0x002C0000U,
  111. RCC_PLLMul_14 = 0x00300000U,
  112. RCC_PLLMul_15 = 0x00340000U,
  113. RCC_PLLMul_16 = 0x00380000U
  114. } RCC_PLLMul_TypeDef;
  115. ////////////////////////////////////////////////////////////////////////////////
  116. /// @brief AHB clock source
  117. ////////////////////////////////////////////////////////////////////////////////
  118. typedef enum {
  119. RCC_SYSCLK_Div1 = RCC_CFGR_HPRE_DIV1,
  120. RCC_SYSCLK_Div2 = RCC_CFGR_HPRE_DIV2,
  121. RCC_SYSCLK_Div4 = RCC_CFGR_HPRE_DIV4,
  122. RCC_SYSCLK_Div8 = RCC_CFGR_HPRE_DIV8,
  123. RCC_SYSCLK_Div16 = RCC_CFGR_HPRE_DIV16,
  124. RCC_SYSCLK_Div64 = RCC_CFGR_HPRE_DIV64,
  125. RCC_SYSCLK_Div128 = RCC_CFGR_HPRE_DIV128,
  126. RCC_SYSCLK_Div256 = RCC_CFGR_HPRE_DIV256,
  127. RCC_SYSCLK_Div512 = RCC_CFGR_HPRE_DIV512
  128. } RCC_AHB_CLK_TypeDef;
  129. ////////////////////////////////////////////////////////////////////////////////
  130. /// @brief APB1 and APB2clock source
  131. ////////////////////////////////////////////////////////////////////////////////
  132. typedef enum {
  133. RCC_HCLK_Div1 = RCC_CFGR_PPRE1_DIV1,
  134. RCC_HCLK_Div2 = RCC_CFGR_PPRE1_DIV2,
  135. RCC_HCLK_Div4 = RCC_CFGR_PPRE1_DIV4,
  136. RCC_HCLK_Div8 = RCC_CFGR_PPRE1_DIV8,
  137. RCC_HCLK_Div16 = RCC_CFGR_PPRE1_DIV16
  138. } RCC_APB1_APB2_CLK_TypeDef;
  139. ////////////////////////////////////////////////////////////////////////////////
  140. /// @brief USB Device clock source
  141. ////////////////////////////////////////////////////////////////////////////////
  142. typedef enum {
  143. RCC_USBCLKSource_PLLCLK_Div1 = 0,
  144. RCC_USBCLKSource_PLLCLK_Div2 = 1,
  145. RCC_USBCLKSource_PLLCLK_Div3 = 2,
  146. RCC_USBCLKSource_PLLCLK_Div4 = 3
  147. } RCC_USBCLKSOURCE_TypeDef;
  148. ////////////////////////////////////////////////////////////////////////////////
  149. /// @brief ADC clock source
  150. ////////////////////////////////////////////////////////////////////////////////
  151. typedef enum {
  152. RCC_PCLK2_Div2 = (0x00000000),
  153. RCC_PCLK2_Div4 = (0x00004000),
  154. RCC_PCLK2_Div6 = (0x00008000),
  155. RCC_PCLK2_Div8 = (0x0000C000)
  156. } RCC_ADCCLKSOURCE_TypeDef;
  157. ////////////////////////////////////////////////////////////////////////////////
  158. /// @brief LSE configuration
  159. ////////////////////////////////////////////////////////////////////////////////
  160. typedef enum {
  161. RCC_LSE_OFF = 0, // LSE OFF
  162. RCC_LSE_ON = RCC_BDCR_LSEON, // LSE ON
  163. RCC_LSE_Bypass = RCC_BDCR_LSEBYP // LSE Bypass
  164. } RCC_LSE_TypeDef;
  165. ////////////////////////////////////////////////////////////////////////////////
  166. /// @brief RTC clock source
  167. ////////////////////////////////////////////////////////////////////////////////
  168. typedef enum {
  169. RCC_RTCCLKSource_LSE = RCC_BDCR_RTCSEL_LSE,
  170. RCC_RTCCLKSource_LSI = RCC_BDCR_RTCSEL_LSI,
  171. RCC_RTCCLKSource_HSE_Div128 = RCC_BDCR_RTCSEL_HSE
  172. } RCC_RTCCLKSOURCE_TypeDef;
  173. ////////////////////////////////////////////////////////////////////////////////
  174. /// @brief Clock source to output on MCO pin
  175. ////////////////////////////////////////////////////////////////////////////////
  176. typedef enum {
  177. RCC_MCO_NoClock = RCC_CFGR_MCO_NOCLOCK,
  178. RCC_MCO_LSI = RCC_CFGR_MCO_LSI,
  179. RCC_MCO_LSE = RCC_CFGR_MCO_LSE,
  180. RCC_MCO_SYSCLK = RCC_CFGR_MCO_SYSCLK,
  181. RCC_MCO_HSI = RCC_CFGR_MCO_HSI,
  182. RCC_MCO_HSE = RCC_CFGR_MCO_HSE,
  183. RCC_MCO_PLLCLK_Div2 = RCC_CFGR_MCO_PLL
  184. } RCC_MCO_TypeDef;
  185. ////////////////////////////////////////////////////////////////////////////////
  186. /// @brief RCC Interrupt source
  187. ////////////////////////////////////////////////////////////////////////////////
  188. typedef enum {
  189. RCC_IT_LSIRDY = RCC_CIR_LSIRDYF,
  190. RCC_IT_LSERDY = RCC_CIR_LSERDYF,
  191. RCC_IT_HSIRDY = RCC_CIR_HSIRDYF,
  192. RCC_IT_HSERDY = RCC_CIR_HSERDYF,
  193. RCC_IT_PLLRDY = RCC_CIR_PLLRDYF,
  194. RCC_IT_CSS = RCC_CIR_CSSF
  195. } RCC_IT_TypeDef;
  196. ////////////////////////////////////////////////////////////////////////////////
  197. /// @brief RCC clock frequency type definition
  198. ////////////////////////////////////////////////////////////////////////////////
  199. typedef struct {
  200. u32 SYSCLK_Frequency; ///< returns SYSCLK clock frequency.
  201. u32 HCLK_Frequency; ///< returns hclk clock frequency.
  202. u32 PCLK1_Frequency; ///< returns PCLK1 clock frequency.
  203. u32 PCLK2_Frequency; ///< returns PCLK2 clock frequency.
  204. u32 ADCCLK_Frequency; ///< returns ADCCLK clock frequency.
  205. } RCC_ClocksTypeDef;
  206. /// @}
  207. /// @}
  208. ////////////////////////////////////////////////////////////////////////////////
  209. /// @defgroup RCC_Exported_Variables
  210. /// @{
  211. #ifdef _HAL_RCC_C_
  212. #define GLOBAL
  213. #else
  214. #define GLOBAL extern
  215. #endif
  216. #undef GLOBAL
  217. /// @}
  218. ////////////////////////////////////////////////////////////////////////////////
  219. /// @defgroup RCC_Exported_Functions
  220. /// @{
  221. void RCC_DeInit(void);
  222. void RCC_HSEConfig(RCCHSE_TypeDef state);
  223. void RCC_HSICmd(FunctionalState state);
  224. void RCC_SYSCLKConfig(SYSCLK_TypeDef sys_clk_src);
  225. void RCC_PLLDMDNConfig(u32 plldn, u32 plldm);
  226. void RCC_PLLConfig(RCC_PLLSource_TypeDef pll_src, RCC_PLLMul_TypeDef pll_mul);
  227. void RCC_PLLCmd(FunctionalState state);
  228. void RCC_HCLKConfig(RCC_AHB_CLK_TypeDef sys_clk);
  229. void RCC_PCLK1Config(RCC_APB1_APB2_CLK_TypeDef hclk);
  230. void RCC_PCLK2Config(RCC_APB1_APB2_CLK_TypeDef hclk);
  231. void RCC_USBCLKConfig(RCC_USBCLKSOURCE_TypeDef usb_clk_src);
  232. void RCC_ADCCLKConfig(RCC_ADCCLKSOURCE_TypeDef pclk2);
  233. void RCC_LSICmd(FunctionalState state);
  234. void RCC_RTCCLKCmd(FunctionalState state);
  235. void RCC_LSEConfig(RCC_LSE_TypeDef state);
  236. void RCC_RTCCLKConfig(RCC_RTCCLKSOURCE_TypeDef rtc_clk_src);
  237. void RCC_BackupResetCmd(FunctionalState state);
  238. void RCC_GetClocksFreq(RCC_ClocksTypeDef* clk);
  239. void RCC_AHBPeriphClockCmd(u32 ahb_periph, FunctionalState state);
  240. void RCC_AHB2PeriphClockCmd(u32 ahb_periph, FunctionalState state);
  241. void RCC_AHB3PeriphClockCmd(u32 ahb_periph, FunctionalState state);
  242. void RCC_AHBPeriphResetCmd(u32 ahb_periph, FunctionalState state);
  243. void RCC_AHB2PeriphResetCmd(u32 ahb_periph, FunctionalState state);
  244. void RCC_AHB3PeriphResetCmd(u32 ahb_periph, FunctionalState state);
  245. void RCC_APB2PeriphClockCmd(u32 apb2_periph, FunctionalState state);
  246. void RCC_APB1PeriphClockCmd(u32 apb1_periph, FunctionalState state);
  247. void RCC_APB2PeriphResetCmd(u32 apb2_periph, FunctionalState state);
  248. void RCC_APB1PeriphResetCmd(u32 apb1_periph, FunctionalState state);
  249. void RCC_ClockSecuritySystemCmd(FunctionalState state);
  250. void RCC_MCOConfig(RCC_MCO_TypeDef mco_src);
  251. void RCC_ClearFlag(void);
  252. void RCC_ITConfig(RCC_IT_TypeDef it, FunctionalState state);
  253. void RCC_ClearITPendingBit(u8 it);
  254. u8 RCC_GetSYSCLKSource(void);
  255. u32 RCC_GetSysClockFreq(void);
  256. u32 RCC_GetHCLKFreq(void);
  257. u32 RCC_GetPCLK1Freq(void);
  258. u32 RCC_GetPCLK2Freq(void);
  259. FlagStatus RCC_GetFlagStatus(RCC_FLAG_TypeDef flag);
  260. ErrorStatus RCC_WaitForHSEStartUp(void);
  261. ErrorStatus RCC_WaitForFlagStartUp(RCC_FLAG_TypeDef flag);
  262. ITStatus RCC_GetITStatus(RCC_IT_TypeDef it);
  263. ////////////////////////////////////////////////////////////////////////////////
  264. // Extended function interface
  265. ////////////////////////////////////////////////////////////////////////////////
  266. //ErrorStatus exRCC_Init(RCCInitStruct_TypeDef* para);
  267. void exRCC_SystickDisable(void);
  268. void exRCC_SystickEnable(u32 sys_tick_period);
  269. void exRCC_APB1PeriphReset(u32 apb1_periph);
  270. void exRCC_APB2PeriphReset(u32 apb2_periph);
  271. void exRCC_BackupReset(void);
  272. void RCC_ADC_ClockCmd(ADC_TypeDef* peripheral, FunctionalState state);
  273. void RCC_GPIO_ClockCmd(GPIO_TypeDef* peripheral, FunctionalState state);
  274. /// @}
  275. /// @}
  276. /// @}
  277. ////////////////////////////////////////////////////////////////////////////////
  278. #endif // __HAL_RCC_H
  279. ////////////////////////////////////////////////////////////////////////////////